2007-07-13 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Fri, 13 Jul 2007 01:57:02 +0000 (01:57 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Fri, 13 Jul 2007 01:57:02 +0000 (01:57 +0000)
* Revert the "close_notify_handler" returns int stuff.  Always
close in the _gpgme_io_close implementations.
* engine-gpgsm.c (status_handler): Try to terminate the connection
in case of error.
* w32-io.c (_gpgme_io_read): Return C->error_code in ERRNO.
(_gpgme_io_write): Likewise.

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

index 33f9b23df72449dc2494ff8ea27dda3fb9e23c3b..716b29cb01327996001f5caf61ae81fd8ee537a8 100644 (file)
@@ -1,5 +1,12 @@
 2007-07-13  Marcus Brinkmann  <marcus@g10code.de>
 
+       * Revert the "close_notify_handler" returns int stuff.  Always
+       close in the _gpgme_io_close implementations.
+       * engine-gpgsm.c (status_handler): Try to terminate the connection
+       in case of error.
+       * w32-io.c (_gpgme_io_read): Return C->error_code in ERRNO.
+       (_gpgme_io_write): Likewise.
+       
        * priv-io.h (_gpgme_io_set_close_notify): Change type of HANDLER
        to _gpgme_close_notify_handler.
        (_gpgme_close_notify_handler): New type.
index 4827fbee056f7e2973bce18cc54ba3f2d1b55c5a..4e3f1e707d0c7ab485a84514e0efbfd344105e5d 100644 (file)
@@ -112,7 +112,7 @@ gpgsm_get_req_version (void)
 }
 
 \f
-static int
+static void
 close_notify_handler (int fd, void *opaque)
 {
   engine_gpgsm_t gpgsm = opaque;
@@ -124,9 +124,6 @@ close_notify_handler (int fd, void *opaque)
        (*gpgsm->io_cbs.remove) (gpgsm->status_cb.tag);
       gpgsm->status_cb.fd = -1;
       gpgsm->status_cb.tag = NULL;
-      /* We do not want to close the status FD, as it is controled by
-        Assuan.  */
-      return 0;
     }
   else if (gpgsm->input_cb.fd == fd)
     {
@@ -149,7 +146,6 @@ close_notify_handler (int fd, void *opaque)
       gpgsm->message_cb.fd = -1;
       gpgsm->message_cb.tag = NULL;
     }
-  return 1;
 }
 
 
@@ -287,8 +283,6 @@ gpgsm_cancel (void *engine)
   if (!gpgsm)
     return gpg_error (GPG_ERR_INV_VALUE);
 
-  if (gpgsm->status_cb.fd != -1)
-    _gpgme_io_close (gpgsm->status_cb.fd);
   if (gpgsm->input_cb.fd != -1)
     _gpgme_io_close (gpgsm->input_cb.fd);
   if (gpgsm->output_cb.fd != -1)
@@ -827,6 +821,8 @@ status_handler (void *opaque, int fd)
            err = gpg_error (GPG_ERR_GENERAL);
           DEBUG2 ("fd %d: ERR line - mapped to: %s\n",
                   fd, err? gpg_strerror (err):"ok");
+         /* Try our best to terminate the connection friendly.  */
+         assuan_write_line (gpgsm->assuan_ctx, "BYE");
        }
       else if (linelen >= 2
               && line[0] == 'O' && line[1] == 'K'
@@ -846,7 +842,6 @@ status_handler (void *opaque, int fd)
               gpgsm->colon.any = 0;
               err = gpgsm->colon.fnc (gpgsm->colon.fnc_value, NULL);
             }
-         _gpgme_io_close (gpgsm->status_cb.fd);
           DEBUG2 ("fd %d: OK line - final status: %s\n",
                   fd, err? gpg_strerror (err):"ok");
          return err;
@@ -990,8 +985,7 @@ start (engine_gpgsm_t gpgsm, const char *command)
   /* We used to duplicate the file descriptor so that we do not
   disturb Assuan.  But this gets in the way of the Handle-to-Thread
   mapping in w32-io.c, so instead we just share the file descriptor
-  *carefully*, by avoiding to close it ourselves (this is achieved by
-  returning 0 from the close_notify_handler for this descriptor).  */
+  but leave it to Assuan to close it.  */
   gpgsm->status_cb.fd = fdlist[0];
 
   if (_gpgme_io_set_close_notify (gpgsm->status_cb.fd,
index 6ebe42aee703f550a9d8783046c995a20f1544fb..7d7be1e5871809eeed237a2d99d96d7a75b98577 100644 (file)
@@ -139,8 +139,6 @@ _gpgme_io_pipe (int filedes[2], int inherit_idx)
 int
 _gpgme_io_close (int fd)
 {
-  int really_close = 1;
-
   if (fd == -1)
     return -1;
   /* First call the notify handler.  */
@@ -149,16 +147,13 @@ _gpgme_io_close (int fd)
     {
       if (notify_table[fd].handler)
        {
-         really_close = notify_table[fd].handler (fd, notify_table[fd].value);
+         notify_table[fd].handler (fd, notify_table[fd].value);
          notify_table[fd].handler = NULL;
          notify_table[fd].value = NULL;
         }
     }
   /* Then do the close.  */    
-  if (really_close)
-    return close (fd);
-
-  return 0;
+  return close (fd);
 }
 
 
index 602fedee548cc9449a9768ed6386dcd2bf10f2ad..25d14dcbb3fbb140eb1f00bbdc60af1efdaf0342 100644 (file)
@@ -47,7 +47,7 @@ int _gpgme_io_read (int fd, void *buffer, size_t count);
 int _gpgme_io_write (int fd, const void *buffer, size_t count);
 int _gpgme_io_pipe (int filedes[2], int inherit_idx);
 int _gpgme_io_close (int fd);
-typedef int (*_gpgme_close_notify_handler_t) (int,void*);
+typedef void (*_gpgme_close_notify_handler_t) (int,void*);
 int _gpgme_io_set_close_notify (int fd, _gpgme_close_notify_handler_t handler,
                                void *value);
 int _gpgme_io_set_nonblocking (int fd);
index 91fc1adffcf9f15540affc88a1b64a673be60e6c..d6fd8fe1c3a6c981adfcbcad17acc1bbf1d94989 100644 (file)
@@ -141,7 +141,7 @@ gpg_io_event (void *engine, gpgme_event_io_t type, void *type_data)
 }
 
 
-static int
+static void
 close_notify_handler (int fd, void *opaque)
 {
   engine_gpg_t gpg = opaque;
@@ -183,7 +183,6 @@ close_notify_handler (int fd, void *opaque)
             }
         }
     }
