]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/contrib/error.cc
* methods/https.cc:
[apt.git] / apt-pkg / contrib / error.cc
index d31aaf1b1e702b0d9515344df43af0722781231c..5fe9bdfce6bccbc1dc1d3fe618bc2f24d7710d08 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: error.cc,v 1.3 1998/07/12 23:58:46 jgg Exp $
+// $Id: error.cc,v 1.11 2002/03/26 07:38:58 jgg Exp $
 /* ######################################################################
    
    Global Erorr Class - Global error mechanism
 #pragma implementation "apt-pkg/error.h"
 #endif 
 
+#include <apt-pkg/error.h>
+
+#include <iostream>
 #include <errno.h>
 #include <stdio.h>
-#include <string.h>
+#include <string>
 #include <stdarg.h>
+#include <unistd.h>
 
-#include <apt-pkg/error.h>
+#include "config.h"
                                                                        /*}}}*/
 
-GlobalError *_error = new GlobalError;
+using namespace std;
+
+// Global Error Object                                                 /*{{{*/
+/* If the implementation supports posix threads then the accessor function
+   is compiled to be thread safe otherwise a non-safe version is used. A
+   Per-Thread error object is maintained in much the same manner as libc
+   manages errno */
+#if defined(_POSIX_THREADS) && defined(HAVE_PTHREAD)
+ #include <pthread.h>
+
+ static pthread_key_t ErrorKey;
+ static void ErrorDestroy(void *Obj) {delete (GlobalError *)Obj;};
+ static void KeyAlloc() {pthread_key_create(&ErrorKey,ErrorDestroy);};
+
+ GlobalError *_GetErrorObj()
+ {
+    static pthread_once_t Once = PTHREAD_ONCE_INIT;
+    pthread_once(&Once,KeyAlloc);
+    
+    void *Res = pthread_getspecific(ErrorKey);
+    if (Res == 0)
+       pthread_setspecific(ErrorKey,Res = new GlobalError);
+    return (GlobalError *)Res;
+ }
+#else
+ GlobalError *_GetErrorObj()
+ {
+    static GlobalError *Obj = new GlobalError;
+    return Obj;
+ }
+#endif
+                                                                       /*}}}*/
 
 // GlobalError::GlobalError - Constructor                              /*{{{*/
 // ---------------------------------------------------------------------
@@ -49,8 +84,9 @@ bool GlobalError::Errno(const char *Function,const char *Description,...)
 
    // sprintf the description
    char S[400];
-   vsprintf(S,Description,args);
-   sprintf(S + strlen(S)," - %s (%i %s)",Function,errno,strerror(errno));
+   vsnprintf(S,sizeof(S),Description,args);
+   snprintf(S + strlen(S),sizeof(S) - strlen(S),
+           " - %s (%i %s)",Function,errno,strerror(errno));
 
    // Put it on the list
    Item *Itm = new Item;
@@ -60,6 +96,32 @@ bool GlobalError::Errno(const char *Function,const char *Description,...)
    
    PendingFlag = true;
 
+   return false;   
+}
+                                                                       /*}}}*/
+// GlobalError::WarningE - Get part of the warn string from errno      /*{{{*/
+// ---------------------------------------------------------------------
+/* Function indicates the stdlib function that failed and Description is
+   a user string that leads the text. Form is:
+     Description - Function (errno: strerror)
+   Carefull of the buffer overrun, sprintf.
+ */
+bool GlobalError::WarningE(const char *Function,const char *Description,...)
+{
+   va_list args;
+   va_start(args,Description);
+
+   // sprintf the description
+   char S[400];
+   vsnprintf(S,sizeof(S),Description,args);
+   snprintf(S + strlen(S),sizeof(S) - strlen(S)," - %s (%i %s)",Function,errno,strerror(errno));
+
+   // Put it on the list
+   Item *Itm = new Item;
+   Itm->Text = S;
+   Itm->Error = false;
+   Insert(Itm);
+   
    return false;   
 }
                                                                        /*}}}*/
@@ -73,7 +135,7 @@ bool GlobalError::Error(const char *Description,...)
 
    // sprintf the description
    char S[400];
-   vsprintf(S,Description,args);
+   vsnprintf(S,sizeof(S),Description,args);
 
    // Put it on the list
    Item *Itm = new Item;
@@ -96,7 +158,7 @@ bool GlobalError::Warning(const char *Description,...)
 
    // sprintf the description
    char S[400];
-   vsprintf(S,Description,args);
+   vsnprintf(S,sizeof(S),Description,args);
 
    // Put it on the list
    Item *Itm = new Item;