---
 doc/pacman.conf.5.txt  |  8 ++++++++
 src/pacman/Makefile.am |  2 ++
 src/pacman/conf.c      | 22 ++++++++++++++++++++++
 src/pacman/conf.h      |  1 +
 4 files changed, 33 insertions(+)

diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt
index 383e072..b78d1fe 100644
--- a/doc/pacman.conf.5.txt
+++ b/doc/pacman.conf.5.txt
@@ -70,6 +70,14 @@ Options
        to the first cache directory with write access. *NOTE*: this is an 
absolute
        path, the root path is not automatically prepended.
 
+*HookDir =* path/to/hook/dir::
+       Add directories to search for alpm hooks.  A typical default is
+       +{sysconfdir}/pacman.d/hooks+.  Multiple directories can be specified 
with
+       hooks in later directories taking precedence over hooks in earlier
+       directories.  *NOTE*: this is an absolute path, the root path is not
+       automatically prepended.  For more information on the alpm hooks, see
+       linkman:alpm-hooks[5].
+
 *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/+.
diff --git a/src/pacman/Makefile.am b/src/pacman/Makefile.am
index d3ae071..b07c670 100644
--- a/src/pacman/Makefile.am
+++ b/src/pacman/Makefile.am
@@ -4,6 +4,7 @@ SUBDIRS = po
 conffile  = ${sysconfdir}/pacman.conf
 dbpath    = ${localstatedir}/lib/pacman/
 gpgdir    = ${sysconfdir}/pacman.d/gnupg/
+hookdir   = ${sysconfdir}/pacman.d/hooks/
 cachedir  = ${localstatedir}/cache/pacman/pkg/
 logfile   = ${localstatedir}/log/pacman.log
 
@@ -16,6 +17,7 @@ AM_CPPFLAGS = \
        -DCONFFILE=\"$(conffile)\" \
        -DDBPATH=\"$(dbpath)\" \
        -DGPGDIR=\"$(gpgdir)\" \
+       -DHOOKDIR=\"$(hookdir)\" \
        -DCACHEDIR=\"$(cachedir)\" \
        -DLOGFILE=\"$(logfile)\"
 
diff --git a/src/pacman/conf.c b/src/pacman/conf.c
index 738b026..552ebd3 100644
--- a/src/pacman/conf.c
+++ b/src/pacman/conf.c
@@ -146,6 +146,7 @@ int config_free(config_t *oldconfig)
        free(oldconfig->dbpath);
        free(oldconfig->logfile);
        free(oldconfig->gpgdir);
+       FREELIST(oldconfig->hookdirs);
        FREELIST(oldconfig->cachedirs);
        free(oldconfig->xfercommand);
        free(oldconfig->print_format);
@@ -515,6 +516,8 @@ static int _parse_options(const char *key, char *value,
                        setrepeatingoption(value, "HoldPkg", 
&(config->holdpkg));
                } else if(strcmp(key, "CacheDir") == 0) {
                        setrepeatingoption(value, "CacheDir", 
&(config->cachedirs));
+               } else if(strcmp(key, "HookDir") == 0) {
+                       setrepeatingoption(value, "HookDir", 
&(config->hookdirs));
                } else if(strcmp(key, "Architecture") == 0) {
                        if(!config->arch) {
                                config_set_arch(value);
@@ -751,6 +754,25 @@ static int setup_libalpm(void)
                return ret;
        }
 
+       /* Set user hook directory. This is not relative to rootdir, even if
+        * rootdir is defined. Reasoning: hookdir contains configuration data. 
*/
+       if(config->hookdirs == NULL) {
+               if((ret = alpm_option_add_hookdir(handle, HOOKDIR)) != 0) {
+                       pm_printf(ALPM_LOG_ERROR, _("problem adding hookdir 
'%s' (%s)\n"),
+                                       HOOKDIR, 
alpm_strerror(alpm_errno(handle)));
+                       return ret;
+               }
+       } else {
+               /* add hook directories 1-by-1 to avoid overwriting the system 
directory */
+               for(i = config->hookdirs; i; i = alpm_list_next(i)) {
+                       if((ret = alpm_option_add_hookdir(handle, i->data)) != 
0) {
+                               pm_printf(ALPM_LOG_ERROR, _("problem adding 
hookdir '%s' (%s)\n"),
+                                               (char *) i->data, 
alpm_strerror(alpm_errno(handle)));
+                               return ret;
+                       }
+               }
+       }
+
        /* add a default cachedir if one wasn't specified */
        if(config->cachedirs == NULL) {
                alpm_option_add_cachedir(handle, CACHEDIR);
diff --git a/src/pacman/conf.h b/src/pacman/conf.h
index 3fff900..7ccc4dc 100644
--- a/src/pacman/conf.h
+++ b/src/pacman/conf.h
@@ -66,6 +66,7 @@ typedef struct __config_t {
        char *dbpath;
        char *logfile;
        char *gpgdir;
+       alpm_list_t *hookdirs;
        alpm_list_t *cachedirs;
 
        unsigned short op_q_isfile;
-- 
2.5.2

Reply via email to