[svn] gpgme - r1243 - in trunk: assuan gpgme

svn author wk cvs at cvs.gnupg.org
Thu Aug 2 16:59:33 CEST 2007


Author: wk
Date: 2007-08-02 16:59:01 +0200 (Thu, 02 Aug 2007)
New Revision: 1243

Modified:
   trunk/assuan/ChangeLog
   trunk/assuan/assuan-logging.c
   trunk/assuan/assuan-pipe-connect.c
   trunk/assuan/assuan.h
   trunk/gpgme/ChangeLog
   trunk/gpgme/debug.c
   trunk/gpgme/debug.h
   trunk/gpgme/gpgme.h
   trunk/gpgme/version.c
   trunk/gpgme/w32-glib-io.c
   trunk/gpgme/w32-io.c
Log:
Improved debug support: Assuan logging is now directed to the  gpgme debug
stream.
Create processes detached.


Modified: trunk/assuan/ChangeLog
===================================================================
--- trunk/assuan/ChangeLog	2007-07-17 12:42:42 UTC (rev 1242)
+++ trunk/assuan/ChangeLog	2007-08-02 14:59:01 UTC (rev 1243)
@@ -1,3 +1,11 @@
+2007-08-02  Werner Koch  <wk at g10code.com>
+
+	* assuan-pipe-connect.c (pipe_connect_w32): A bit more debug output.
+	(pipe_connect_w32): Use DETACHED_PROCESS flag.
+	* assuan-logging.c (log_level): New.  Use this to disable logging.
+	(assuan_set_assuan_log_level): New.
+	* assuan.h: Add prototype.
+
 2007-07-12  Werner Koch  <wk at g10code.com>
 
 	* assuan-handler.c (assuan_get_active_fds): Use get_osfhandle for

Modified: trunk/assuan/assuan-logging.c
===================================================================
--- trunk/assuan/assuan-logging.c	2007-07-17 12:42:42 UTC (rev 1242)
+++ trunk/assuan/assuan-logging.c	2007-08-02 14:59:01 UTC (rev 1243)
@@ -37,7 +37,24 @@
 static char prefix_buffer[80];
 static FILE *_assuan_log;
 static int full_logging;
+static int log_level = 1;  /* Defaults to logging enabled.  */
 
+
+/* Set the log level for general assuan commands.  0 is no logging at
+   all, 1 is the standard logging and the default. Higher leveles may
+   be defined in the future.  Passing a level of -1 will not change
+   the current log level.  Returns previosu log level.  */
+int
+assuan_set_assuan_log_level (int level)
+{
+  int old = log_level;
+
+  if (level != -1)
+    log_level = level;
+  return old;
+}
+
+
 void
 _assuan_set_default_log_stream (FILE *fp)
 {
@@ -105,6 +122,9 @@
   FILE *fp;
   const char *prf;
   int save_errno = errno;
+
+  if (!log_level)
+    return;
   
   fp = assuan_get_assuan_log_stream ();
   prf = assuan_get_assuan_log_prefix ();
@@ -128,6 +148,9 @@
   const unsigned char *s;
   int n;
 
+  if (!log_level)
+    return;
+
   for (n=length,s=buffer; n; n--, s++)
     if  ((!isascii (*s) || iscntrl (*s) || !isprint (*s)) && !(*s >= 0x80))
       break;
@@ -166,11 +189,16 @@
 _assuan_log_sanitized_string (const char *string)
 {
   const unsigned char *s = (const unsigned char *) string;
-  FILE *fp = assuan_get_assuan_log_stream ();
+  FILE *fp;
 
-  if (! *s)
+  if (!log_level)
     return;
 
+  if (!*s)
+    return;
+
+  fp = assuan_get_assuan_log_stream ();
+
 #ifdef HAVE_FLOCKFILE
   flockfile (fp);
 #endif

Modified: trunk/assuan/assuan-pipe-connect.c
===================================================================
--- trunk/assuan/assuan-pipe-connect.c	2007-07-17 12:42:42 UTC (rev 1242)
+++ trunk/assuan/assuan-pipe-connect.c	2007-08-02 14:59:01 UTC (rev 1243)
@@ -641,6 +641,9 @@
       w = h;
     }
 
+  _assuan_log_printf ("created pipe: read=%p%s, write=%p%s\n",
+                      r, for_write? " (inherit)":"",
+                      w, for_write? "":" (inherit)");
   filedes[0] = handle_to_fd (r);
   filedes[1] = handle_to_fd (w);
   return 0;
@@ -752,6 +755,7 @@
       nullfd = CreateFile ("nul", GENERIC_WRITE,
                            FILE_SHARE_READ | FILE_SHARE_WRITE,
                            NULL, OPEN_EXISTING, 0, NULL);
+      _assuan_log_printf ("created nul device, hd=%p\n", nullfd);
       if (nullfd == INVALID_HANDLE_VALUE)
         {
           _assuan_log_printf ("can't open `nul': %s\n", w32_strerror (-1));
@@ -772,14 +776,17 @@
   /* Note: We inherit all handles flagged as inheritable.  This seems
      to be a security flaw but there seems to be no way of selecting
      handles to inherit. */
-  /*   _assuan_log_printf ("CreateProcess, path=`%s' cmdline=`%s'\n", */
-  /*                       name, cmdline); */
+  _assuan_log_printf ("CreateProcess, path=`%s' cmdline=`%s'\n",
+                      name, cmdline);
+  _assuan_log_printf ("        stdin=%p stdout=%p stderr=%p\n",
+                      si.hStdInput, si.hStdOutput, si.hStdError);
   if (!CreateProcess (name,                 /* Program to start.  */
                       cmdline,              /* Command line arguments.  */
                       &sec_attr,            /* Process security attributes.  */
                       &sec_attr,            /* Thread security attributes.  */
                       TRUE,                 /* Inherit handles.  */
                       (CREATE_DEFAULT_ERROR_MODE
+                       | DETACHED_PROCESS
                        | GetPriorityClass (GetCurrentProcess ())
                        | CREATE_SUSPENDED), /* Creation flags.  */
                       NULL,                 /* Environment.  */
@@ -807,13 +814,15 @@
       nullfd = INVALID_HANDLE_VALUE;
     }
 
+  _assuan_log_printf ("closing handles %p and %p\n", 
+                      fd_to_handle (rp[1]), fd_to_handle (wp[0]) );
   CloseHandle (fd_to_handle (rp[1]));
   CloseHandle (fd_to_handle (wp[0]));
 
-  /*   _assuan_log_printf ("CreateProcess ready: hProcess=%p hThread=%p" */
-  /*                       " dwProcessID=%d dwThreadId=%d\n", */
-  /*                       pi.hProcess, pi.hThread, */
-  /*                       (int) pi.dwProcessId, (int) pi.dwThreadId); */
+  _assuan_log_printf ("CreateProcess ready: hProcess=%p hThread=%p"
+                      " dwProcessID=%d dwThreadId=%d\n",
+                      pi.hProcess, pi.hThread,
+                      (int) pi.dwProcessId, (int) pi.dwThreadId);
 
   ResumeThread (pi.hThread);
   CloseHandle (pi.hThread); 

Modified: trunk/assuan/assuan.h
===================================================================
--- trunk/assuan/assuan.h	2007-07-17 12:42:42 UTC (rev 1242)
+++ trunk/assuan/assuan.h	2007-08-02 14:59:01 UTC (rev 1243)
@@ -137,6 +137,7 @@
 #define assuan_sendfd _ASSUAN_PREFIX(assuan_sendfd)
 #define assuan_receivefd _ASSUAN_PREFIX(assuan_receivefd)
 #define assuan_set_malloc_hooks _ASSUAN_PREFIX(assuan_set_malloc_hooks)
+#define assuan_set_assuan_log_level _ASSUAN_PREFIX(assuan_set_assuan_log_level)
 #define assuan_set_log_stream _ASSUAN_PREFIX(assuan_set_log_stream)
 #define assuan_set_error _ASSUAN_PREFIX(assuan_set_error)
 #define assuan_set_pointer _ASSUAN_PREFIX(assuan_set_pointer)
@@ -532,6 +533,14 @@
 
 /*-- assuan-logging.c --*/
 
+/* Set the log level for general assuan commands.  0 is no logging at
+   all, 1 is the standard logging and the default. Higher leveles may
+   be defined in the future.  Passing a level of -1 will not change
+   the current log level.  Returns previous log level.  Note, that
+   this function is not thread-safe and should in general be used
+   right at startup. */
+int assuan_set_assuan_log_level (int level);
+
 /* Set the stream to which assuan should log message not associated
    with a context.  By default, this is stderr.  The default value
    will be changed when the first log stream is associated with a

Modified: trunk/gpgme/ChangeLog
===================================================================
--- trunk/gpgme/ChangeLog	2007-07-17 12:42:42 UTC (rev 1242)
+++ trunk/gpgme/ChangeLog	2007-08-02 14:59:01 UTC (rev 1243)
@@ -1,3 +1,15 @@
+2007-08-02  Werner Koch  <wk at g10code.com>
+
+	* w32-glib-io.c (_gpgme_io_spawn): Use DETACHED_PROCESS flag.
+	* w32-io.c (_gpgme_io_spawn): Ditto.
+	(_gpgme_io_write): Map ERROR_NO_DATA to EPIPE.
+	* debug.c (_gpgme_debug): Enable assuan logging.
+	(_gpgme_debug_subsystem_init): New.  * version.c
+	(do_subsystem_inits): Disable assuan logging and initialize de
+	debug system.
+	(gpgme_check_version): Do not trace before the subsystems are
+	initialized.
+
 2007-07-17  Marcus Brinkmann  <marcus at g10code.de>
 
 	* debug.c:;5B Include <errno.h> and "debug.h".
@@ -5394,7 +5406,7 @@
 	* data.c (gpgme_data_rewind): Allow to rewind data_type_none.
 
 
- Copyright 2001, 2002, 2003, 2004, 2005 g10 Code GmbH
+ Copyright 2001,2002,2003,2004,2005,2006,2007 g10 Code GmbH
 
  This file is free software; as a special exception the author gives
  unlimited permission to copy and/or distribute it, with or without

Modified: trunk/gpgme/debug.c
===================================================================
--- trunk/gpgme/debug.c	2007-07-17 12:42:42 UTC (rev 1242)
+++ trunk/gpgme/debug.c	2007-08-02 14:59:01 UTC (rev 1243)
@@ -16,8 +16,8 @@
    
    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., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
+   MA 02110-1301, USA.  */
 
 #if HAVE_CONFIG_H
 #include <config.h>
@@ -30,12 +30,16 @@
 #include <ctype.h>
 #include <errno.h>
 #ifndef HAVE_DOSISH_SYSTEM
-  #include <sys/types.h>
-  #include <sys/stat.h>
-  #include <fcntl.h>
+#  include <sys/types.h>
+#  include <sys/stat.h>
+#  include <fcntl.h>
 #endif
 #include <assert.h>
 
+#ifdef HAVE_ASSUAN_H
+#include "assuan.h"
+#endif
+
 #include "util.h"
 #include "sema.h"
 #include "debug.h"
@@ -138,11 +142,29 @@
         }
 
       if (debug_level > 0)
-	fprintf (errfp, "gpgme_debug: level=%d\n", debug_level);
+        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 (errfp);
+      assuan_set_assuan_log_level (debug_level >= 0? debug_level:0);
+#endif /* HAVE_ASSUAN_H*/
     }
   UNLOCK (debug_lock);
 }
 
