tests: Use gpgconf to stop the agent.
authorWerner Koch <wk@gnupg.org>
Thu, 23 Mar 2017 10:45:17 +0000 (11:45 +0100)
committerWerner Koch <wk@gnupg.org>
Thu, 23 Mar 2017 16:55:21 +0000 (17:55 +0100)
* tests/openpgp/defs.scm (stop-agent): Swap order of actions.  Kill
all daemons using gpgconf.
* tools/gpgconf.c (main) <aRemoveSocketDir>: Try to remove known
socketfails on rmdir failure.  Do no fail for ENONET.
--

Killing all daemons is not really required but it does not harm to be
prepared for the future.

Signed-off-by: Werner Koch <wk@gnupg.org>
tests/openpgp/defs.scm
tools/gpgconf.c

index 7c8e10a..e8d06c0 100644 (file)
                                "|--debug-quick-random")
                /bye)))
 
-;; Stop the agent and remove the socket dir.
+;; Stop the agent and other daemons and remove the socket dir.
 (define (stop-agent)
   (log "Stopping gpg-agent...")
+  (call-check `(,(tool 'gpgconf) --kill all))
   (catch (log "Warning: Removing socket directory failed.")
-        (call-popen `(,(tool 'gpgconf) --remove-socketdir) ""))
-  (call-check `(,(tool 'gpg-connect-agent) --verbose --no-autostart
-               killagent /bye)))
+        (call-popen `(,(tool 'gpgconf) --remove-socketdir) "")))
+
+
+;; end
index c6fb24e..d6bf9a2 100644 (file)
@@ -456,6 +456,7 @@ query_swdb (estream_t out, const char *name, const char *current_version)
 int
 main (int argc, char **argv)
 {
+  gpg_error_t err;
   ARGPARSE_ARGS pargs;
   const char *fname;
   int no_more_options = 0;
@@ -755,7 +756,42 @@ main (int argc, char **argv)
         else if (opt.dry_run)
           ;
         else if (rmdir (socketdir))
-          gc_error (1, errno, "error removing '%s'", socketdir);
+          {
+            /* If the director is not empty we first try to delet
+             * socket files.  */
+            err = gpg_error_from_syserror ();
+            if (gpg_err_code (err) == GPG_ERR_ENOTEMPTY
+                || gpg_err_code (err) == GPG_ERR_EEXIST)
+              {
+                static const char * const names[] = {
+                  GPG_AGENT_SOCK_NAME,
+                  GPG_AGENT_EXTRA_SOCK_NAME,
+                  GPG_AGENT_BROWSER_SOCK_NAME,
+                  GPG_AGENT_SSH_SOCK_NAME,
+                  SCDAEMON_SOCK_NAME,
+                  DIRMNGR_SOCK_NAME
+                };
+                int i;
+                char *p;
+
+                for (i=0; i < DIM(names); i++)
+                  {
+                    p = strconcat (socketdir , "/", names[i], NULL);
+                    if (p)
+                      gnupg_remove (p);
+                    xfree (p);
+                  }
+                if (rmdir (socketdir))
+                  gc_error (1, 0, "error removing '%s': %s",
+                            socketdir, gpg_strerror (err));
+              }
+            else if (gpg_err_code (err) == GPG_ERR_ENOENT)
+              gc_error (0, 0, "warning: removing '%s' failed: %s",
+                        socketdir, gpg_strerror (err));
+            else
+              gc_error (1, 0, "error removing '%s': %s",
+                        socketdir, gpg_strerror (err));
+          }
 
         xfree (socketdir);
       }