diff options
| author | Werner Koch <[email protected]> | 2007-09-28 17:30:11 +0000 | 
|---|---|---|
| committer | Werner Koch <[email protected]> | 2007-09-28 17:30:11 +0000 | 
| commit | 0123eed81c9b12e9fc29cca973c14d39ae984227 (patch) | |
| tree | 20a90098bc4a82e006a8c6487d5fe5c0b82dc836 | |
| parent | Fixed the external event loop for glib. (diff) | |
| download | gpgme-0123eed81c9b12e9fc29cca973c14d39ae984227.tar.gz gpgme-0123eed81c9b12e9fc29cca973c14d39ae984227.zip | |
Fixed a problem in the W32 gpgme->gpgsm communication.
Diffstat (limited to '')
| -rw-r--r-- | gpgme/ChangeLog | 4 | ||||
| -rw-r--r-- | gpgme/engine-gpgsm.c | 40 | ||||
| -rw-r--r-- | gpgme/w32-glib-io.c | 2 | 
3 files changed, 34 insertions, 12 deletions
| diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index fdcc02ce..fe47cff9 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,5 +1,9 @@  2007-09-28  Werner Koch  <[email protected]> +	* engine-gpgsm.c (iocb_data_t): Add SERVER_FD_STR. +	(gpgsm_new): Set it. +	(gpgsm_set_fd): Use it. +  	* w32-glib-io.c (find_channel): Add a new primary flag.  	(_gpgme_io_close): Close channel only if primary.  	(_gpgme_io_dup): Put newfd into the table as shallow copy. diff --git a/gpgme/engine-gpgsm.c b/gpgme/engine-gpgsm.c index 245322c0..bae06ef0 100644 --- a/gpgme/engine-gpgsm.c +++ b/gpgme/engine-gpgsm.c @@ -49,10 +49,13 @@  typedef struct  {    int fd;	/* FD we talk about.  */ -  int server_fd; /* Server FD for this connection.  */ +  int server_fd;/* Server FD for this connection.  */    int dir;	/* Inbound/Outbound, maybe given implicit?  */    void *data;	/* Handler-specific data.  */    void *tag;	/* ID from the user for gpgme_remove_io_callback.  */ +  char server_fd_str[15]; /* Same as SERVER_FD but as a string.  We +                             need this because _gpgme_io_fdstr can't +                             be used on a closed descriptor.  */  } iocb_data_t; @@ -351,14 +354,17 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir)    gpgsm->input_cb.dir = 0;    gpgsm->input_cb.tag = 0;    gpgsm->input_cb.server_fd = -1; +  *gpgsm->input_cb.server_fd_str = 0;    gpgsm->output_cb.fd = -1;    gpgsm->output_cb.dir = 1;    gpgsm->output_cb.tag = 0;    gpgsm->output_cb.server_fd = -1; +  *gpgsm->output_cb.server_fd_str = 0;    gpgsm->message_cb.fd = -1;    gpgsm->message_cb.dir = 0;    gpgsm->message_cb.tag = 0;    gpgsm->message_cb.server_fd = -1; +  *gpgsm->message_cb.server_fd_str = 0;    gpgsm->status.fnc = 0;    gpgsm->colon.fnc = 0; @@ -381,6 +387,9 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir)      }    gpgsm->input_cb.fd = fds[1];    gpgsm->input_cb.server_fd = fds[0]; +  _gpgme_io_fd2str (gpgsm->input_cb.server_fd_str,  +                    sizeof gpgsm->input_cb.server_fd_str, +                    gpgsm->input_cb.server_fd);    if (_gpgme_io_pipe (fds, 1) < 0)      { @@ -389,6 +398,9 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir)      }    gpgsm->output_cb.fd = fds[0];    gpgsm->output_cb.server_fd = fds[1]; +  _gpgme_io_fd2str (gpgsm->output_cb.server_fd_str,  +                    sizeof gpgsm->output_cb.server_fd_str, +                    gpgsm->output_cb.server_fd);    if (_gpgme_io_pipe (fds, 0) < 0)      { @@ -397,6 +409,9 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir)      }    gpgsm->message_cb.fd = fds[1];    gpgsm->message_cb.server_fd = fds[0]; +  _gpgme_io_fd2str (gpgsm->message_cb.server_fd_str,  +                    sizeof gpgsm->message_cb.server_fd_str, +                    gpgsm->message_cb.server_fd);    child_fds[0] = gpgsm->input_cb.server_fd;    child_fds[1] = gpgsm->output_cb.server_fd; @@ -672,7 +687,6 @@ gpgsm_set_fd (engine_gpgsm_t gpgsm, fd_type_t fd_type, const char *opt)    char *which;    iocb_data_t *iocb_data;    int dir; -  int fd;    switch (fd_type)      { @@ -718,16 +732,13 @@ gpgsm_set_fd (engine_gpgsm_t gpgsm, fd_type_t fd_type, const char *opt)  	  goto leave_set_fd;  	}      } -#endif - -  fd = iocb_data->server_fd; -#if USE_DESCRIPTOR_PASSING -  err = assuan_sendfd (gpgsm->assuan_ctx, fd); +  err = assuan_sendfd (gpgsm->assuan_ctx, iocb_data->server_fd);    if (err)      goto leave_set_fd; -  _gpgme_io_close (fd); +  _gpgme_io_close (iocb_data->server_fd); +  iocb_data->server_fd = -1;    if (opt)      snprintf (line, COMMANDLINELEN, "%s FD %s", which, opt); @@ -735,9 +746,11 @@ gpgsm_set_fd (engine_gpgsm_t gpgsm, fd_type_t fd_type, const char *opt)      snprintf (line, COMMANDLINELEN, "%s FD", which);  #else    if (opt) -    snprintf (line, COMMANDLINELEN, "%s FD=%i %s", which, fd, opt); +    snprintf (line, COMMANDLINELEN, "%s FD=%s %s",  +              which, iocb_data->server_fd_str, opt);    else -    snprintf (line, COMMANDLINELEN, "%s FD=%i", which, fd); +    snprintf (line, COMMANDLINELEN, "%s FD=%s",  +              which, iocb_data->server_fd_str);  #endif    err = gpgsm_assuan_simple_command (gpgsm->assuan_ctx, line, NULL, NULL); @@ -747,9 +760,12 @@ gpgsm_set_fd (engine_gpgsm_t gpgsm, fd_type_t fd_type, const char *opt)    if (err)      {        _gpgme_io_close (iocb_data->fd); -      _gpgme_io_close (iocb_data->server_fd);        iocb_data->fd = -1; -      iocb_data->server_fd = -1; +      if (iocb_data->server_fd != -1) +        { +          _gpgme_io_close (iocb_data->server_fd); +          iocb_data->server_fd = -1; +        }      }  #endif diff --git a/gpgme/w32-glib-io.c b/gpgme/w32-glib-io.c index 935050c0..faf31a62 100644 --- a/gpgme/w32-glib-io.c +++ b/gpgme/w32-glib-io.c @@ -125,6 +125,8 @@ gpgme_get_fdptr (int fd)  int  _gpgme_io_fd2str (char *buf, int buflen, int fd)  { +  TRACE_BEG1 (DEBUG_SYSIO, "_gpgme_io_fd2str", fd, "fd=%d", fd); +  TRACE_SUC1 ("syshd=%p", _get_osfhandle (fd));    return snprintf (buf, buflen, "%ld", (long) _get_osfhandle (fd));  } | 
