From d1ded512c46755e3e487395aa183988c05dcfd20 Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Thu, 22 Nov 2001 21:27:41 +0000 Subject: [PATCH] 2001-11-22 Marcus Brinkmann * 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. --- gpgme/ChangeLog | 6 ++++++ gpgme/engine-gpgsm.c | 38 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index 9ce48ee..f58faff 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,3 +1,9 @@ +2001-11-22 Marcus Brinkmann + + * 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 * engine.c (_gpgme_engine_op_decrypt): Implement CMS case. diff --git a/gpgme/engine-gpgsm.c b/gpgme/engine-gpgsm.c index 7390f36..127014d 100644 --- a/gpgme/engine-gpgsm.c +++ b/gpgme/engine-gpgsm.c @@ -30,6 +30,8 @@ #ifdef ENABLE_GPGSM +#include +#include #include #include @@ -40,6 +42,9 @@ #undef xtryrealloc #undef xfree +#include "rungpg.h" +#include "status-table.h" + #include "gpgme.h" #include "util.h" #include "types.h" @@ -423,6 +428,15 @@ _gpgme_gpgsm_op_verify (GpgsmObject gpgsm, GpgmeData sig, GpgmeData text) return 0; } +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) { @@ -430,7 +444,7 @@ gpgsm_status_handler (void *opaque, int pid, int fd) 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; } -- 2.26.2