From 02ba35c1b6a2cbb3361b2f2ad507c53564b2be0b Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Fri, 27 Dec 2013 16:08:20 +0100 Subject: Locate engine names only at runtime and prefer GnuPG-2. * configure.ac (NEED_GPG_VERSION, NEED_GPGSM_VERSION) (NEED_G13_VERSION, NEED_GPGCONF_VERSION): Remove vars and all related checks. Do not check for any engine version. (HAVE_ASSUAN): Remove AM conditional. * src/Makefile.am: Remove separate component vars and always build all engines but uiserver. * src/dirinfo.c (WANT_GPGCONF_NAME): New. (struct dirinfo): Add field gpgconf_name. (_gpgme_get_default_gpgconf_name): Use WANT_GPGCONF_NAME. (get_gpgconf_item): Set gpgconf name and adjust for _gpgme_get_*_path now returning a malloced string. * src/engine.c (engine_ops): Always init all engines except for uiserver. * src/posix-util.c (_gpgme_get_gpgsm_path, _gpgme_get_g13_path): Remove unused functions. (walk_path): New. (_gpgme_get_gpg_path, _gpgme_get_gpgconf_path ): Re-implement using walk_path. * src/w32-util.c (_gpgme_get_gpgsm_path, _gpgme_get_g13_path): Remove unused functions. (_gpgme_get_gpg_path, _gpgme_get_gpgconf_path): Return a malloced string. * src/engine-g13.c (g13_get_req_version): Use a hardwired string with the required version. This info belongs into this file. * src/engine-gpg.c (gpg_get_req_version): Ditto. * src/engine-gpgconf.c (gpgconf_get_req_version): Ditto. * src/engine-gpgsm.c (gpgsm_get_req_version): Ditto. * tests/t-engine-info.c: Replace now useless test by an info output. * tests/gpg/Makefile.am (GPG, GPG_AGENT): Hardwire gpg and gpg-agent. * tests/gpgsm/Makefile.am (GPGSM): Hardwire gpgsm. Signed-off-by: Werner Koch --- src/posix-util.c | 73 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 30 deletions(-) (limited to 'src/posix-util.c') diff --git a/src/posix-util.c b/src/posix-util.c index fd445070..d4e4e3f4 100644 --- a/src/posix-util.c +++ b/src/posix-util.c @@ -30,47 +30,60 @@ #include "util.h" #include "sys-util.h" -const char * -_gpgme_get_gpg_path (void) -{ -#ifdef GPG_PATH - return GPG_PATH; -#else - return NULL; -#endif -} -const char * -_gpgme_get_gpgsm_path (void) +/* Find an executable program PGM along the envvar PATH. */ +static char * +walk_path (const char *pgm) { -#ifdef GPGSM_PATH - return GPGSM_PATH; -#else + const char *path, *s; + char *fname, *p; + + path = getenv ("PATH"); + if (!path) + path = "/bin:/usr/bin:."; + + fname = malloc (strlen (path) + 1 + strlen (pgm) + 1); + if (!fname) + return NULL; + + for (;;) + { + for (s=path, p=fname; *s && *s != ':'; s++, p++) + *p = *s; + if (*p != '/') + *p++ = '/'; + strcpy (p, pgm); + if (!access (fname, X_OK)) + return fname; + if (!*s) + break; + path = s + 1; + } + + free (fname); return NULL; -#endif } -const char * -_gpgme_get_gpgconf_path (void) + +/* Return the full file name of the GPG binary. This function is used + if gpgconf was not found and thus it can be assumed that gpg2 is + not installed. This function is only called by get_gpgconf_item + and may not be called concurrently. */ +char * +_gpgme_get_gpg_path (void) { -#ifdef GPGCONF_PATH - return GPGCONF_PATH; -#else - return NULL; -#endif + return walk_path ("gpg"); } -const char * -_gpgme_get_g13_path (void) + +/* This function is only called by get_gpgconf_item and may not be + called concurrently. */ +char * +_gpgme_get_gpgconf_path (void) { -#ifdef G13_PATH - return G13_PATH; -#else - return NULL; -#endif + return walk_path ("gpgconf"); } - /* See w32-util.c */ int _gpgme_get_conf_int (const char *key, int *value) -- cgit v1.2.3