2003-09-14 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / tests / gpg / t-edit.c
index 8117d58..cefcbc4 100644 (file)
-/* t-edit.c  - regression test
- *     Copyright (C) 2000 Werner Koch (dd9jn)
- *      Copyright (C) 2001, 2002 g10 Code GmbH
- *
- * This file is part of GPGME.
- *
- * GPGME is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * GPGME is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
+/* t-edit.c - Regression test.
+   Copyright (C) 2000 Werner Koch (dd9jn)
+   Copyright (C) 2001, 2002, 2003 g10 Code GmbH
+
+   This file is part of GPGME.
+   GPGME is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   GPGME is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with GPGME; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <assert.h>
 #include <errno.h>
+#include <unistd.h>
+#include <errno.h>
 
 #include <gpgme.h>
 
-struct passphrase_cb_info_s {
-    GpgmeCtx c;
-    int did_it;
-};
-
-
-#define fail_if_err(a) do { if(a) { int my_errno = errno; \
-            fprintf (stderr, "%s:%d: GpgmeError %s\n", \
-                 __FILE__, __LINE__, gpgme_strerror(a));   \
-            if ((a) == GPGME_File_Error)                       \
-                   fprintf (stderr, "\terrno=`%s'\n", strerror (my_errno)); \
-                   exit (1); }                               \
-                             } while(0)
+#include "t-support.h"
 
+\f
 static void
-flush_data (GpgmeData dh)
+flush_data (gpgme_data_t dh)
 {
   char buf[100];
   int ret;
   
   ret = gpgme_data_seek (dh, 0, SEEK_SET);
   if (ret)
-    fail_if_err (GPGME_File_Error);
+    fail_if_err (gpg_error_from_errno (errno));
   while ((ret = gpgme_data_read (dh, buf, 100)) > 0)
     fwrite (buf, ret, 1, stdout);
   if (ret < 0)
-    fail_if_err (GPGME_File_Error);
-}
-
-
-static const char *
-passphrase_cb (void *opaque, const char *desc, void **r_hd)
-{
-  const char *pass;
-
-  if (!desc)
-    {
-      /* cleanup by looking at *r_hd */
-      return NULL;
-    }
-
-  pass = "abc";
-  fprintf (stderr, "%% requesting passphrase for `%s': ", desc);
-  fprintf (stderr, "sending `%s'\n", pass );
-
-  return pass;
+    fail_if_err (gpg_error_from_errno (errno));
 }
 
 
-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;
+
+             /* This fixes the primary user ID so the keylisting
+                tests will have predictable output.  */
+           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;
 }
 
@@ -123,56 +106,40 @@ 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;
-  struct passphrase_cb_info_s info;
+  gpgme_ctx_t ctx;
+  gpgme_error_t err;
+  gpgme_data_t out = NULL;
+  gpgme_key_t key = NULL;
   const char *pattern = "Alpha";
-  char *p;
+  char *agent_info;
 
-  do
-    {
-      err = gpgme_new (&ctx);
-      fail_if_err (err);
-      err = gpgme_data_new (&out);
-      fail_if_err (err);
+  init_gpgme (GPGME_PROTOCOL_OpenPGP);
 
-      p = getenv("GPG_AGENT_INFO");
-      if (!(p && strchr (p, ':')))
-       {
-         memset (&info, 0, sizeof info);
-         info.c = ctx;
-         gpgme_set_passphrase_cb (ctx, passphrase_cb, &info);
-       } 
-
-      err = gpgme_op_keylist_start (ctx, pattern, 0);
-      fail_if_err (err);
-      err = gpgme_op_keylist_next (ctx, &key);
-      fail_if_err (err);
-      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_new (&ctx);
+  fail_if_err (err);
+  err = gpgme_data_new (&out);
+  fail_if_err (err);
 
-      err = gpgme_op_edit (ctx, key, edit_fnc, out, out);
-      fail_if_err (err);
+  agent_info = getenv("GPG_AGENT_INFO");
+  if (!(agent_info && strchr (agent_info, ':')))
+    gpgme_set_passphrase_cb (ctx, passphrase_cb, 0);
 
-      fputs ("[-- Last response --]\n", stdout);
-      flush_data (out);
+  err = gpgme_op_keylist_start (ctx, pattern, 0);
+  fail_if_err (err);
+  err = gpgme_op_keylist_next (ctx, &key);
+  fail_if_err (err);
+  err = gpgme_op_keylist_end (ctx);
+  fail_if_err (err);
 
-      gpgme_data_release (out);
-      gpgme_key_release (key);
-      gpgme_release (ctx);
-    }
-  while (argc > 1 && !strcmp( argv[1], "--loop"));
+  err = gpgme_op_edit (ctx, key, edit_fnc, out, out);
+  fail_if_err (err);
 
-  return 0;
-}
+  fputs ("[-- Last response --]\n", stdout);
+  flush_data (out);
 
+  gpgme_data_release (out);
+  gpgme_key_unref (key);
+  gpgme_release (ctx);
 
+  return 0;
+}