summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Brannon <cmbrannon@cox.net>2008-12-14 12:59:39 -0600
committerDan McGee <dan@archlinux.org>2011-03-23 03:22:36 -0500
commitac88e90557089763db82038105dd8e50e7ec8773 (patch)
treeb84c2b493ad12552bec03f99bd6400b4e34513ef
parent5b962f0d1c3908d057354df1a42dc2056e8b87f5 (diff)
downloadpacman-ac88e90557089763db82038105dd8e50e7ec8773.tar.xz
Let pacman specify GnuPG's home directory.
GnuPG looks for configuration files and keyrings in its home directory. For a user, that is typically ~/.gnupg. This patch causes pacman to use /etc/pacman.d/gnupg/ as the default GnuPG home. One may override the default using --gpgdir on the command-line or GPGDir in pacman's configuration file. Signed-off-by: Chris Brannon <cmbrannon@cox.net> Signed-off-by: Xavier Chantry <shiningxc@gmail.com> Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--doc/pacman.8.txt7
-rw-r--r--doc/pacman.conf.5.txt9
-rw-r--r--src/pacman/Makefile.am2
-rw-r--r--src/pacman/conf.h4
-rw-r--r--src/pacman/pacman.c22
5 files changed, 43 insertions, 1 deletions
diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt
index b727269b..f638123d 100644
--- a/doc/pacman.8.txt
+++ b/doc/pacman.8.txt
@@ -149,6 +149,13 @@ Options
Display debug messages. When reporting bugs, this option is recommended
to be used.
+*\--gpgdir* <dir>::
+ Specify a directory of files used by GnuPG to verify package signatures.
+ This directory should contain two files: `pubring.gpg` and `trustdb.gpg`.
+ `pubring.gpg` holds the public keys of all packagers. `trustdb.gpg`
+ contains a so-called trust database, which specifies that the keys are
+ authentic and trusted.
+
*\--logfile* <file>::
Specify an alternate log file. This is an absolute path, regardless of
the installation root setting.
diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt
index bfa07458..ca1f8833 100644
--- a/doc/pacman.conf.5.txt
+++ b/doc/pacman.conf.5.txt
@@ -69,6 +69,15 @@ Options
to the first cache directory with write access. *NOTE*: this is an absolute
path, the root path is not automatically prepended.
+*GPGDir =* path/to/gpg/dir::
+ Overrides the default location of the directory containing configuration
+ files for GnuPG. A typical default is `{sysconfdir}/pacman.d/gnupg/`.
+ This directory should contain two files: `pubring.gpg` and `trustdb.gpg`.
+ `pubring.gpg` holds the public keys of all packagers. `trustdb.gpg`
+ contains a so-called trust database, which specifies that the keys are
+ authentic and trusted.
+ *NOTE*: this is an absolute path, the root path is not automatically
+ prepended.
*LogFile =* '/path/to/file'::
Overrides the default location of the pacman log file. A typical default
diff --git a/src/pacman/Makefile.am b/src/pacman/Makefile.am
index 31e8b134..333b8193 100644
--- a/src/pacman/Makefile.am
+++ b/src/pacman/Makefile.am
@@ -1,6 +1,7 @@
# paths set at make time
conffile = ${sysconfdir}/pacman.conf
dbpath = ${localstatedir}/lib/pacman/
+gpgdir = ${sysconfdir}/pacman.d/gnupg/
cachedir = ${localstatedir}/cache/pacman/pkg/
logfile = ${localstatedir}/log/pacman.log
@@ -10,6 +11,7 @@ DEFS = -DLOCALEDIR=\"@localedir@\" \
-DCONFFILE=\"$(conffile)\" \
-DROOTDIR=\"$(ROOTDIR)\" \
-DDBPATH=\"$(dbpath)\" \
+ -DGPGDIR=\"$(gpgdir)\" \
-DCACHEDIR=\"$(cachedir)\" \
-DLOGFILE=\"$(logfile)\" \
@DEFS@
diff --git a/src/pacman/conf.h b/src/pacman/conf.h
index 92c379fc..bb11bab2 100644
--- a/src/pacman/conf.h
+++ b/src/pacman/conf.h
@@ -40,6 +40,7 @@ typedef struct __config_t {
char *rootdir;
char *dbpath;
char *logfile;
+ char *gpgdir;
/* TODO how to handle cachedirs? */
unsigned short op_q_isfile;
@@ -106,7 +107,8 @@ enum {
OP_NEEDED,
OP_ASEXPLICIT,
OP_ARCH,
- OP_PRINTFORMAT
+ OP_PRINTFORMAT,
+ OP_GPGDIR
};
/* clean method */
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index e4555c03..706e97be 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -202,6 +202,7 @@ static void usage(int op, const char * const myname)
addlist(_(" --cachedir <dir> set an alternate package cache location\n"));
addlist(_(" --config <path> set an alternate configuration file\n"));
addlist(_(" --debug display debug messages\n"));
+ addlist(_(" --gpgdir <path> set an alternate home directory for GnuPG\n"));
addlist(_(" --logfile <path> set an alternate log file\n"));
addlist(_(" --noconfirm do not ask for any confirmation\n"));
}
@@ -385,6 +386,17 @@ static void setlibpaths(void)
}
}
+ /* Set GnuPG's home directory. This is not relative to rootdir, even if
+ * rootdir is defined. Reasoning: gpgdir contains configuration data. */
+ if(config->gpgdir) {
+ ret = alpm_option_set_signaturedir(config->gpgdir);
+ if(ret != 0) {
+ pm_printf(PM_LOG_ERROR, _("problem setting gpgdir '%s' (%s)\n"),
+ config->gpgdir, alpm_strerrorlast());
+ cleanup(ret);
+ }
+ }
+
/* add a default cachedir if one wasn't specified */
if(alpm_option_get_cachedirs() == NULL) {
alpm_option_add_cachedir(CACHEDIR);
@@ -500,6 +512,9 @@ static int parsearg_global(int opt)
/* progress bars get wonky with debug on, shut them off */
config->noprogressbar = 1;
break;
+ case OP_GPGDIR:
+ config->gpgdir = strdup(optarg);
+ break;
case OP_LOGFILE:
check_optarg();
config->logfile = strndup(optarg, PATH_MAX);
@@ -701,6 +716,7 @@ static int parseargs(int argc, char *argv[])
{"asexplicit", no_argument, 0, OP_ASEXPLICIT},
{"arch", required_argument, 0, OP_ARCH},
{"print-format", required_argument, 0, OP_PRINTFORMAT},
+ {"gpgdir", required_argument, 0, OP_GPGDIR},
{0, 0, 0, 0}
};
@@ -1017,6 +1033,11 @@ static int _parse_options(const char *key, char *value,
config->rootdir = strdup(value);
pm_printf(PM_LOG_DEBUG, "config: rootdir: %s\n", value);
}
+ } else if (strcmp(key, "GPGDir") == 0) {
+ if(!config->gpgdir) {
+ config->gpgdir = strdup(value);
+ pm_printf(PM_LOG_DEBUG, "config: gpgdir: %s\n", value);
+ }
} else if (strcmp(key, "LogFile") == 0) {
if(!config->logfile) {
config->logfile = strdup(value);
@@ -1340,6 +1361,7 @@ int main(int argc, char *argv[])
/* define paths to reasonable defaults */
alpm_option_set_root(ROOTDIR);
alpm_option_set_dbpath(DBPATH);
+ alpm_option_set_signaturedir(GPGDIR);
alpm_option_set_logfile(LOGFILE);
/* Priority of options: