[pacman-dev] [PATCH v3 01/11] handle: add hookdirs option

Andrew Gregory andrew.gregory.8 at gmail.com
Sat Oct 17 00:28:23 UTC 2015


Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>
---
 lib/libalpm/Makefile.am |  1 +
 lib/libalpm/alpm.c      |  5 +++++
 lib/libalpm/alpm.h      |  9 ++++++++
 lib/libalpm/handle.c    | 59 +++++++++++++++++++++++++++++++++++++++++++++++++
 lib/libalpm/handle.h    |  1 +
 5 files changed, 75 insertions(+)

diff --git a/lib/libalpm/Makefile.am b/lib/libalpm/Makefile.am
index f66daed..1668da1 100644
--- a/lib/libalpm/Makefile.am
+++ b/lib/libalpm/Makefile.am
@@ -7,6 +7,7 @@ include_HEADERS = alpm_list.h alpm.h
 
 AM_CPPFLAGS = \
 	-imacros $(top_builddir)/config.h \
+	-DSYSHOOKDIR=\"@datarootdir@/libalpm/hooks/\" \
 	-DLOCALEDIR=\"@localedir@\"
 
 AM_CFLAGS = -pedantic -D_GNU_SOURCE $(WARNING_CFLAGS)
diff --git a/lib/libalpm/alpm.c b/lib/libalpm/alpm.c
index d77b43a..0798c0b 100644
--- a/lib/libalpm/alpm.c
+++ b/lib/libalpm/alpm.c
@@ -50,6 +50,7 @@ alpm_handle_t SYMEXPORT *alpm_initialize(const char *root, const char *dbpath,
 {
 	alpm_errno_t myerr;
 	const char *lf = "db.lck";
+	char *hookdir;
 	size_t lockfilelen;
 	alpm_handle_t *myhandle = _alpm_handle_new();
 
@@ -64,6 +65,10 @@ alpm_handle_t SYMEXPORT *alpm_initialize(const char *root, const char *dbpath,
 		goto cleanup;
 	}
 
+	MALLOC(hookdir, strlen(myhandle->root) + strlen(SYSHOOKDIR) + 1, goto cleanup);
+	sprintf(hookdir, "%s%s", myhandle->root, SYSHOOKDIR);
+	myhandle->hookdirs = alpm_list_add(NULL, hookdir);
+
 	/* set default database extension */
 	STRDUP(myhandle->dbext, ".db", goto cleanup);
 
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 594f0b6..f224927 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -775,6 +775,15 @@ int alpm_option_add_cachedir(alpm_handle_t *handle, const char *cachedir);
 int alpm_option_remove_cachedir(alpm_handle_t *handle, const char *cachedir);
 /** @} */
 
+/** @name Accessors to the list of package hook directories.
+ * @{
+ */
+alpm_list_t *alpm_option_get_hookdirs(alpm_handle_t *handle);
+int alpm_option_set_hookdirs(alpm_handle_t *handle, alpm_list_t *hookdirs);
+int alpm_option_add_hookdir(alpm_handle_t *handle, const char *hookdir);
+int alpm_option_remove_hookdir(alpm_handle_t *handle, const char *hookdir);
+/** @} */
+
 /** Returns the logfile name. */
 const char *alpm_option_get_logfile(alpm_handle_t *handle);
 /** Sets the logfile name. */
diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c
index a12ac50..98420b0 100644
--- a/lib/libalpm/handle.c
+++ b/lib/libalpm/handle.c
@@ -83,6 +83,7 @@ void _alpm_handle_free(alpm_handle_t *handle)
 	FREE(handle->dbpath);
 	FREE(handle->dbext);
 	FREELIST(handle->cachedirs);
+	FREELIST(handle->hookdirs);
 	FREE(handle->logfile);
 	FREE(handle->lockfile);
 	FREE(handle->arch);
@@ -207,6 +208,12 @@ const char SYMEXPORT *alpm_option_get_dbpath(alpm_handle_t *handle)
 	return handle->dbpath;
 }
 
+alpm_list_t SYMEXPORT *alpm_option_get_hookdirs(alpm_handle_t *handle)
+{
+	CHECK_HANDLE(handle, return NULL);
+	return handle->hookdirs;
+}
+
 alpm_list_t SYMEXPORT *alpm_option_get_cachedirs(alpm_handle_t *handle)
 {
 	CHECK_HANDLE(handle, return NULL);
@@ -387,6 +394,58 @@ alpm_errno_t _alpm_set_directory_option(const char *value,
 	return 0;
 }
 
+int SYMEXPORT alpm_option_add_hookdir(alpm_handle_t *handle, const char *hookdir)
+{
+	char *newhookdir;
+
+	CHECK_HANDLE(handle, return -1);
+	ASSERT(hookdir != NULL, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
+
+	newhookdir = canonicalize_path(hookdir);
+	if(!newhookdir) {
+		RET_ERR(handle, ALPM_ERR_MEMORY, -1);
+	}
+	handle->hookdirs = alpm_list_add(handle->hookdirs, newhookdir);
+	_alpm_log(handle, ALPM_LOG_DEBUG, "option 'hookdir' = %s\n", newhookdir);
+	return 0;
+}
+
+int SYMEXPORT alpm_option_set_hookdirs(alpm_handle_t *handle, alpm_list_t *hookdirs)
+{
+	alpm_list_t *i;
+	CHECK_HANDLE(handle, return -1);
+	if(handle->hookdirs) {
+		FREELIST(handle->hookdirs);
+	}
+	for(i = hookdirs; i; i = i->next) {
+		int ret = alpm_option_add_hookdir(handle, i->data);
+		if(ret) {
+			return ret;
+		}
+	}
+	return 0;
+}
+
+int SYMEXPORT alpm_option_remove_hookdir(alpm_handle_t *handle, const char *hookdir)
+{
+	char *vdata = NULL;
+	char *newhookdir;
+	CHECK_HANDLE(handle, return -1);
+	ASSERT(hookdir != NULL, RET_ERR(handle, ALPM_ERR_WRONG_ARGS, -1));
+
+	newhookdir = canonicalize_path(hookdir);
+	if(!newhookdir) {
+		RET_ERR(handle, ALPM_ERR_MEMORY, -1);
+	}
+	handle->hookdirs = alpm_list_remove_str(handle->hookdirs, newhookdir, &vdata);
+	FREE(newhookdir);
+	if(vdata != NULL) {
+		FREE(vdata);
+		return 1;
+	}
+	return 0;
+}
+
 int SYMEXPORT alpm_option_add_cachedir(alpm_handle_t *handle, const char *cachedir)
 {
 	char *newcachedir;
diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h
index 315d987..e252fbf 100644
--- a/lib/libalpm/handle.h
+++ b/lib/libalpm/handle.h
@@ -82,6 +82,7 @@ struct __alpm_handle_t {
 	char *lockfile;          /* Name of the lock file */
 	char *gpgdir;            /* Directory where GnuPG files are stored */
 	alpm_list_t *cachedirs;  /* Paths to pacman cache directories */
+	alpm_list_t *hookdirs;   /* Paths to hook directories */
 
 	/* package lists */
 	alpm_list_t *noupgrade;   /* List of packages NOT to be upgraded */
-- 
2.6.1


More information about the pacman-dev mailing list