[pacman-dev] [PATCH] (newgpg) Let pacman specify GnuPG's home directory.
Chris Brannon
cmbrannon at cox.net
Sun Dec 14 13:59:39 EST 2008
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 at cox.net>
---
doc/pacman.8.txt | 7 +++++++
doc/pacman.conf.5.txt | 6 ++++++
src/pacman/Makefile.am | 2 ++
src/pacman/conf.h | 1 +
src/pacman/pacman.c | 25 +++++++++++++++++++++++++
5 files changed, 41 insertions(+), 0 deletions(-)
diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt
index 6f071ba..a780627 100644
--- a/doc/pacman.8.txt
+++ b/doc/pacman.8.txt
@@ -136,6 +136,13 @@ Options
*\--config* <'file'>::
Specify an alternate configuration file.
+*\--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 8ef11ec..fa69bfa 100644
--- a/doc/pacman.conf.5.txt
+++ b/doc/pacman.conf.5.txt
@@ -69,6 +69,12 @@ Options
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 ``/etc/pacman.d/gnupg''.
+ This is an absolute path, and the root directory is not prepended.
+
*LogFile =* '/path/to/file'::
Overrides the default location of the pacman log file. A typical default
is ``/var/log/pacman.log''. This is an absolute path and the root directory
diff --git a/src/pacman/Makefile.am b/src/pacman/Makefile.am
index 220ee9c..4da6ef3 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 8ea6662..f491057 100644
--- a/src/pacman/conf.h
+++ b/src/pacman/conf.h
@@ -37,6 +37,7 @@ typedef struct __config_t {
char *rootdir;
char *dbpath;
char *logfile;
+ char *gpgdir;
/* TODO how to handle cachedirs? */
unsigned short op_q_isfile;
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index 3255cdf..18fd3a8 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -138,6 +138,7 @@ static void usage(int op, const char * const myname)
printf(_(" -q, --quiet show less information for query and search\n"));
}
printf(_(" --config <path> set an alternate configuration file\n"));
+ printf(_(" --gpgdir <path> set an alternate home directory for GnuPG\n"));
printf(_(" --logfile <path> set an alternate log file\n"));
printf(_(" --noconfirm do not ask for any confirmation\n"));
printf(_(" --noprogressbar do not show a progress bar when downloading files\n"));
@@ -306,6 +307,20 @@ 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);
@@ -366,6 +381,7 @@ static int parseargs(int argc, char *argv[])
{"debug", optional_argument, 0, 1003},
{"noprogressbar", no_argument, 0, 1004},
{"noscriptlet", no_argument, 0, 1005},
+ {"gpgdir", required_argument, 0, 1006},
{"cachedir", required_argument, 0, 1007},
{"asdeps", no_argument, 0, 1008},
{"logfile", required_argument, 0, 1009},
@@ -446,6 +462,9 @@ static int parseargs(int argc, char *argv[])
case 1012:
config->flags |= PM_TRANS_FLAG_ALLEXPLICIT;
break;
+ case 1006:
+ config->gpgdir = strdup(optarg);
+ break;
case 'Q': config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_QUERY); break;
case 'R': config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_REMOVE); break;
case 'S': config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_SYNC); break;
@@ -725,6 +744,11 @@ static int _parseconfig(const char *file, const char *givensection,
config->rootdir = strdup(ptr);
pm_printf(PM_LOG_DEBUG, "config: rootdir: %s\n", ptr);
}
+ } else if (strcmp(key, "GPGDir") == 0) {
+ if(!config->gpgdir) {
+ config->gpgdir = strdup(ptr);
+ pm_printf(PM_LOG_DEBUG, "config: gpgdir: %s\n", ptr);
+ }
} else if (strcmp(key, "LogFile") == 0) {
if(!config->logfile) {
config->logfile = strdup(ptr);
@@ -864,6 +888,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:
--
1.6.0.5
More information about the pacman-dev
mailing list