diff options
Diffstat (limited to '')
| -rw-r--r-- | gpgme/ChangeLog | 6 | ||||
| -rw-r--r-- | gpgme/engine-gpgsm.c | 38 | 
2 files changed, 42 insertions, 2 deletions
| diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index 9ce48eeb..f58faffc 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,5 +1,11 @@  2001-11-22  Marcus Brinkmann  <[email protected]> +	* engine-gpgsm.c: Include stdlib.h and string.h.  Also include, +	for now, rungpg.h and status-table.h. +	(gpgsm_status_handler): Implement more of the status handler. + +2001-11-22  Marcus Brinkmann  <[email protected]> +  	* engine.c (_gpgme_engine_op_decrypt): Implement CMS case.  	(_gpgme_engine_op_delete): Likewise.  	(_gpgme_engine_op_encrypt): Likewise. diff --git a/gpgme/engine-gpgsm.c b/gpgme/engine-gpgsm.c index 7390f36f..127014d4 100644 --- a/gpgme/engine-gpgsm.c +++ b/gpgme/engine-gpgsm.c @@ -30,6 +30,8 @@  #ifdef ENABLE_GPGSM +#include <stdlib.h> +#include <string.h>  #include <sys/types.h>  #include <assert.h> @@ -40,6 +42,9 @@  #undef xtryrealloc  #undef xfree +#include "rungpg.h" +#include "status-table.h" +  #include "gpgme.h"  #include "util.h"  #include "types.h" @@ -424,13 +429,22 @@ _gpgme_gpgsm_op_verify (GpgsmObject gpgsm, GpgmeData sig, GpgmeData text)  }  static int +status_cmp (const void *ap, const void *bp) +{ +  const struct status_table_s *a = ap; +  const struct status_table_s *b = bp; + +  return strcmp (a->name, b->name); +} + +static int  gpgsm_status_handler (void *opaque, int pid, int fd)  {    int err;    GpgsmObject gpgsm = opaque;    ASSUAN_CONTEXT actx = gpgsm->assuan_ctx; - assert (fd == gpgsm->assuan_ctx->inbound.fd); +  assert (fd == gpgsm->assuan_ctx->inbound.fd);    err = _assuan_read_line (gpgsm->assuan_ctx); @@ -452,7 +466,27 @@ gpgsm_status_handler (void *opaque, int pid, int fd)      }    /* FIXME: Parse the status and call the handler.  */ -  fprintf (stderr, "[UNCAUGHT STATUS]%s", actx->inbound.line); +  if (actx->inbound.linelen > 2 +      && actx->inbound.line[0] == 'S' && actx->inbound.line[1] == ' ') +    { +      struct status_table_s t, *r; +      char *rest; + +      rest = strchr (actx->inbound.line + 2, ' '); +      if (!rest) +	rest = actx->inbound.line + actx->inbound.linelen; /* set to an empty string */ +      else +	*rest++ = 0; + +      t.name = actx->inbound.line + 2; +      r = bsearch (&t, status_table, DIM(status_table) - 1, +		   sizeof t, status_cmp); + +      if (gpgsm->status.fnc) +	gpgsm->status.fnc (gpgsm->status.fnc_value, r->code, rest); +    } +  else +    fprintf (stderr, "[UNCAUGHT STATUS]%s", actx->inbound.line);    return 0;  } | 
