2007-07-10 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Tue, 10 Jul 2007 16:06:44 +0000 (16:06 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Tue, 10 Jul 2007 16:06:44 +0000 (16:06 +0000)
* priv-io.h (_gpgme_io_dup): New prototype.
* posix-io.c (_gpgme_io_dup): New function.
* w32-io.c (_gpgme_io_dup): Likewise.
* w32-glib-io.c (_gpgme_io_dup): Likewise.
* engine-gpgsm.c (start): Use _gpgme_dup() instead of dup().

gpgme/ChangeLog
gpgme/engine-gpgsm.c
gpgme/posix-io.c
gpgme/priv-io.h
gpgme/w32-glib-io.c
gpgme/w32-io.c

index 3b538efc77e803bed4dfc2c2eb76419c57081d85..d2b021d63684c986dd27bb25c330a9d01c908fe2 100644 (file)
@@ -1,3 +1,11 @@
+2007-07-10  Marcus Brinkmann  <marcus@g10code.de>
+
+       * priv-io.h (_gpgme_io_dup): New prototype.
+       * posix-io.c (_gpgme_io_dup): New function. 
+       * w32-io.c (_gpgme_io_dup): Likewise.
+       * w32-glib-io.c (_gpgme_io_dup): Likewise.
+       * engine-gpgsm.c (start): Use _gpgme_dup() instead of dup().
+
 2007-07-08  Marcus Brinkmann  <marcus@g10code.de>
 
        * engine-gpgsm.c [HAVE_W32_SYSTEM]: Enable the bunch of the file.
index d43a480d43f69274883135c1988933c30d44f9af..0b78c29c899cb8d4d64da933dc168eb7cba5b3b1 100644 (file)
@@ -988,7 +988,8 @@ start (engine_gpgsm_t gpgsm, const char *command)
      status_fd and register/unregister it manually as needed, but this
      increases code duplication and is more complicated as we can not
      use the close notifications etc.  */
-  gpgsm->status_cb.fd = dup (fdlist[0]);
+
+  gpgsm->status_cb.fd = _gpgme_io_dup (fdlist[0]);
   if (gpgsm->status_cb.fd < 0)
     return gpg_error_from_syserror ();
 
index 5cb71f9b8b1998115f53ebddf8dbc8377a9b394f..82142f8450c7246e79eb37d3e1af9f39a1d3b284 100644 (file)
@@ -495,3 +495,8 @@ _gpgme_io_sendmsg (int fd, const struct msghdr *msg, int flags)
 }
 
 
+int
+_gpgme_io_dup (int fd)
+{
+  return dup (fd);
+}
index 4c2a604aaa9e8e5f4cbd459d80a0b985006f6a55..6b422840bda6f02fc625f18a7f9b8ca9ca5f97f7 100644 (file)
@@ -64,4 +64,7 @@ int _gpgme_io_select (struct io_select_fd_s *fds, size_t nfds, int nonblock);
    line that the child process expects.  */
 int _gpgme_io_fd2str (char *buf, int buflen, int fd);
 
+/* Like dup().  */
+int _gpgme_io_dup (int fd);
+
 #endif /* IO_H */
index 20099ef6e9a986eec99201a30cf7a8a4c1fd1353..183a560c624950be7f1d490d55ee697cffb4fed1 100644 (file)
@@ -660,3 +660,11 @@ leave:
   free (pollfds_map);
   return count;
 }
+
+
+int
+_gpgme_io_dup (int fd)
+{
+  return _dup (fd);
+}  
+
index fd53a6fbcf5905c8814e59d57be13ecb0964f475..947bb62e86d237bdc77780721a392096800affe1 100644 (file)
@@ -1140,6 +1140,25 @@ _gpgme_io_fd2str (char *buf, int buflen, int fd)
   return snprintf (buf, buflen, "%d", fd);
 }
 
+
+int
+_gpgme_io_dup (int fd)
+{
+  HANDLE handle = fd_to_handle (fd);
+  HANDLE new_handle = fd_to_handle (fd);
+    
+  /* For NT we have to set the sync flag.  It seems that the only
+   * way to do it is by duplicating the handle.  Tsss.. */
+  if (!DuplicateHandle( GetCurrentProcess(), handle,
+                       GetCurrentProcess(), &new_handle,
+                       0, FALSE, DUPLICATE_SAME_ACCESS))
+    {
+      DEBUG1 ("** DuplicateHandle failed: ec=%d\n", (int) GetLastError());
+    }
+
+  return handle_to_fd (new_handle);
+}  
+
 \f
 /* The following interface is only useful for GPGME Glib.  */