Use AM_LDFLAGS instead of LDFLAGS
[yazpp-moved-to-github.git] / zoom / zexcept.cpp
index 04e6665..6a684f0 100644 (file)
@@ -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 <iostream>
 #include <errno.h>
 #include <string.h>            // for strerror(), strlen(), strcpy()
-#include <stdio.h>             // for sprintf()
+#include <stdio.h>
 #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;
     }
 }