+
+
+/* This should be called as soon as the locks are intialized.  It is
+   required so that the assuan logging gets conncted to the gpgme log
+   stream as early as possible.  */
+void
+_gpgme_debug_subsystem_init (void)
+{
+  debug_init ();
+}
+
+
+
 
 /* Log the formatted string FORMAT at debug level LEVEL or higher.  */
 void

Modified: trunk/gpgme/debug.h
===================================================================
--- trunk/gpgme/debug.h	2007-07-17 12:42:42 UTC (rev 1242)
+++ trunk/gpgme/debug.h	2007-08-02 14:59:01 UTC (rev 1243)
@@ -50,6 +50,9 @@
   return s? s+1:file;
 }
 
+/* Called early to initialize the logging.  */
+void _gpgme_debug_subsystem_init (void);
+
 /* Log the formatted string FORMAT at debug level LEVEL or higher.  */
 void _gpgme_debug (int level, const char *format, ...);
 

Modified: trunk/gpgme/gpgme.h
===================================================================
--- trunk/gpgme/gpgme.h	2007-07-17 12:42:42 UTC (rev 1242)
+++ trunk/gpgme/gpgme.h	2007-08-02 14:59:01 UTC (rev 1243)
@@ -16,8 +16,8 @@
    
    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., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
