X-Git-Url: http://git.indexdata.com/?p=yazpp-moved-to-github.git;a=blobdiff_plain;f=zoom%2Fzexcept.cpp;h=aeca4bc08df1ddbf437a71d9feff25c3e82ee792;hp=462767bd4a7c248217a09c117620917dad566a76;hb=HEAD;hpb=01126607d1b475f43b29548dbd98f199f8e9f57f diff --git a/zoom/zexcept.cpp b/zoom/zexcept.cpp index 462767b..aeca4bc 100644 --- a/zoom/zexcept.cpp +++ b/zoom/zexcept.cpp @@ -1,87 +1,115 @@ -// $Header: /home/cvsroot/yaz++/zoom/zexcept.cpp,v 1.8 2003-07-02 10:25:13 adam Exp $ - // Z39.50 Exception classes +#if HAVE_CONFIG_H +#include +#endif #include #include -#include // for strerror(), strlen(), strcpy() +#include // for strerror(), strlen(), strcpy() +#include #include "zoom.h" namespace ZOOM { exception::exception(int errcode) { - code = errcode; + code = errcode; } exception::~exception() { - // Nothing to do, but G++ requires this to be explicit anyway + // Nothing to do, but G++ requires this to be explicit anyway } int exception::errcode() const { - return code; + return code; } std::string exception::errmsg() const { - static char buf[40]; - sprintf(buf, "error #%d", code); - return buf; + char buf[40]; + sprintf(buf, "error #%d", code); + return buf; } systemException::systemException() : exception(errno){ - code = errno; + code = errno; } std::string systemException::errmsg() const { - return strerror(code); + // For thread safety on linux (and most unix systems), we need + // to use the reentrant version of the error translation + // function. Microsoft's strerror() is thread safe, since it + // returns a pointer to thread local storage. Unfortunately + // there several different reentrant versions. Here, we check + // for glibc, since we are using gcc. It appears at least the + // current version of gcc has strerror_r() available by + // default. + #ifdef __GLIBC__ + char buf[1024]; + // PJD: result not necessarily equal to buf + const char* result = strerror_r(code, buf, sizeof(buf)); + if (result != 0) + return result; + return exception::errmsg(); + #else + return strerror(code); + #endif } - + bib1Exception::bib1Exception(int errcode, const std::string &addinfo) : - exception(errcode), info(addinfo) { - std::cerr << "WARNING: made bib1Exception(" << errcode << "=" << - ZOOM_diag_str(errcode) << ", '" << addinfo << "')\n"; + exception(errcode), info(addinfo) { + // std::cerr << "WARNING: made bib1Exception(" << errcode << "=" << + // ZOOM_diag_str(errcode) << ", '" << addinfo << "')\n"; } bib1Exception::~bib1Exception() { - //fprintf(stderr, "deleting bib1Exception 0x%lx (%d, 0x%lx=%s)\n", - //(long) this, code, (long) info, info); - //delete info; - // ### Don't actually do the deletion for now. Exception - // reference semantics are too weird for me to grok so I'm - // doing The Wrong Thing in the knowledge that it will more - // or less work -- it just leaks memory. (Or does it?) + //fprintf(stderr, "deleting bib1Exception 0x%lx (%d, 0x%lx=%s)\n", + //(long) this, code, (long) info, info); + //delete info; + // ### Don't actually do the deletion for now. Exception + // reference semantics are too weird for me to grok so I'm + // doing The Wrong Thing in the knowledge that it will more + // or less work -- it just leaks memory. (Or does it?) } std::string bib1Exception::errmsg() const { - return ZOOM_diag_str(code); + return ZOOM_diag_str(code); } std::string bib1Exception::addinfo() const { - return info; + return info; } queryException::queryException(int qtype, const std::string &source) : - exception(qtype), q(source) {} + exception(qtype), q(source) {} queryException::~queryException() { - //delete q; // ### see comment on bib1Exception destructor + //delete q; // ### see comment on bib1Exception destructor } std::string queryException::errmsg() const { - switch (code) { - case PREFIX: return "bad prefix search"; - case CCL: return "bad CCL search"; - default: break; - } - return "bad search (unknown type)"; + switch (code) { + case PREFIX: return "bad prefix search"; + case CCL: return "bad CCL search"; + default: break; + } + return "bad search (unknown type)"; } std::string queryException::addinfo() const { - return q; + return q; } } +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +