2001-11-22 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Thu, 22 Nov 2001 21:27:41 +0000 (21:27 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Thu, 22 Nov 2001 21:27:41 +0000 (21:27 +0000)
* 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
gpgme/engine-gpgsm.c

index 9ce48eeb7764152505342f6cb9eaf37fa8e539e2..f58faffc34a4e4bff14b706cfc0e44f8d99fe8a7 100644 (file)
@@ -1,3 +1,9 @@
+2001-11-22  Marcus Brinkmann  <marcus@g10code.de>
+
+       * 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  <marcus@g10code.de>
 
        * engine.c (_gpgme_engine_op_decrypt): Implement CMS case.
index 7390f36f3b03181f8ffa4e7b9ccc915326ea8c89..127014d4bb411fa04fac55d80d5a453efe75a49b 100644 (file)
@@ -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"
@@ -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;
 }