2009-11-05 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Thu, 5 Nov 2009 02:39:31 +0000 (02:39 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Thu, 5 Nov 2009 02:39:31 +0000 (02:39 +0000)
* priv-io.h (IOSPAWN_FLAG_NOCLOSE): New flag.
* w32-io.c (_gpgme_io_spawn): Implement this flag.
* posix-io.c (_gpgme_io_spawn): Likewise.
* w32-glib-io.c (_gpgme_io_spawn): Likewise.
* assuan-support.c (my_spawn): Set this flag.

src/ChangeLog
src/assuan-support.c
src/posix-io.c
src/priv-io.h
src/w32-glib-io.c
src/w32-io.c

index d5aebe3..0ea3a1c 100644 (file)
@@ -1,5 +1,11 @@
 2009-11-05  Marcus Brinkmann  <marcus@g10code.de>
 
+       * priv-io.h (IOSPAWN_FLAG_NOCLOSE): New flag.
+       * w32-io.c (_gpgme_io_spawn): Implement this flag.
+       * posix-io.c (_gpgme_io_spawn): Likewise.
+       * w32-glib-io.c (_gpgme_io_spawn): Likewise.
+       * assuan-support.c (my_spawn): Set this flag.
+
        * decrypt.c (gpgme_op_decrypt_start): Fix use of debug macro.
        * decrypt-verify.c (gpgme_op_decrypt_verify_start): Likewise.
        * delete.c (gpgme_op_delete_start): Likewise.
index b5d2548..4646416 100644 (file)
@@ -152,7 +152,7 @@ my_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name,
   fd_items[i].fd = -1;
   fd_items[i].dup_to = -1;
 
-  err = _gpgme_io_spawn (name, argv, 0, fd_items, r_pid);
+  err = _gpgme_io_spawn (name, argv, IOSPAWN_FLAG_NOCLOSE, fd_items, r_pid);
   if (! err)
     {
       i = 0;
index 1025268..b173f58 100644 (file)
@@ -454,7 +454,8 @@ _gpgme_io_spawn (const char *path, char *const argv[], unsigned int flags,
 
   for (i = 0; fd_list[i].fd != -1; i++)
     {
-      _gpgme_io_close (fd_list[i].fd);
+      if (! (flags & IOSPAWN_FLAG_NOCLOSE))
+       _gpgme_io_close (fd_list[i].fd);
       /* No handle translation.  */
       fd_list[i].peer_name = fd_list[i].fd;
     }
index 4eb2e36..a9fb02a 100644 (file)
@@ -68,6 +68,8 @@ int _gpgme_io_set_nonblocking (int fd);
 /* A flag to tell the spawn function to allow the child process to set
    the foreground window. */
 #define IOSPAWN_FLAG_ALLOW_SET_FG 1
+/* Don't close any child FDs.  */
+#define IOSPAWN_FLAG_NOCLOSE 2
 
 /* Spawn the executable PATH with ARGV as arguments.  After forking
    close all fds except for those in FD_LIST in the child, then
index c1542cc..17d60fc 100644 (file)
@@ -777,8 +777,11 @@ _gpgme_io_spawn (const char *path, char * const argv[], unsigned int flags,
     TRACE_LOG1 ("CloseHandle of process failed: ec=%d",
                (int) GetLastError ());
 
-  for (i = 0; fd_list[i].fd != -1; i++)
-    _gpgme_io_close (fd_list[i].fd);
+  if (! (flags & IOSPAWN_FLAG_NOCLOSE))
+    {
+      for (i = 0; fd_list[i].fd != -1; i++)
+       _gpgme_io_close (fd_list[i].fd);
+    }
 
   for (i = 0; fd_list[i].fd != -1; i++)
     if (fd_list[i].dup_to == -1)
index f87db12..e83aa0b 100644 (file)
@@ -1234,8 +1234,11 @@ _gpgme_io_spawn (const char *path, char *const argv[], unsigned int flags,
     TRACE_LOG1 ("CloseHandle of process failed: ec=%d",
                (int) GetLastError ());
 
-  for (i = 0; fd_list[i].fd != -1; i++)
-    _gpgme_io_close (fd_list[i].fd);
+  if (! (flags & IOSPAWN_FLAG_NOCLOSE))
+    {
+      for (i = 0; fd_list[i].fd != -1; i++)
+       _gpgme_io_close (fd_list[i].fd);
+    }
 
   for (i = 0; fd_list[i].fd != -1; i++)
     if (fd_list[i].dup_to == -1)