summaryrefslogtreecommitdiff
path: root/src/posix-util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/posix-util.c')
-rw-r--r--src/posix-util.c113
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)