[git] GPGME - branch, master, updated. gpgme-1.7.0-6-g7a6543c

by Daiki Ueno cvs at cvs.gnupg.org
Thu Sep 22 09:15:44 CEST 2016


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GnuPG Made Easy".

The branch, master has been updated
       via  7a6543c2dfeef874a34086c8f3eeb1dbdf1ce822 (commit)
       via  dee56820cabde60c43c9bf8281b8d411cb2ad644 (commit)
       via  d0cf6b15121c9b42dbcef243e5ce30c9996a449c (commit)
       via  0aaf1dedd629446ab991fff76581b4b58e4872a0 (commit)
      from  ae324b51ffa338b891387bff2657d60c1fd3ae40 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 7a6543c2dfeef874a34086c8f3eeb1dbdf1ce822
Author: Daiki Ueno <ueno at gnu.org>
Date:   Tue Feb 9 17:03:54 2016 +0900

    tests: Add test for cancellation
    
    * tests/gpg/t-cancel.c: New file.
    * tests/gpg/Makefile.am (tests_skipped): New variable, default to
    t-genkey and t-cancel.
    (noinst_PROGRAMS): Add $(tests_skipped).
    * tests/gpg/.gitignore: Add t-cancel.
    
    Signed-off-by: Daiki Ueno <ueno at gnu.org>

diff --git a/tests/gpg/.gitignore b/tests/gpg/.gitignore
index d79ace7..cd193f7 100644
--- a/tests/gpg/.gitignore
+++ b/tests/gpg/.gitignore
@@ -6,6 +6,7 @@ gpg.conf
 pubring.gpg
 pubring.gpg~
 secring.gpg
+t-cancel
 t-decrypt
 t-decrypt-verify
 t-edit
diff --git a/tests/gpg/Makefile.am b/tests/gpg/Makefile.am
index 9877843..2538f63 100644
--- a/tests/gpg/Makefile.am
+++ b/tests/gpg/Makefile.am
@@ -62,9 +62,17 @@ AM_CPPFLAGS = -I$(top_builddir)/src @GPG_ERROR_CFLAGS@
 AM_LDFLAGS = -no-install
 LDADD = ../../src/libgpgme.la
 t_thread1_LDADD = ../../src/libgpgme-pthread.la -lpthread
+t_cancel_LDADD = ../../src/libgpgme-pthread.la -lpthread
+
+# We don't run t-genkey and t-cancel in the test suite, because it
+# takes too long
+tests_skipped = t-genkey
+if !HAVE_W32_SYSTEM
+tests_skipped += t-cancel
+endif
+
+noinst_PROGRAMS = $(c_tests) $(tests_skipped)
 
-# We don't run t-genkey in the test suite, because it takes too long
-noinst_PROGRAMS = $(c_tests) t-genkey
 
 clean-local:
 	-$(top_srcdir)/tests/start-stop-agent --stop
diff --git a/tests/gpg/t-cancel.c b/tests/gpg/t-cancel.c
new file mode 100644
index 0000000..af98af9
--- /dev/null
+++ b/tests/gpg/t-cancel.c
@@ -0,0 +1,265 @@
+/* t-thread-cancel.c - Regression test.
+   Copyright (C) 2000 Werner Koch (dd9jn)
+   Copyright (C) 2001, 2003, 2004 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 Lesser General Public License as
+   published by the Free Software Foundation; either version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser 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.  */
+
+/* We need to include config.h so that we know whether we are building
+   with large file system (LFS) support. */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <limits.h>
+#include <ctype.h>
+#include <errno.h>
+#include <unistd.h>
+#include <pthread.h>
+
+#include <gpgme.h>
+
+#include "t-support.h"
+
+struct op_result
+{
+  int done;
+  gpgme_error_t err;
+};
+
+static struct op_result op_result;
+
+struct one_fd
+{
+  int fd;
+  int dir;
+  gpgme_io_cb_t fnc;
+  void *fnc_data;
+};
+
+#define FDLIST_MAX 32
+static struct one_fd fdlist[FDLIST_MAX];
+
+static pthread_mutex_t lock;
+
+static gpgme_error_t
+add_io_cb (void *data, int fd, int dir, gpgme_io_cb_t fnc, void *fnc_data,
+           void **r_tag)
+{
+  struct one_fd *fds = data;
+  int i;
+
+  pthread_mutex_lock (&lock);
+  for (i = 0; i < FDLIST_MAX; i++)
+    {
+      if (fds[i].fd == -1)
+        {
+          fds[i].fd = fd;
+          fds[i].dir = dir;
+          fds[i].fnc = fnc;
+          fds[i].fnc_data = fnc_data;
+          break;
+        }
+    }
+  pthread_mutex_unlock (&lock);
+  if (i == FDLIST_MAX)
+    return gpgme_err_make (GPG_ERR_SOURCE_USER_1, GPG_ERR_GENERAL);
+  *r_tag = &fds[i];
+  return 0;
+}
+
+static void
+remove_io_cb (void *tag)
+{
+  struct one_fd *fd = tag;
+
+  pthread_mutex_lock (&lock);
+  fd->fd = -1;
+  pthread_mutex_unlock (&lock);
+}
+
+static void
+io_event (void *data, gpgme_event_io_t type, void *type_data)
+{
+  struct op_result *result = data;
+
+  if (type == GPGME_EVENT_DONE)
+    {
+      result->done = 1;
+      result->err = * (gpgme_error_t *) type_data;
+    }
+}
+
+
+static int
+do_select (void)
+{
+  fd_set rfds;
+  fd_set wfds;
+  int i, n;
+  int any = 0;
+  struct timeval tv;
+
+  pthread_mutex_lock (&lock);
+  FD_ZERO (&rfds);
+  FD_ZERO (&wfds);
+  for (i = 0; i < FDLIST_MAX; i++)
+    if (fdlist[i].fd != -1)
+      FD_SET (fdlist[i].fd, fdlist[i].dir ? &rfds : &wfds);
+  pthread_mutex_unlock (&lock);
+
+  tv.tv_sec = 0;
+  tv.tv_usec = 1000;
+
+  do
+    {
+      n = select (FD_SETSIZE, &rfds, &wfds, NULL, &tv);
+    }
+  while (n < 0 && errno == EINTR);
+
+  if (n < 0)
+    return n;   /* Error or timeout.  */
+
+  pthread_mutex_lock (&lock);
+  for (i = 0; i < FDLIST_MAX && n; i++)
+    {
+      if (fdlist[i].fd != -1)
+        {
+          if (FD_ISSET (fdlist[i].fd, fdlist[i].dir ? &rfds : &wfds))
+            {
+              assert (n);
+              n--;
+              any = 1;
+              (*fdlist[i].fnc) (fdlist[i].fnc_data, fdlist[i].fd);
+            }
+        }
+    }
+  pthread_mutex_unlock (&lock);
+  return any;
+}
+
+static int
+my_wait (void)
+{
+  int n;
+
+  do
+    {
+      n = do_select ();
+    }
+  while (n >= 0 && !op_result.done);
+  return 0;
+}
+
+
+static struct gpgme_io_cbs io_cbs =
+  {
+    add_io_cb,
+    fdlist,
+    remove_io_cb,
+    io_event,
+    &op_result
+  };
+
+
+static void *
+thread_cancel (void *data)
+{
+  gpgme_ctx_t ctx = data;
+  gpgme_error_t err;
+
+  usleep (100000);
+  err = gpgme_cancel (ctx);
+  fail_if_err (err);
+
+  return NULL;
+}
+
+int
+main (void)
+{
+  gpgme_ctx_t ctx;
+  gpgme_error_t err;
+  gpgme_engine_info_t info;
+  int i;
+  pthread_mutexattr_t attr;
+  pthread_t tcancel;
+  const char *parms = "<GnupgKeyParms format=\"internal\">\n"
+    "Key-Type: RSA\n"
+    "Key-Length: 2048\n"
+    "Subkey-Type: RSA\n"
+    "Subkey-Length: 2048\n"
+    "Name-Real: Joe Tester\n"
+    "Name-Comment: (pp=abc)\n"
+    "Name-Email: joe at foo.bar\n"
+    "Expire-Date: 0\n"
+    "Passphrase: abc\n"
+    "</GnupgKeyParms>\n";
+
+  init_gpgme (GPGME_PROTOCOL_OpenPGP);
+
+  err = gpgme_get_engine_info (&info);
+  fail_if_err (err);
+
+  /* The mutex must be recursive, since remove_io_cb (which acquires a
+     lock) can be called while holding a lock acquired in do_select.  */
+  pthread_mutexattr_init (&attr);
+  pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE);
+  pthread_mutex_init (&lock, &attr);
+  pthread_mutexattr_destroy (&attr);
+
+  for (i = 0; i < FDLIST_MAX; i++)
+    fdlist[i].fd = -1;
+
+  err = gpgme_new (&ctx);
+  fail_if_err (err);
+  gpgme_set_armor (ctx, 1);
+  gpgme_set_io_cbs (ctx, &io_cbs);
+  op_result.done = 0;
+
+  pthread_create (&tcancel, NULL, thread_cancel, ctx);
+
+  err = gpgme_op_genkey_start (ctx, parms, NULL, NULL);
+  fail_if_err (err);
+
+  my_wait ();
+
+  pthread_join (tcancel, NULL);
+
+  if (op_result.err)
+    {
+      if (gpgme_err_code (op_result.err) == GPG_ERR_CANCELED)
+	fputs ("Successfully cancelled\n", stdout);
+      else
+	{
+	  fprintf (stderr,
+		   "%s:%i: Operation finished with unexpected error: %s\n",
+		   __FILE__, __LINE__, gpgme_strerror (op_result.err));
+	  exit (1);
+	}
+    }
+  else
+    fputs ("Successfully finished before cancellation\n", stdout);
+
+  gpgme_release (ctx);
+
+  return 0;
+}

