doc: Fix documentation of struct data types
[gpgme.git] / src / debug.c
index c0e6155..ca0bb21 100644 (file)
@@ -1,22 +1,22 @@
 /* debug.c - helpful output in desperate situations
    Copyright (C) 2000 Werner Koch (dd9jn)
    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2009 g10 Code GmbH
+
    This file is part of GPGME.
 
    GPGME is free software; you can redistribute it and/or modify it
    under the terms of the GNU Lesser General Public License as
    published by the Free Software Foundation; either version 2.1 of
    the License, or (at your option) any later version.
-   
+
    GPGME is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.
-   
+
    You should have received a copy of the GNU Lesser General Public
    License along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
    MA 02110-1301, USA.  */
 
 #if HAVE_CONFIG_H
 #include <stdlib.h>
 #include <string.h>
 #include <stdarg.h>
-#include <unistd.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
 #include <ctype.h>
 #include <errno.h>
+#include <time.h>
 #ifndef HAVE_DOSISH_SYSTEM
+# ifdef HAVE_SYS_TYPES_H
 #  include <sys/types.h>
+# endif
+# ifdef HAVE_SYS_STAT_H
 #  include <sys/stat.h>
-#  include <fcntl.h>
+# endif
+# include <fcntl.h>
 #endif
 #include <assert.h>
 
-#ifdef HAVE_ASSUAN_H
-#include "assuan.h"
-#endif
-
 #include "util.h"
+#include "ath.h"
 #include "sema.h"
 #include "debug.h"
 
@@ -56,6 +60,34 @@ static int debug_level;
 /* The output stream for the debug messages.  */
 static FILE *errfp;
 
+/* If not NULL, this malloced string is used instead of the
+   GPGME_DEBUG envvar.  It must have been set before the debug
+   subsystem has been initialized.  Using it later may or may not have
+   any effect.  */
+static char *envvar_override;
+
+\f
+#ifdef HAVE_TLS
+#define FRAME_NR
+static __thread int frame_nr = 0;
+#endif
+
+void
+_gpgme_debug_frame_begin (void)
+{
+#ifdef FRAME_NR
+  frame_nr++;
+#endif
+}
+
+void _gpgme_debug_frame_end (void)
+{
+#ifdef FRAME_NR
+  frame_nr--;
+#endif
+}
+
+
 \f
 /* Remove leading and trailing white spaces.  */
 static char *
@@ -83,6 +115,19 @@ trim_spaces (char *str)
 }
 
 
+/* This is an internal function to set debug info.  The caller must
+   assure that this function is called only by one thread at a time.
+   The function may have no effect if called after the debug system
+   has been initialized.  Returns 0 on success.  */
+int
+_gpgme_debug_set_debug_envvar (const char *value)
+{
+  free (envvar_override);
+  envvar_override = strdup (value);
+  return !envvar_override;
+}
+
+
 static void
 debug_init (void)
 {
@@ -95,12 +140,25 @@ debug_init (void)
       char *e;
       const char *s1, *s2;;
 
-      err = _gpgme_getenv ("GPGME_DEBUG", &e);
-      if (err)
-       {
-         UNLOCK (debug_lock);
-         return;
-       }
+      if (envvar_override)
+        {
+          e = strdup (envvar_override);
+          free (envvar_override);
+          envvar_override = NULL;
+        }
+      else
+        {
+#ifdef HAVE_W32CE_SYSTEM
+          e = _gpgme_w32ce_get_debug_envvar ();
+#else /*!HAVE_W32CE_SYSTEM*/
+          err = _gpgme_getenv ("GPGME_DEBUG", &e);
+          if (err)
+            {
+              UNLOCK (debug_lock);
+              return;
+            }
+#endif /*!HAVE_W32CE_SYSTEM*/
+        }
 
       initialized = 1;
       errfp = stderr;
@@ -111,7 +169,11 @@ debug_init (void)
          if (s1)
            {
 #ifndef HAVE_DOSISH_SYSTEM
-             if (getuid () == geteuid ())
+             if (getuid () == geteuid ()
+#if defined(HAVE_GETGID) && defined(HAVE_GETEGID)
+                  && getgid () == getegid ()
+#endif
+                  )
                {
 #endif
                  char *p;
@@ -140,15 +202,11 @@ debug_init (void)
            }
          free (e);
         }
-
-      if (debug_level > 0)
-        fprintf (errfp, "gpgme_debug: level=%d\n", debug_level);
-#ifdef HAVE_ASSUAN_H
-      assuan_set_assuan_log_prefix ("gpgme-assuan");
-      assuan_set_assuan_log_stream (debug_level > 0 ? errfp : NULL);
-#endif /* HAVE_ASSUAN_H*/
     }
   UNLOCK (debug_lock);
