From 2c9d9ac55ea455a5ec26428989dced0311ed46cc Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Thu, 23 Mar 2017 11:45:17 +0100 Subject: [PATCH] tests: Use gpgconf to stop the agent. * tests/openpgp/defs.scm (stop-agent): Swap order of actions. Kill all daemons using gpgconf. * tools/gpgconf.c (main) : 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 --- tests/openpgp/defs.scm | 10 ++++++---- tools/gpgconf.c | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/tests/openpgp/defs.scm b/tests/openpgp/defs.scm index 7c8e10a7e..e8d06c048 100644 --- a/tests/openpgp/defs.scm +++ b/tests/openpgp/defs.scm @@ -453,10 +453,12 @@ "|--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 diff --git a/tools/gpgconf.c b/tools/gpgconf.c index c6fb24e61..d6bf9a26a 100644 --- a/tools/gpgconf.c +++ b/tools/gpgconf.c @@ -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); }