diff options
author | JinWang An <jinwang.an@samsung.com> | 2021-12-01 16:54:34 +0900 |
---|---|---|
committer | JinWang An <jinwang.an@samsung.com> | 2021-12-01 16:54:34 +0900 |
commit | 995a02825947cf6f11b67998d850c748d320c8cd (patch) | |
tree | 941ed2cd17bb2649ad441e9e49aaff3aeda987d3 /src/posix-util.c | |
parent | 446ad01df66cb2f4dd51d97ff02be16d765847e1 (diff) | |
download | gpgme-995a02825947cf6f11b67998d850c748d320c8cd.tar.gz gpgme-995a02825947cf6f11b67998d850c748d320c8cd.tar.bz2 gpgme-995a02825947cf6f11b67998d850c748d320c8cd.zip |
Imported Upstream version 1.5.0upstream/1.5.0
Diffstat (limited to 'src/posix-util.c')
-rw-r--r-- | src/posix-util.c | 113 |
1 files changed, 87 insertions, 26 deletions
diff --git a/src/posix-util.c b/src/posix-util.c index fd44507..f7e0a17 100644 --- a/src/posix-util.c +++ b/src/posix-util.c @@ -29,48 +29,109 @@ #include "util.h" #include "sys-util.h" +#include "debug.h" -const char * -_gpgme_get_gpg_path (void) +/* These variables store the malloced name of alternative default + binaries. The are set only once by gpgme_set_global_flag. */ +static char *default_gpg_name; +static char *default_gpgconf_name; + +/* Set the default name for the gpg binary. This function may only be + called by gpgme_set_global_flag. Returns 0 on success. Leading + directories are removed from NAME. */ +int +_gpgme_set_default_gpg_name (const char *name) { -#ifdef GPG_PATH - return GPG_PATH; -#else - return NULL; -#endif + const char *s; + + s = strrchr (name, '/'); + if (s) + name = s + 1; + + if (!default_gpg_name) + default_gpg_name = strdup (name); + return !default_gpg_name; } -const char * -_gpgme_get_gpgsm_path (void) +/* Set the default name for the gpgconf binary. This function may + only be called by gpgme_set_global_flag. Returns 0 on success. + Leading directories are removed from NAME. */ +int +_gpgme_set_default_gpgconf_name (const char *name) { -#ifdef GPGSM_PATH - return GPGSM_PATH; -#else - return NULL; -#endif + const char *s; + + s = strrchr (name, '/'); + if (s) + name = s + 1; + + if (!default_gpgconf_name) + default_gpgconf_name = strdup (name); + return !default_gpgconf_name; } -const char * -_gpgme_get_gpgconf_path (void) + +/* Find an executable program PGM along the envvar PATH. */ +static char * +walk_path (const char *pgm) { -#ifdef GPGCONF_PATH - return GPGCONF_PATH; + const char *orig_path, *path, *s; + char *fname, *p; + +#ifdef FIXED_SEARCH_PATH + orig_path = FIXED_SEARCH_PATH; #else - return NULL; + orig_path = getenv ("PATH"); + if (!orig_path) + orig_path = "/bin:/usr/bin"; #endif + + fname = malloc (strlen (orig_path) + 1 + strlen (pgm) + 1); + if (!fname) + return NULL; + + path = orig_path; + for (;;) + { + for (s=path, p=fname; *s && *s != ':'; s++, p++) + *p = *s; + if (p != fname && p[-1] != '/') + *p++ = '/'; + strcpy (p, pgm); + if (!access (fname, X_OK)) + return fname; + if (!*s) + break; + path = s + 1; + } + + _gpgme_debug (DEBUG_ENGINE, "gpgme-walk_path: '%s' not found in '%s'", + pgm, orig_path); + + free (fname); + return NULL; } -const char * -_gpgme_get_g13_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 G13_PATH - return G13_PATH; -#else - return NULL; -#endif + return walk_path (default_gpg_name? default_gpg_name : "gpg"); } +/* This function is only called by get_gpgconf_item and may not be + called concurrently. */ +char * +_gpgme_get_gpgconf_path (void) +{ + return walk_path (default_gpgconf_name? default_gpgconf_name : "gpgconf"); +} + /* See w32-util.c */ int _gpgme_get_conf_int (const char *key, int *value) |