2003-05-27 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / tests / gpg / t-edit.c
index b78a7fe..fb2f62f 100644 (file)
 #include <string.h>
 #include <assert.h>
 #include <errno.h>
+#include <unistd.h>
 
 #include <gpgme.h>
 
 struct passphrase_cb_info_s {
-    GpgmeCtx c;
+    gpgme_ctx_t c;
     int did_it;
 };
 
 
 #define fail_if_err(a) do { if(a) { int my_errno = errno; \
-            fprintf (stderr, "%s:%d: GpgmeError %s\n", \
+            fprintf (stderr, "%s:%d: gpgme_error_t %s\n", \
                  __FILE__, __LINE__, gpgme_strerror(a));   \
             if ((a) == GPGME_File_Error)                       \
                    fprintf (stderr, "\terrno=`%s'\n", strerror (my_errno)); \
@@ -42,7 +43,7 @@ struct passphrase_cb_info_s {
                              } while(0)
 
 static void
-flush_data (GpgmeData dh)
+flush_data (gpgme_data_t dh)
 {
   char buf[100];
   int ret;
@@ -57,62 +58,68 @@ flush_data (GpgmeData dh)
 }
 
 
-static GpgmeError
-passphrase_cb (void *opaque, const char *desc,
-              void **r_hd, const char **result)
+static gpgme_error_t
+passphrase_cb (void *opaque, const char *uid_hint, const char *passphrase_info,
+              int last_was_bad, int fd)
 {
-  if (!desc)
-    /* Cleanup by looking at *r_hd.  */
-    return 0;
-
-  *result = "abc";
-  fprintf (stderr, "%% requesting passphrase for `%s': ", desc);
-  fprintf (stderr, "sending `%s'\n", *result);
-  
+  write (fd, "abc\n", 4);
   return 0;
 }
 
 
-GpgmeError
-edit_fnc (void *opaque, GpgmeStatusCode status, const char *args, const char **result)
+gpgme_error_t
+edit_fnc (void *opaque, gpgme_status_code_t status, const char *args, int fd)
 {
-  GpgmeData out = (GpgmeData) opaque;
+  char *result = NULL;
+  gpgme_data_t out = (gpgme_data_t) opaque;
 
   fputs ("[-- Response --]\n", stdout);
   flush_data (out); 
 
   fprintf (stdout, "[-- Code: %i, %s --]\n", status, args);
-  if (result)
+
+  if (fd >= 0)
     {
       if (!strcmp (args, "keyedit.prompt"))
        {
          static int step = 0;
-
+         
          switch (step)
            {
            case 0:
-             *result = "fpr";
+             result = "fpr";
              break;
            case 1:
-             *result = "expire";
+             result = "expire";
              break;
+
+             /* Work around a bug in GPG 1.2.2, which causes the
+                primary UID to change when setting the expiration
+                date.  */
+           case 2:
+             result = "1";
+             break;
+           case 3:
+             result = "primary";
+             break;
+
            default:
-             *result = "quit";
+             result = "quit";
              break;
            }
          step++;
        }
       else if (!strcmp (args, "keyedit.save.okay"))
-       {
-         *result = "Y";
-       }
+       result = "Y";
       else if (!strcmp (args, "keygen.valid"))
-       {
-         *result = "0";
-       }
+       result = "0";
     }
 
+  if (result)
+    {
+      write (fd, result, strlen (result));
+      write (fd, "\n", 1);
+    }
   return 0;
 }
 
@@ -120,10 +127,10 @@ edit_fnc (void *opaque, GpgmeStatusCode status, const char *args, const char **r
 int 
 main (int argc, char **argv)
 {
-  GpgmeCtx ctx;
-  GpgmeError err;
-  GpgmeData out = NULL;
-  GpgmeKey key = NULL;
+  gpgme_ctx_t ctx;
+  gpgme_error_t err;
+  gpgme_data_t out = NULL;
+  gpgme_key_t key = NULL;
   struct passphrase_cb_info_s info;
   const char *pattern = "Alpha";
   char *p;
@@ -150,13 +157,6 @@ main (int argc, char **argv)
       err = gpgme_op_keylist_end (ctx);
       fail_if_err (err);
 
-      p = gpgme_key_get_as_xml (key);
-      if (p)
-       {
-         fputs (p, stdout);
-         free (p);
-       }
-
       err = gpgme_op_edit (ctx, key, edit_fnc, out, out);
       fail_if_err (err);
 
@@ -164,7 +164,7 @@ main (int argc, char **argv)
       flush_data (out);
 
       gpgme_data_release (out);
-      gpgme_key_release (key);
+      gpgme_key_unref (key);
       gpgme_release (ctx);
     }
   while (argc > 1 && !strcmp( argv[1], "--loop"));