Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=579edd5f08bd95e25671bb77fd7869f6c81ac532
commit 579edd5f08bd95e25671bb77fd7869f6c81ac532 Author: Michel Hermier <[email protected]> Date: Sun Nov 3 11:50:05 2013 +0100 libpacman: Implements triggers invocation. diff --git a/lib/libpacman/handle.c b/lib/libpacman/handle.c index 63b2571..91dbaae 100644 --- a/lib/libpacman/handle.c +++ b/lib/libpacman/handle.c @@ -84,6 +84,7 @@ pmhandle_t *_pacman_handle_new() ph->dbpath = strdup(PM_DBPATH); ph->cachedir = strdup(PM_CACHEDIR); ph->hooksdir = strdup(PM_HOOKSDIR); + ph->triggersdir = strdup(PM_TRIGGERSDIR); ph->language = strdup(setlocale(LC_ALL, NULL)); diff --git a/lib/libpacman/handle.h b/lib/libpacman/handle.h index 6fa0b99..1b01743 100644 --- a/lib/libpacman/handle.h +++ b/lib/libpacman/handle.h @@ -51,6 +51,7 @@ struct __pmhandle_t { char *cachedir; char *logfile; char *hooksdir; + char *triggersdir; pmlist_t *noupgrade; /* List of strings */ pmlist_t *noextract; /* List of strings */ pmlist_t *ignorepkg; /* List of strings */ diff --git a/lib/libpacman/packages_transaction.c b/lib/libpacman/packages_transaction.c index 2808b2d..91dc619 100644 --- a/lib/libpacman/packages_transaction.c +++ b/lib/libpacman/packages_transaction.c @@ -19,29 +19,64 @@ * USA. */ +#include "config.h" + #include "packages_transaction.h" -#include <config.h> +#include "util/list.h" #include "util.h" +static const char *trigger_function_table[STATE_MAX] = { + [STATE_COMMITED] = "triggered", +}; + static int _pacman_packages_transaction_set_state(pmtrans_t *trans, int new_state) { - static const char *hooks[STATE_MAX] = { - [STATE_COMMITED] = "triggered", - }; + const char *root, *triggersdir, *trigger_function; + const pmlist_t *lp; + int retval = 0; + + triggersdir = trans->handle->triggersdir; + root = trans->handle->root; + trigger_function = trigger_function_table[new_state]; - if (new_state == STATE_COMMITED) { - return _pacman_runhook(hooks[new_state], trans); + if(_pacman_strempty(trigger_function)) { + /* Nothing to do */ + return 0; } - return 0; + + _pacman_log(PM_LOG_FLOW2, _("executing %s triggers..."), trigger_function); + + for(lp = trans->pretriggers; lp; lp = lp->next) { + const char *trigger = lp->data; + char buf[PATH_MAX]; + + snprintf(buf, sizeof(buf), "%s/%s/%s", root, triggersdir, trigger); + if(access(buf, F_OK) != 0) { /* FIXME: X_OK instead ? */ + _pacman_log(PM_LOG_WARNING, _("Skipping missing trigger file (%s)"), buf); + continue; + } +#if 0 + /* FIXME: do we really need this cheap optimisation ? */ + if(!grep(buf, trigger_function)) { + /* trigger_function not found in trigger */ + continue; + } +#endif + snprintf(buf, sizeof(buf), "source %s/%s %s", triggersdir, trigger, trigger_function); + retval = _pacman_chroot_system(buf, trans); + } + + return(retval); } int _pacman_packages_transaction_init(pmtrans_t *trans) { - ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, NULL)); + ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1)); trans->set_state = _pacman_packages_transaction_set_state; + return 0; } /* vim: set ts=2 sw=2 noet: */ diff --git a/lib/libpacman/pacman.h b/lib/libpacman/pacman.h index c817224..714210d 100644 --- a/lib/libpacman/pacman.h +++ b/lib/libpacman/pacman.h @@ -37,7 +37,7 @@ extern "C" { #define PM_CACHEDIR "var/cache/pacman-g2/pkg" #define PM_LOCK "/tmp/pacman-g2.lck" #define PM_HOOKSDIR "etc/pacman-g2/hooks" - +#define PM_TRIGGERSDIR "etc/pacman-g2/triggers" #define PM_EXT_PKG ".fpm" #define PM_EXT_DB ".fdb" diff --git a/lib/libpacman/util.c b/lib/libpacman/util.c index b031040..69ba272 100644 --- a/lib/libpacman/util.c +++ b/lib/libpacman/util.c @@ -451,7 +451,6 @@ static int grep(const char *fn, const char *needle) return(0); } -static int _pacman_chroot_system(const char *cmdline, pmtrans_t *trans) { pid_t pid; diff --git a/lib/libpacman/util.h b/lib/libpacman/util.h index 4f810bb..6bb7783 100644 --- a/lib/libpacman/util.h +++ b/lib/libpacman/util.h @@ -69,6 +69,7 @@ int _pacman_unpack(const char *archive, const char *prefix, const char *fn); int _pacman_rmrf(char *path); int _pacman_ldconfig(char *root); #ifdef _PACMAN_TRANS_H +int _pacman_chroot_system(const char *cmdline, pmtrans_t *trans); int _pacman_runscriptlet(char *util, char *installfn, const char *script, char *ver, char *oldver, pmtrans_t *trans); int _pacman_runhook(const char *hookname, pmtrans_t *trans); #ifndef __sun__ _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
