]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/contrib/error.cc
use inttypes to avoid suprises with different type sizes
[apt.git] / apt-pkg / contrib / error.cc
index fbb6e463631e8058521aff6d81036816a736e028..7dad11689d59cfc2146ababe688a4ac432d12929 100644 (file)
@@ -18,6 +18,7 @@
 #include <iostream>
 #include <errno.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <unistd.h>
 
 #include <string>
@@ -92,13 +93,32 @@ bool GlobalError::DebugE(const char *Function,const char *Description,...) {
        return InsertErrno(DEBUG, Function, Description, args);
 }
                                                                        /*}}}*/
+// GlobalError::InsertErrno - Get part of the errortype string from errno/*{{{*/
+bool GlobalError::InsertErrno(MsgType const &type, const char *Function,
+                               const char *Description,...) {
+       va_list args;
+       va_start(args,Description);
+       return InsertErrno(type, Function, Description, args);
+}
+                                                                       /*}}}*/
 // GlobalError::InsertErrno - formats an error message with the errno  /*{{{*/
 bool GlobalError::InsertErrno(MsgType type, const char* Function,
                              const char* Description, va_list &args) {
-       char S[400];
-       snprintf(S, sizeof(S), "%s - %s (%i: %s)", Description,
-                Function, errno, strerror(errno));
-       return Insert(type, S, args);
+       int const errsv = errno;
+       char* S = (char*) malloc(400);
+       size_t const Ssize = snprintf(S, 400, "%s - %s (%i: %s)", Description,
+                                     Function, errsv, strerror(errsv)) + 1;
+
+       if (Ssize > 400) {
+               free(S);
+               S = (char*) malloc(Ssize);
+               snprintf(S, Ssize, "%s - %s (%i: %s)", Description,
+                        Function, errsv, strerror(errsv));
+       }
+
+       bool const geins = Insert(type, S, args);
+       free(S);
+       return geins;
 }
                                                                        /*}}}*/
 // GlobalError::Fatal - Add a fatal error to the list                  /*{{{*/
@@ -138,11 +158,25 @@ bool GlobalError::Debug(const char *Description,...)
        return Insert(DEBUG, Description, args);
 }
                                                                        /*}}}*/
+// GlobalError::Insert - Add a errotype message to the list            /*{{{*/
+bool GlobalError::Insert(MsgType const &type, const char *Description,...)
+{
+       va_list args;
+       va_start(args,Description);
+       return Insert(type, Description, args);
+}
+                                                                       /*}}}*/
 // GlobalError::Insert - Insert a new item at the end                  /*{{{*/
 bool GlobalError::Insert(MsgType type, const char* Description,
                         va_list &args) {
-       char S[400];
-       vsnprintf(S,sizeof(S),Description,args);
+       char* S = (char*) malloc(400);
+       size_t const Ssize = vsnprintf(S, 400, Description, args) + 1;
+
+       if (Ssize > 400) {
+               free(S);
+               S = (char*) malloc(Ssize);
+               vsnprintf(S, Ssize, Description, args);
+       }
 
        Item const m(S, type);
        Messages.push_back(m);
@@ -153,6 +187,7 @@ bool GlobalError::Insert(MsgType type, const char* Description,
        if (type == FATAL || type == DEBUG)
                std::clog << m << std::endl;
 
+       free(S);
        return false;
 }
                                                                        /*}}}*/
@@ -180,7 +215,7 @@ bool GlobalError::PopMessage(std::string &Text) {
 }
                                                                        /*}}}*/
 // GlobalError::DumpErrors - Dump all of the errors/warns to cerr      /*{{{*/
-void GlobalError::DumpErrors(std::ostream &out, MsgType const &trashhold,
+void GlobalError::DumpErrors(std::ostream &out, MsgType const &threshold,
                             bool const &mergeStack) {
        if (mergeStack == true)
                for (std::list<MsgStack>::const_reverse_iterator s = Stacks.rbegin();
@@ -189,7 +224,7 @@ void GlobalError::DumpErrors(std::ostream &out, MsgType const &trashhold,
 
        for (std::list<Item>::const_iterator m = Messages.begin();
             m != Messages.end(); m++)
-               if (m->Type >= trashhold)
+               if (m->Type >= threshold)
                        out << (*m) << std::endl;
        Discard();
 }