commit dee56820cabde60c43c9bf8281b8d411cb2ad644
Author: Daiki Ueno <ueno at gnu.org>
Date:   Tue Feb 9 17:03:53 2016 +0900

    gpg: Add option --exit-on-status-write-error
    
    * src/engine-gpg.c (gpg_new): Add --exit-on-status-write-error if the
    engine version is latest enough to expect progress output from gpg.
    
    --
    GnuPG-bug-id: 1415
    Signed-off-by: Daiki Ueno <ueno at gnu.org>
    
    Changed the version test from the patch to use the newer
    have_gpg_version.
    
    Signed-off-by: Werner Koch <wk at gnupg.org>

diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index 8bb348f..3f1d34d 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -544,6 +544,8 @@ gpg_new (void **engine, const char *file_name, const char *home_dir,
     rc = add_arg (gpg, "utf8");
   if (!rc)
     rc = add_arg (gpg, "--enable-progress-filter");
+  if (!rc && have_gpg_version (gpg, "2.1.11"))
+    rc = add_arg (gpg, "--exit-on-status-write-error");
   if (rc)
     goto leave;
 

commit d0cf6b15121c9b42dbcef243e5ce30c9996a449c
Author: Daiki Ueno <ueno at gnu.org>
Date:   Tue Feb 9 17:03:51 2016 +0900

    tests: Fix select usage in t-eventloop
    
    * tests/gpg/t-eventloop.c (do_select): Supply timeout value to select.
    
    Signed-off-by: Daiki Ueno <ueno at gnu.org>

diff --git a/tests/gpg/t-eventloop.c b/tests/gpg/t-eventloop.c
index 74af35f..2d3df41 100644
--- a/tests/gpg/t-eventloop.c
+++ b/tests/gpg/t-eventloop.c
@@ -111,6 +111,7 @@ do_select (void)
   fd_set wfds;
   int i, n;
   int any = 0;
+  struct timeval tv;
 
   FD_ZERO (&rfds);
   FD_ZERO (&wfds);
@@ -118,9 +119,12 @@ do_select (void)
     if (fdlist[i].fd != -1)
       FD_SET (fdlist[i].fd, fdlist[i].dir ? &rfds : &wfds);
 
+  tv.tv_sec = 0;
+  tv.tv_usec = 1000;
+
   do
     {
-      n = select (FD_SETSIZE, &rfds, &wfds, NULL, 0);
+      n = select (FD_SETSIZE, &rfds, &wfds, NULL, &tv);
     }
   while (n < 0 && errno == EINTR);
 

commit 0aaf1dedd629446ab991fff76581b4b58e4872a0
Author: Daiki Ueno <ueno at gnu.org>
Date:   Tue Feb 9 17:03:50 2016 +0900

    doc: Fix minor errors in I/O callback example
    
    * gpgme.texi (I/O Callback Example): Fix typos, add timeout to select,
    and initialize mutex as recursive.
    
    Signed-off-by: Daiki Ueno <ueno at gnu.org>

diff --git a/doc/gpgme.texi b/doc/gpgme.texi
index ec7ebb7..6d6d692 100644
--- a/doc/gpgme.texi
+++ b/doc/gpgme.texi
@@ -6016,6 +6016,7 @@ do_select (struct event_loop *loop)
   fd_set wfds;
   int i, n;
   int any = 0;
+  struct timeval tv;
   struct one_fd *fdlist = loop->fds;
 
   pthread_mutex_lock (&loop->lock);
@@ -6024,11 +6025,14 @@ do_select (struct event_loop *loop)
   for (i = 0; i < MAX_FDS; i++)
     if (fdlist[i].fd != -1)
       FD_SET (fdlist[i].fd, fdlist[i].dir ? &rfds : &wfds);
-  pthread_mutex_unlock (&loop->unlock);
+  pthread_mutex_unlock (&loop->lock);
+
+  tv.tv_sec = 0;
+  tv.tv_usec = 1000;
 
   do
     @{
-      n = select (FD_SETSIZE, &rfds, &wfds, NULL, 0);
+      n = select (FD_SETSIZE, &rfds, &wfds, NULL, &tv);
     @}
   while (n < 0 && errno == EINTR);
 
@@ -6082,6 +6086,7 @@ main (int argc, char *argv[])
   gpgme_error_t err;
   gpgme_data_t sig, text;
   int i;
+  pthread_mutexattr_t attr;
   struct gpgme_io_cbs io_cbs =
   @{
     add_io_cb,
@@ -6091,12 +6096,19 @@ main (int argc, char *argv[])
     &result
   @};
 
-  init_gpgme (void);
+  init_gpgme ();
 
   /* Initialize the loop structure.  */
-  pthread_mutex_init (&loop.lock, NULL);
+
+  /* The mutex must be recursive, since remove_io_cb (which acquires a
+     lock) can be called while holding a lock acquired in do_select.  */
+  pthread_mutexattr_init (&attr);
+  pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE);
+  pthread_mutex_init (&loop.lock, &attr);
+  pthread_mutexattr_destroy (&attr);
+
   for (i = 0; i < MAX_FDS; i++)
-    loop->fds[i].fd = -1;
+    loop.fds[i].fd = -1;
 
   /* Initialize the result structure.  */
   result.done = 0;

-----------------------------------------------------------------------

Summary of changes:
 doc/gpgme.texi                          |  22 ++++-
 src/engine-gpg.c                        |   2 +
 tests/gpg/.gitignore                    |   1 +
 tests/gpg/Makefile.am                   |  12 ++-
 tests/gpg/{t-eventloop.c => t-cancel.c} | 166 ++++++++++++++++++++------------
 tests/gpg/t-eventloop.c                 |   6 +-
 6 files changed, 138 insertions(+), 71 deletions(-)
 copy tests/gpg/{t-eventloop.c => t-cancel.c} (52%)


hooks/post-receive
-- 
GnuPG Made Easy
http://git.gnupg.org




More information about the Gnupg-commits mailing list