+
+  if (debug_level > 0)
+    _gpgme_debug (DEBUG_INIT, "gpgme_debug: level=%d\n", debug_level);
 }
 
 
@@ -173,13 +231,40 @@ _gpgme_debug (int level, const char *format, ...)
   int saved_errno;
 
   saved_errno = errno;
-
-  debug_init ();
   if (debug_level < level)
     return;
-    
+
   va_start (arg_ptr, format);
   LOCK (debug_lock);
+  {
+#ifdef HAVE_W32CE_SYSTEM
+    SYSTEMTIME t;
+
+    GetLocalTime (&t);
+    fprintf (errfp, "GPGME %04d-%02d-%02d %02d:%02d:%02d <0x%04llx>  ",
+            t.wYear, t.wMonth, t.wDay,
+            t.wHour, t.wMinute, t.wSecond,
+            (unsigned long long) ath_self ());
+#else
+    struct tm *tp;
+    time_t atime = time (NULL);
+
+    tp = localtime (&atime);
+    fprintf (errfp, "GPGME %04d-%02d-%02d %02d:%02d:%02d <0x%04llx>  ",
+            1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday,
+            tp->tm_hour, tp->tm_min, tp->tm_sec,
+            (unsigned long long) ath_self ());
+#endif
+  }
+#ifdef FRAME_NR
+  {
+    int indent;
+
+    indent = frame_nr > 0? (2 * (frame_nr - 1)):0;
+    fprintf (errfp, "%*s", indent < 40? indent : 40, "");
+  }
+#endif
+
   vfprintf (errfp, format, arg_ptr);
   va_end (arg_ptr);
   if(format && *format && format[strlen (format) - 1] != '\n')
@@ -187,7 +272,7 @@ _gpgme_debug (int level, const char *format, ...)
   UNLOCK (debug_lock);
   fflush (errfp);
 
-  errno = saved_errno;
+  gpg_err_set_errno (saved_errno);
 }
 
 
@@ -199,7 +284,6 @@ _gpgme_debug_begin (void **line, int level, const char *format, ...)
   va_list arg_ptr;
   int res;
 
-  debug_init ();
   if (debug_level < level)
     {
       /* Disable logging of this line.  */
@@ -265,8 +349,7 @@ _gpgme_debug_end (void **line)
 
 void
 _gpgme_debug_buffer (int lvl, const char *const fmt,
-                    const char *const func, const char *const tagname,
-                    const void *const tag, const char *const buffer,
+                    const char *const func, const char *const buffer,
                     size_t len)
 {
   int idx = 0;
@@ -280,7 +363,7 @@ _gpgme_debug_buffer (int lvl, const char *const fmt,
       char str[51];
       char *strp = str;
       char *strp2 = &str[34];
-      
+
       for (j = 0; j < 16; j++)
        {
          unsigned char val;
@@ -302,6 +385,6 @@ _gpgme_debug_buffer (int lvl, const char *const fmt,
       *(strp++) = ' ';
       *(strp2) = '\0';
 
-      _gpgme_debug (lvl, fmt, func, tagname, tag, str);
+      _gpgme_debug (lvl, fmt, func, str);
     }
 }