X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=zoom%2Fzexcept.cpp;h=6a684f08009fabd70bbd6d1bfd7bea06d786e055;hb=9a7474140eb5aaaba2b50cbf8354eb3e5e2b813e;hp=04e666554fa729868e1699a5afe8c9553bd2dbf4;hpb=88e190489a5c483e5b860048aeebde41bf262962;p=yazpp-moved-to-github.git diff --git a/zoom/zexcept.cpp b/zoom/zexcept.cpp index 04e6665..6a684f0 100644 --- a/zoom/zexcept.cpp +++ b/zoom/zexcept.cpp @@ -1,10 +1,11 @@ -// $Header: /home/cvsroot/yaz++/zoom/zexcept.cpp,v 1.7 2002-11-30 22:33:21 mike Exp $ +// $Header: /home/cvsroot/yaz++/zoom/zexcept.cpp,v 1.10 2003-09-22 12:30:01 mike Exp $ // Z39.50 Exception classes +#include #include #include // for strerror(), strlen(), strcpy() -#include // for sprintf() +#include #include "zoom.h" @@ -21,8 +22,8 @@ namespace ZOOM { return code; } - string exception::errmsg() const { - static char buf[40]; + std::string exception::errmsg() const { + char buf[40]; sprintf(buf, "error #%d", code); return buf; } @@ -33,16 +34,33 @@ namespace ZOOM { code = errno; } - string systemException::errmsg() const { - return strerror(code); + std::string systemException::errmsg() const { + // 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 string &addinfo) : + bib1Exception::bib1Exception(int errcode, const std::string &addinfo) : exception(errcode), info(addinfo) { - cerr << "WARNING: made bib1Exception(" << errcode << "=" << - ZOOM_diag_str(errcode) << ", '" << addinfo << "')\n"; + // std::cerr << "WARNING: made bib1Exception(" << errcode << "=" << + // ZOOM_diag_str(errcode) << ", '" << addinfo << "')\n"; } bib1Exception::~bib1Exception() { @@ -55,24 +73,24 @@ namespace ZOOM { // or less work -- it just leaks memory. (Or does it?) } - string bib1Exception::errmsg() const { + std::string bib1Exception::errmsg() const { return ZOOM_diag_str(code); } - string bib1Exception::addinfo() const { + std::string bib1Exception::addinfo() const { return info; } - queryException::queryException(int qtype, const string &source) : + queryException::queryException(int qtype, const std::string &source) : exception(qtype), q(source) {} queryException::~queryException() { //delete q; // ### see comment on bib1Exception destructor } - string queryException::errmsg() const { + std::string queryException::errmsg() const { switch (code) { case PREFIX: return "bad prefix search"; case CCL: return "bad CCL search"; @@ -81,7 +99,7 @@ namespace ZOOM { return "bad search (unknown type)"; } - string queryException::addinfo() const { + std::string queryException::addinfo() const { return q; } }