+   MA 02110-1301, USA.  */
 
 #ifndef GPGME_H
 #define GPGME_H

Modified: trunk/gpgme/version.c
===================================================================
--- trunk/gpgme/version.c	2007-07-17 12:42:42 UTC (rev 1242)
+++ trunk/gpgme/version.c	2007-08-02 14:59:01 UTC (rev 1243)
@@ -55,18 +55,20 @@
     return;
 
   _gpgme_sema_subsystem_init ();
-  _gpgme_io_subsystem_init ();
 #ifdef HAVE_ASSUAN_H
+  assuan_set_assuan_log_level (0);
   assuan_set_assuan_err_source (GPG_ERR_SOURCE_GPGME);
-#ifdef HAVE_W32_SYSTEM
+#endif /*HAVE_ASSUAN_H*/
+  _gpgme_debug_subsystem_init ();
+#if defined(HAVE_W32_SYSTEM) && defined(HAVE_ASSUAN_H)
+  _gpgme_io_subsystem_init ();
   /* We need to make sure that the sockets are initialized.  */
   {
     WSADATA wsadat;
     
     WSAStartup (0x202, &wsadat);
   }
-#endif /*HAVE_W32_SYSTEM*/
-#endif /*HAVE_ASSUAN_H*/
+#endif /*HAVE_W32_SYSTEM && HAVE_ASSUAN_H*/
 
   done = 1;
 }
@@ -170,10 +172,15 @@
 const char *
 gpgme_check_version (const char *req_version)
 {
+  do_subsystem_inits ();
+
+  /* Catch-22: We need to get at least the debug subsystem ready
+     before using the tarce facility.  If we won't the tarce would
+     automagically initialize the debug system with out the locks
+     being initialized and missing the assuan log level setting. */
   TRACE2 (DEBUG_INIT, "gpgme_check_version: ", 0,
 	  "req_version=%s, VERSION=%s", req_version, VERSION);
-
-  do_subsystem_inits ();
+ 
   return _gpgme_compare_versions (VERSION, req_version) ? VERSION : NULL;
 }
 

Modified: trunk/gpgme/w32-glib-io.c
===================================================================
--- trunk/gpgme/w32-glib-io.c	2007-07-17 12:42:42 UTC (rev 1242)
+++ trunk/gpgme/w32-glib-io.c	2007-08-02 14:59:01 UTC (rev 1243)
@@ -522,7 +522,8 @@
 	}
     }
   
-  cr_flags |= CREATE_SUSPENDED; 
+  cr_flags |= CREATE_SUSPENDED;
+  cr_flags |= DETACHED_PROCESS;
   if (!CreateProcessA (path,
 		       arg_string,
 		       &sec_attr,     /* process security attributes */

Modified: trunk/gpgme/w32-io.c
===================================================================
--- trunk/gpgme/w32-io.c	2007-07-17 12:42:42 UTC (rev 1242)
+++ trunk/gpgme/w32-io.c	2007-08-02 14:59:01 UTC (rev 1243)
@@ -752,7 +752,10 @@
   if (ctx->error)
     {
       UNLOCK (ctx->mutex);
-      errno = ctx->error_code;
+      if (ctx->error_code == ERROR_NO_DATA)
+        errno = EPIPE;
+      else
+        errno = EIO;
       return TRACE_SYSRES (-1);
     }
 
@@ -1104,6 +1107,7 @@
     }
   
   cr_flags |= CREATE_SUSPENDED; 
+  cr_flags |= DETACHED_PROCESS;
   if (!CreateProcessA (path,
 		       arg_string,
 		       &sec_attr,     /* process security attributes */




More information about the Gnupg-commits mailing list