diff options
Diffstat (limited to 'gpgme/rungpg.c')
| -rw-r--r-- | gpgme/rungpg.c | 90 | 
1 files changed, 26 insertions, 64 deletions
| diff --git a/gpgme/rungpg.c b/gpgme/rungpg.c index c89e39ed..8e766592 100644 --- a/gpgme/rungpg.c +++ b/gpgme/rungpg.c @@ -109,8 +109,8 @@ struct gpg_object_s    {      int used;      int fd; +    void *cb_data;      int idx;		/* Index in fd_data_map */ -    gpgme_data_t cb_data;   /* hack to get init the above idx later */      gpgme_status_code_t code;  /* last code */      char *keyword;       /* what has been requested (malloced) */      EngineCommandHandler fnc;  @@ -301,16 +301,19 @@ gpg_release (void *engine)      {        struct arg_and_data_s *next = gpg->arglist->next; -      free (gpg->arglist); +      if (gpg->arglist) +	free (gpg->arglist);        gpg->arglist = next;      } -  free (gpg->status.buffer); -  free (gpg->colon.buffer); +  if (gpg->status.buffer) +    free (gpg->status.buffer); +  if (gpg->colon.buffer) +    free (gpg->colon.buffer);    if (gpg->argv)      free_argv (gpg->argv); -  gpgme_data_release (gpg->cmd.cb_data); -  free (gpg->cmd.keyword); +  if (gpg->cmd.keyword) +    free (gpg->cmd.keyword);    if (gpg->status.fd[0] != -1)      _gpgme_io_close (gpg->status.fd[0]); @@ -320,7 +323,8 @@ gpg_release (void *engine)      _gpgme_io_close (gpg->colon.fd[0]);    if (gpg->colon.fd[1] != -1)      _gpgme_io_close (gpg->colon.fd[1]); -  free_fd_data_map (gpg->fd_data_map); +  if (gpg->fd_data_map) +    free_fd_data_map (gpg->fd_data_map);    if (gpg->cmd.fd != -1)      _gpgme_io_close (gpg->cmd.fd);    free (gpg); @@ -436,60 +440,20 @@ gpg_set_colon_line_handler (void *engine, EngineColonLineHandler fnc,  } -/* Here we handle --command-fd.  This works closely together with the -   status handler.  */  static gpgme_error_t -command_cb (void *opaque, char *buffer, size_t length, size_t *nread) +command_handler (void *opaque, int fd)  {    gpgme_error_t err; -  GpgObject gpg = opaque; -  const char *value; -  int value_len; +  GpgObject gpg = (GpgObject) opaque; -  DEBUG0 ("command_cb: enter\n");    assert (gpg->cmd.used); -  if (!buffer || !length || !nread) -    return 0; /* These values are reserved for extensions.  */ -  *nread = 0; -  if (!gpg->cmd.code) -    { -      DEBUG0 ("command_cb: no code\n"); -      return -1; -    } -     -  if (!gpg->cmd.fnc) -    { -      DEBUG0 ("command_cb: no user cb\n"); -      return -1; -    } +  assert (gpg->cmd.code); +  assert (gpg->cmd.fnc); -  /* FIXME catch error */ -  err = gpg->cmd.fnc (gpg->cmd.fnc_value,  -		      gpg->cmd.code, gpg->cmd.keyword, &value); +  err = gpg->cmd.fnc (gpg->cmd.fnc_value, gpg->cmd.code, gpg->cmd.keyword, fd);    if (err)      return err; -  if (!value) -    { -      DEBUG0 ("command_cb: no data from user cb\n"); -      gpg->cmd.fnc (gpg->cmd.fnc_value, 0, value, &value); -      return -1; -    } - -  value_len = strlen (value); -  if (value_len + 1 > length) -    { -      DEBUG0 ("command_cb: too much data from user cb\n"); -      gpg->cmd.fnc (gpg->cmd.fnc_value, 0, value, &value); -      return -1; -    } - -  memcpy (buffer, value, value_len); -  if (!value_len || (value_len && value[value_len-1] != '\n'))  -    buffer[value_len++] = '\n'; -  *nread = value_len; -     -  gpg->cmd.fnc (gpg->cmd.fnc_value, 0, value, &value);    gpg->cmd.code = 0;    /* And sleep again until read_status will wake us up again.  */    /* XXX We must check if there are any more fds active after removing @@ -502,6 +466,7 @@ command_cb (void *opaque, char *buffer, size_t length, size_t *nread)  } +  /* The Fnc will be called to get a value for one of the commands with     a key KEY.  If the Code pssed to FNC is 0, the function may release     resources associated with the returned value from another call.  To @@ -512,17 +477,14 @@ gpg_set_command_handler (void *engine, EngineCommandHandler fnc,  			 void *fnc_value, gpgme_data_t linked_data)  {    GpgObject gpg = engine; -  gpgme_data_t tmp; -  gpgme_error_t err; -  err = gpgme_data_new_with_read_cb (&tmp, command_cb, gpg); -  if (err) -    return err; -            add_arg (gpg, "--command-fd"); -  add_data (gpg, tmp, -2, 0); -  gpg->cmd.cb_data = tmp; +  /* This is a hack.  We don't have a real data object.  The only +     thing that matters is that we use something unique, so we use the +     address of the cmd structure in the gpg object.  */ +  add_data (gpg, (void *) &gpg->cmd, -2, 0);    gpg->cmd.fnc = fnc; +  gpg->cmd.cb_data = (void *) &gpg->cmd;    gpg->cmd.fnc_value = fnc_value;    gpg->cmd.linked_data = linked_data;    gpg->cmd.used = 1; @@ -579,7 +541,7 @@ build_argv (GpgObject gpg)    if (use_agent)      argc++;    if (!gpg->cmd.used) -    argc++; +    argc++;	/* --batch */    argc += 2; /* --comment */    argv = calloc (argc + 1, sizeof *argv); @@ -843,7 +805,8 @@ read_status (GpgObject gpg)  			      || r->code == GPGME_STATUS_GET_HIDDEN))  			{  			  gpg->cmd.code = r->code; -			  free (gpg->cmd.keyword); +			  if (gpg->cmd.keyword) +			    free (gpg->cmd.keyword);  			  gpg->cmd.keyword = strdup (rest);  			  if (!gpg->cmd.keyword)  			    return GPGME_Out_Of_Core; @@ -877,8 +840,7 @@ read_status (GpgObject gpg)  			    }  			  add_io_cb (gpg, gpg->cmd.fd, 0, -				     _gpgme_data_outbound_handler, -				     gpg->fd_data_map[gpg->cmd.idx].data, +				     command_handler, gpg,  				     &gpg->fd_data_map[gpg->cmd.idx].tag);  			  gpg->fd_data_map[gpg->cmd.idx].fd = gpg->cmd.fd;  			  gpg->cmd.fd = -1; | 
