diff options
Diffstat (limited to 'gpgme/rungpg.c')
-rw-r--r-- | gpgme/rungpg.c | 134 |
1 files changed, 1 insertions, 133 deletions
diff --git a/gpgme/rungpg.c b/gpgme/rungpg.c index 940f971b..d1c50cc8 100644 --- a/gpgme/rungpg.c +++ b/gpgme/rungpg.c @@ -132,9 +132,6 @@ DEFINE_STATIC_LOCK (reap_list_lock); static void free_argv ( char **argv ); static void free_fd_data_map ( struct fd_data_map_s *fd_data_map ); -static int gpg_inbound_handler ( void *opaque, int pid, int fd ); -static int gpg_outbound_handler ( void *opaque, int pid, int fd ); - static int gpg_status_handler ( void *opaque, int pid, int fd ); static GpgmeError read_status ( GpgObject gpg ); @@ -919,7 +916,7 @@ _gpgme_gpg_spawn( GpgObject gpg, void *opaque ) if ( _gpgme_register_pipe_handler ( opaque, gpg->fd_data_map[i].inbound? - gpg_inbound_handler:gpg_outbound_handler, + _gpgme_data_inbound_handler:_gpgme_data_outbound_handler, gpg->fd_data_map[i].data, pid, gpg->fd_data_map[i].fd, gpg->fd_data_map[i].inbound ) @@ -940,135 +937,6 @@ _gpgme_gpg_spawn( GpgObject gpg, void *opaque ) static int -gpg_inbound_handler ( void *opaque, int pid, int fd ) -{ - GpgmeData dh = opaque; - GpgmeError err; - int nread; - char buf[200]; - - assert ( _gpgme_data_get_mode (dh) == GPGME_DATA_MODE_IN ); - - nread = _gpgme_io_read (fd, buf, 200 ); - if ( nread < 0 ) { - DEBUG3 ("read_mem_data: read failed on fd %d (n=%d): %s", - fd, nread, strerror (errno) ); - return 1; - } - else if (!nread) - return 1; /* eof */ - - /* We could improve this with a GpgmeData function which takes - * the read function or provides a memory area for writing to it. - */ - - err = _gpgme_data_append ( dh, buf, nread ); - if ( err ) { - DEBUG1 ("_gpgme_append_data failed: %s\n", - gpgme_strerror(err)); - /* Fixme: we should close the pipe or read it to /dev/null in - * this case. Returnin EOF is not sufficient */ - return 1; - } - - return 0; -} - - -static int -write_mem_data ( GpgmeData dh, int fd ) -{ - size_t nbytes; - int nwritten; - - nbytes = dh->len - dh->readpos; - if ( !nbytes ) { - _gpgme_io_close (fd); - return 1; - } - - /* FIXME: Arggg, the pipe blocks on large write request, although - * select told us that it is okay to write - need to figure out - * why this happens? Stevens says nothing about this problem (or - * is it my Linux kernel 2.4.0test1) - * To avoid that we have set the pipe to nonblocking. - */ - - nwritten = _gpgme_io_write ( fd, dh->data+dh->readpos, nbytes ); - if (nwritten == -1 && errno == EAGAIN ) - return 0; - if ( nwritten < 1 ) { - DEBUG3 ("write_mem_data(%d): write failed (n=%d): %s", - fd, nwritten, strerror (errno) ); - _gpgme_io_close (fd); - return 1; - } - - dh->readpos += nwritten; - return 0; -} - -static int -write_cb_data ( GpgmeData dh, int fd ) -{ - size_t nbytes; - int err, nwritten; - char buffer[512]; - - err = gpgme_data_read ( dh, buffer, DIM(buffer), &nbytes ); - if (err == GPGME_EOF) { - _gpgme_io_close (fd); - return 1; - } - - nwritten = _gpgme_io_write ( fd, buffer, nbytes ); - if (nwritten == -1 && errno == EAGAIN ) - return 0; - if ( nwritten < 1 ) { - DEBUG3 ("write_cb_data(%d): write failed (n=%d): %s", - fd, nwritten, strerror (errno) ); - _gpgme_io_close (fd); - return 1; - } - - if ( nwritten < nbytes ) { - /* ugly, ugly: It does currently only for for MEM type data */ - if ( _gpgme_data_unread (dh, buffer + nwritten, nbytes - nwritten ) ) - DEBUG1 ("wite_cb_data: unread of %d bytes failed\n", - nbytes - nwritten ); - _gpgme_io_close (fd); - return 1; - } - - return 0; -} - - -static int -gpg_outbound_handler ( void *opaque, int pid, int fd ) -{ - GpgmeData dh = opaque; - - assert ( _gpgme_data_get_mode (dh) == GPGME_DATA_MODE_OUT ); - switch ( gpgme_data_get_type (dh) ) { - case GPGME_DATA_TYPE_MEM: - if ( write_mem_data ( dh, fd ) ) - return 1; /* ready */ - break; - case GPGME_DATA_TYPE_CB: - if (write_cb_data (dh, fd)) - return 1; /* ready */ - break; - default: - assert (0); - } - - return 0; -} - - - -static int gpg_status_handler ( void *opaque, int pid, int fd ) { GpgObject gpg = opaque; |