-  return 1;
 }
 
 /* If FRONT is true, push at the front of the list.  Use this for
index 337277667a9be980b4f0b2d4f1e2ad26f7b15581..8f56eee7661598dcc9b0553b5feda6f13c3611ef 100644 (file)
@@ -271,7 +271,6 @@ int
 _gpgme_io_close (int fd)
 {
   GIOChannel *chan;
-  int really_close = 1;
 
   if (fd < 0 || fd >= MAX_SLAFD)
     {
@@ -283,24 +282,21 @@ _gpgme_io_close (int fd)
   DEBUG1 ("closing fd %d", fd);
   if (notify_table[fd].handler)
     {
-      really_close = notify_table[fd].handler (fd, notify_table[fd].value);
+      notify_table[fd].handler (fd, notify_table[fd].value);
       notify_table[fd].handler = NULL;
       notify_table[fd].value = NULL;
     }
 
   /* Then do the close.  */    
-  if (really_close)
+  chan = giochannel_table[fd];
+  if (chan)
     {
-      chan = giochannel_table[fd];
-      if (chan)
-       {
-         g_io_channel_shutdown (chan, 1, NULL);
-         g_io_channel_unref (chan);
-         giochannel_table[fd] = NULL;
-       }
-      else
-       _close (fd);
+      g_io_channel_shutdown (chan, 1, NULL);
+      g_io_channel_unref (chan);
+      giochannel_table[fd] = NULL;
     }
+  else
+    _close (fd);
 
   return 0;
 }
index 3b034f65258fb50da1f740ec7a794d8a8ea991ed..e2a464dd5882a8f5ed3aa9953c6e63a84772c417 100644 (file)
@@ -374,6 +374,7 @@ _gpgme_io_read ( int fd, void *buffer, size_t count )
     DEBUG2 ("fd %d: about to read %d bytes\n", fd, (int)count );
     if ( !c ) {
         DEBUG0 ( "no reader thread\n");
+       errno = EBADF;
         return -1;
     }
     if (c->eof_shortcut) {
@@ -402,6 +403,7 @@ _gpgme_io_read ( int fd, void *buffer, size_t count )
             return 0;
         }
         DEBUG1 ("fd %d: read error", fd );
+       errno = c->error_code;
         return -1;
     }
       
@@ -631,11 +633,12 @@ _gpgme_io_write ( int fd, const void *buffer, size_t count )
     _gpgme_debug (2, "fd %d: write `%.*s'\n", fd, (int) count, buffer);
     if ( !c ) {
         DEBUG0 ( "no writer thread\n");
+       errno = EBADF;
         return -1;
     }
 
     LOCK (c->mutex);
-    if ( c->nbytes ) { /* bytes are pending for send */
+    if ( !c->error && c->nbytes ) { /* bytes are pending for send */
         /* Reset the is_empty event.  Better safe than sorry.  */
         if (!ResetEvent (c->is_empty))
             DEBUG1 ("ResetEvent failed: ec=%d", (int)GetLastError ());
@@ -650,6 +653,7 @@ _gpgme_io_write ( int fd, const void *buffer, size_t count )
     if ( c->error) {
         UNLOCK (c->mutex);
         DEBUG1 ("fd %d: write error", fd );
+       errno = c->error_code;
         return -1;
     }
 
@@ -729,7 +733,6 @@ _gpgme_io_close ( int fd )
     int i;
     _gpgme_close_notify_handler_t handler = NULL;
     void *value = NULL;
-    int really_close = 1;
 
     if ( fd == -1 )
         return -1;
@@ -750,9 +753,9 @@ _gpgme_io_close ( int fd )
     }
     UNLOCK (notify_table_lock);
     if (handler)
-        really_close = handler (fd, value);
+        handler (fd, value);
 
-    if ( really_close && !CloseHandle (fd_to_handle (fd)) ) { 
+    if ( !CloseHandle (fd_to_handle (fd)) ) { 
         DEBUG2 ("CloseHandle for fd %d failed: ec=%d\n",
                  fd, (int)GetLastError ());
         return -1;