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

Reply via email to