2001-01-30 16:00:50 +00:00
|
|
|
/* posix-util.c - Utility functions for Posix
|
2018-11-16 12:27:33 +00:00
|
|
|
* Copyright (C) 2001 Werner Koch (dd9jn)
|
|
|
|
* Copyright (C) 2001, 2002, 2004 g10 Code GmbH
|
|
|
|
*
|
|
|
|
* This file is part of GPGME.
|
|
|
|
*
|
|
|
|
* GPGME is free software; you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU Lesser General Public License as
|
|
|
|
* published by the Free Software Foundation; either version 2.1 of
|
|
|
|
* the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* GPGME is distributed in the hope that it will be useful, but
|
|
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this program; if not, see <https://gnu.org/licenses/>.
|
|
|
|
* SPDX-License-Identifier: LGPL-2.1-or-later
|
|
|
|
*/
|
2001-01-30 16:00:50 +00:00
|
|
|
|
2002-03-18 00:04:06 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
2001-01-30 16:00:50 +00:00
|
|
|
#include <config.h>
|
2002-03-18 00:04:06 +00:00
|
|
|
#endif
|
2001-01-30 16:00:50 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <assert.h>
|
|
|
|
|
|
|
|
#include "util.h"
|
2013-08-02 13:25:23 +00:00
|
|
|
#include "sys-util.h"
|
2014-01-06 16:16:52 +00:00
|
|
|
#include "debug.h"
|
|
|
|
|
|
|
|
/* 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)
|
|
|
|
{
|
|
|
|
const char *s;
|
|
|
|
|
|
|
|
s = strrchr (name, '/');
|
|
|
|
if (s)
|
|
|
|
name = s + 1;
|
|
|
|
|
|
|
|
if (!default_gpg_name)
|
|
|
|
default_gpg_name = strdup (name);
|
|
|
|
return !default_gpg_name;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* 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)
|
|
|
|
{
|
|
|
|
const char *s;
|
|
|
|
|
|
|
|
s = strrchr (name, '/');
|
|
|
|
if (s)
|
|
|
|
name = s + 1;
|
|
|
|
|
|
|
|
if (!default_gpgconf_name)
|
|
|
|
default_gpgconf_name = strdup (name);
|
|
|
|
return !default_gpgconf_name;
|
|
|
|
}
|
2001-01-30 16:00:50 +00:00
|
|
|
|
|
|
|
|
2015-10-28 15:24:30 +00:00
|
|
|
/* Dummy function - see w32-util.c for the actual code. */
|
|
|
|
int
|
|
|
|
_gpgme_set_override_inst_dir (const char *dir)
|
|
|
|
{
|
|
|
|
(void)dir;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-01-17 11:42:56 +00:00
|
|
|
/* Find an executable program in the colon seperated paths. */
|
2013-12-27 15:08:20 +00:00
|
|
|
static char *
|
2020-01-17 11:42:56 +00:00
|
|
|
walk_path_str (const char *path_str, const char *pgm)
|
2001-11-18 03:31:31 +00:00
|
|
|
{
|
2020-01-17 11:42:56 +00:00
|
|
|
const char *path, *s;
|
2013-12-27 15:08:20 +00:00
|
|
|
char *fname, *p;
|
|
|
|
|
2020-01-17 11:42:56 +00:00
|
|
|
fname = malloc (strlen (path_str) + 1 + strlen (pgm) + 1);
|
2013-12-27 15:08:20 +00:00
|
|
|
if (!fname)
|
|
|
|
return NULL;
|
|
|
|
|
2020-01-17 11:42:56 +00:00
|
|
|
path = path_str;
|
2013-12-27 15:08:20 +00:00
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
for (s=path, p=fname; *s && *s != ':'; s++, p++)
|
|
|
|
*p = *s;
|
2014-05-08 18:35:57 +00:00
|
|
|
if (p != fname && p[-1] != '/')
|
2013-12-27 15:08:20 +00:00
|
|
|
*p++ = '/';
|
|
|
|
strcpy (p, pgm);
|
|
|
|
if (!access (fname, X_OK))
|
|
|
|
return fname;
|
|
|
|
if (!*s)
|
|
|
|
break;
|
|
|
|
path = s + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
free (fname);
|
2001-11-18 03:31:31 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
2006-01-26 10:23:15 +00:00
|
|
|
|
2020-01-17 11:42:56 +00:00
|
|
|
/* Find an executable program PGM. */
|
|
|
|
static char *
|
|
|
|
find_executable (const char *pgm)
|
|
|
|
{
|
|
|
|
const char *orig_path;
|
|
|
|
char *ret;
|
|
|
|
|
|
|
|
#ifdef FIXED_SEARCH_PATH
|
|
|
|
orig_path = FIXED_SEARCH_PATH;
|
|
|
|
#else
|
|
|
|
orig_path = getenv ("PATH");
|
|
|
|
if (!orig_path)
|
|
|
|
orig_path = "/bin:/usr/bin";
|
|
|
|
#endif
|
|
|
|
ret = walk_path_str (orig_path, pgm);
|
|
|
|
|
|
|
|
if (!ret)
|
|
|
|
{
|
|
|
|
_gpgme_debug (NULL, DEBUG_ENGINE, -1, NULL, NULL, NULL,
|
|
|
|
"gpgme-walk_path: '%s' not found in '%s'",
|
|
|
|
pgm, orig_path);
|
|
|
|
}
|
|
|
|
#ifdef __APPLE__
|
|
|
|
/* On apple, especially when started through gpgme-json via
|
|
|
|
the browser interface we should look into some additional
|
|
|
|
fallback paths. */
|
|
|
|
const char *additional_path = "/usr/local/bin:/usr/local/MacGPG2/bin";
|
|
|
|
if (!ret)
|
|
|
|
{
|
|
|
|
ret = walk_path_str (additional_path, pgm);
|
|
|
|
}
|
|
|
|
if (!ret)
|
|
|
|
{
|
|
|
|
_gpgme_debug (NULL, DEBUG_ENGINE, -1, NULL, NULL, NULL,
|
|
|
|
"gpgme-walk_path: '%s' not found in '%s'",
|
|
|
|
pgm, additional_path);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2013-12-27 15:08:20 +00:00
|
|
|
|
|
|
|
/* 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)
|
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* configure.ac: Support gpgconf.
gpgme/
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (gpgconf_components): New variable.
(main_sources): Add gpgconf.c.
* gpgme.h (gpgme_protocol_t): New protocol GPGME_PROTOCOL_GPGCONF.
(gpgme_conf_level_t, gpgme_conf_type_t, gpgme_conf_arg_t)
(gpgme_conf_opt_t, gpgme_conf_comp_t, gpgme_conf_arg_new)
(gpgme_conf_arg_release, gpgme_conf_opt_change)
(gpgme_conf_release, gpgme_op_conf_load, gpgme_op_conf_save): New
types.
* gpgconf.c, engine-gpgconf.c: New files.
* engine.h: (_gpgme_engine_op_conf_load,
(_gpgme_engine_op_conf_save): New prototypes.
* op-support.c (_gpgme_op_reset): Ignore not implemented locale
function.
* posix-util.c (_gpgme_get_gpgconf_path): New function.
* w32-util.c (_gpgme_get_gpgconf_path): New function.
* engine-gpgsm.c:
(_gpgme_engine_ops_gpgsm): Add stubs for conf_load and conf_save.
* rungpg.c:
(_gpgme_engine_ops_gpg): Add stubs for conf_load and conf_save.
* gpgme.def: Add new gpgconf related interfaces.
* libgpgme.vers: Likewise.
* util.h (_gpgme_get_gpgconf_path): New prototype.
* gpgme.h (gpgme_protocol_t): Add GPGME_PROTOCOL_GPGCONF.
* engine-backend.h (_gpgme_engine_ops_gpgconf): New prototype.
(struct engine_ops): Add members for conf_load and conf_save.
* engine.c (engine_ops): Add _gpgme_engine_ops_gpgconf.
(_gpgme_engine_op_conf_load,
(_gpgme_engine_op_conf_save): New functions.
(gpgme_get_engine_info): Allow protocol GPGME_PROTOCOL_GPGCONF.
tests/
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpg/Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpgsm/Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpg/Makefile.am (TESTS): Add t-gpgconf.
t-gpgconf.c: New file.
2008-01-04 14:31:15 +00:00
|
|
|
{
|
2020-01-17 11:42:56 +00:00
|
|
|
return find_executable (default_gpg_name? default_gpg_name : "gpg");
|
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* configure.ac: Support gpgconf.
gpgme/
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (gpgconf_components): New variable.
(main_sources): Add gpgconf.c.
* gpgme.h (gpgme_protocol_t): New protocol GPGME_PROTOCOL_GPGCONF.
(gpgme_conf_level_t, gpgme_conf_type_t, gpgme_conf_arg_t)
(gpgme_conf_opt_t, gpgme_conf_comp_t, gpgme_conf_arg_new)
(gpgme_conf_arg_release, gpgme_conf_opt_change)
(gpgme_conf_release, gpgme_op_conf_load, gpgme_op_conf_save): New
types.
* gpgconf.c, engine-gpgconf.c: New files.
* engine.h: (_gpgme_engine_op_conf_load,
(_gpgme_engine_op_conf_save): New prototypes.
* op-support.c (_gpgme_op_reset): Ignore not implemented locale
function.
* posix-util.c (_gpgme_get_gpgconf_path): New function.
* w32-util.c (_gpgme_get_gpgconf_path): New function.
* engine-gpgsm.c:
(_gpgme_engine_ops_gpgsm): Add stubs for conf_load and conf_save.
* rungpg.c:
(_gpgme_engine_ops_gpg): Add stubs for conf_load and conf_save.
* gpgme.def: Add new gpgconf related interfaces.
* libgpgme.vers: Likewise.
* util.h (_gpgme_get_gpgconf_path): New prototype.
* gpgme.h (gpgme_protocol_t): Add GPGME_PROTOCOL_GPGCONF.
* engine-backend.h (_gpgme_engine_ops_gpgconf): New prototype.
(struct engine_ops): Add members for conf_load and conf_save.
* engine.c (engine_ops): Add _gpgme_engine_ops_gpgconf.
(_gpgme_engine_op_conf_load,
(_gpgme_engine_op_conf_save): New functions.
(gpgme_get_engine_info): Allow protocol GPGME_PROTOCOL_GPGCONF.
tests/
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpg/Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpgsm/Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpg/Makefile.am (TESTS): Add t-gpgconf.
t-gpgconf.c: New file.
2008-01-04 14:31:15 +00:00
|
|
|
}
|
|
|
|
|
2013-12-27 15:08:20 +00:00
|
|
|
|
|
|
|
/* This function is only called by get_gpgconf_item and may not be
|
|
|
|
called concurrently. */
|
|
|
|
char *
|
|
|
|
_gpgme_get_gpgconf_path (void)
|
2009-10-22 16:44:07 +00:00
|
|
|
{
|
2020-01-17 11:42:56 +00:00
|
|
|
return find_executable (default_gpgconf_name? default_gpgconf_name : "gpgconf");
|
2009-10-22 16:44:07 +00:00
|
|
|
}
|
|
|
|
|
2006-01-26 10:23:15 +00:00
|
|
|
/* See w32-util.c */
|
|
|
|
int
|
|
|
|
_gpgme_get_conf_int (const char *key, int *value)
|
|
|
|
{
|
2016-09-13 18:53:14 +00:00
|
|
|
(void)key;
|
|
|
|
(void)value;
|
2006-01-26 10:23:15 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2008-02-14 19:51:21 +00:00
|
|
|
|
2012-09-25 13:29:49 +00:00
|
|
|
void
|
2009-06-12 16:58:45 +00:00
|
|
|
_gpgme_allow_set_foreground_window (pid_t pid)
|
2008-02-14 19:51:21 +00:00
|
|
|
{
|
|
|
|
(void)pid;
|
|
|
|
/* Not needed. */
|
|
|
|
}
|
2019-04-09 11:42:58 +00:00
|
|
|
|
|
|
|
/* See w32-util.c */
|
|
|
|
int
|
|
|
|
_gpgme_access (const char *path, int mode)
|
|
|
|
{
|
|
|
|
return access (path, mode);
|
|
|
|
}
|