[pacman-dev] [PATCH 1/5] Rework the alpm_unpack functions

Xavier Chantry shiningxc at gmail.com
Sat Oct 10 21:09:55 EDT 2009


Add support to extract a list of entries

Signed-off-by: Xavier Chantry <shiningxc at gmail.com>
---
 lib/libalpm/trans.c |    2 +-
 lib/libalpm/util.c  |   55 ++++++++++++++++++++++++++++++++++++++++----------
 lib/libalpm/util.h  |    5 +++-
 3 files changed, 49 insertions(+), 13 deletions(-)

diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c
index c99f596..6f5216e 100644
--- a/lib/libalpm/trans.c
+++ b/lib/libalpm/trans.c
@@ -368,7 +368,7 @@ int _alpm_runscriptlet(const char *root, const char *installfn,
 	/* either extract or copy the scriptlet */
 	snprintf(scriptfn, PATH_MAX, "%s/.INSTALL", tmpdir);
 	if(!strcmp(script, "pre_upgrade") || !strcmp(script, "pre_install")) {
-		if(_alpm_unpack(installfn, tmpdir, ".INSTALL")) {
+		if(_alpm_unpack_single(installfn, tmpdir, ".INSTALL")) {
 			retval = 1;
 		}
 	} else {
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index 381b116..5785497 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -241,14 +241,36 @@ int _alpm_lckrm()
 /* Compression functions */
 
 /**
- * @brief Unpack a specific file or all files in an archive.
+ * @brief Unpack a specific file in an archive.
  *
  * @param archive  the archive to unpack
  * @param prefix   where to extract the files
- * @param fn       a file within the archive to unpack or NULL for all
+ * @param fn       a file within the archive to unpack
  * @return 0 on success, 1 on failure
  */
-int _alpm_unpack(const char *archive, const char *prefix, const char *fn)
+int _alpm_unpack_single(const char *archive, const char *prefix, const char *fn)
+{
+	alpm_list_t *list = NULL;
+	int ret = 0;
+	if(fn == NULL) {
+		return(1);
+	}
+	list = alpm_list_add(list, (void *)fn);
+	ret = _alpm_unpack(archive, prefix, &list);
+	alpm_list_free(list);
+	return(ret);
+}
+
+/**
+ * @brief Unpack a list of files in an archive.
+ *
+ * @param archive  the archive to unpack
+ * @param prefix   where to extract the files
+ * @param list     a pointer to a list of files within the archive to unpack or
+ * NULL for all
+ * @return 0 on success, 1 on failure
+ */
+int _alpm_unpack(const char *archive, const char *prefix, alpm_list_t **list)
 {
 	int ret = 0;
 	mode_t oldmask;
@@ -259,6 +281,10 @@ int _alpm_unpack(const char *archive, const char *prefix, const char *fn)
 
 	ALPM_LOG_FUNC;
 
+	if(list && *list == NULL) {
+		return(0);
+	}
+
 	if((_archive = archive_read_new()) == NULL)
 		RET_ERR(PM_ERR_LIBARCHIVE, 1);
 
@@ -301,14 +327,18 @@ int _alpm_unpack(const char *archive, const char *prefix, const char *fn)
 			archive_entry_set_perm(entry, 0755);
 		}
 
-		/* If a specific file was requested skip entries that don't match. */
-		if (fn && strcmp(fn, entryname)) {
-			_alpm_log(PM_LOG_DEBUG, "skipping: %s\n", entryname);
-			if (archive_read_data_skip(_archive) != ARCHIVE_OK) {
-				ret = 1;
-				goto cleanup;
+		/* If specific files were requested, skip entries that don't match. */
+		if(list && *list != NULL) {
+			char *data = NULL;
+			*list = alpm_list_remove_str(*list, entryname, &data);
+			if(data == NULL) {
+				_alpm_log(PM_LOG_DEBUG, "skipping: %s\n", entryname);
+				if (archive_read_data_skip(_archive) != ARCHIVE_OK) {
+					ret = 1;
+					goto cleanup;
+				}
+				continue;
 			}
-			continue;
 		}
 
 		/* Extract the archive entry. */
@@ -324,12 +354,15 @@ int _alpm_unpack(const char *archive, const char *prefix, const char *fn)
 			goto cleanup;
 		}
 
-		if(fn) {
+		if(list && *list == NULL) {
 			break;
 		}
 	}
 
 cleanup:
+	if(list && *list != NULL) {
+		_alpm_log(PM_LOG_DEBUG, "not all entries were extracted\n");
+	}
 	umask(oldmask);
 	archive_read_finish(_archive);
 	if(restore_cwd) {
diff --git a/lib/libalpm/util.h b/lib/libalpm/util.h
index ccf169d..58a8607 100644
--- a/lib/libalpm/util.h
+++ b/lib/libalpm/util.h
@@ -26,6 +26,8 @@
 
 #include "config.h"
 
+#include "alpm_list.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdarg.h>
@@ -62,7 +64,8 @@ int _alpm_copyfile(const char *src, const char *dest);
 char *_alpm_strtrim(char *str);
 int _alpm_lckmk();
 int _alpm_lckrm();
-int _alpm_unpack(const char *archive, const char *prefix, const char *fn);
+int _alpm_unpack_single(const char *archive, const char *prefix, const char *fn);
+int _alpm_unpack(const char *archive, const char *prefix, alpm_list_t **list);
 int _alpm_rmrf(const char *path);
 int _alpm_logaction(unsigned short usesyslog, FILE *f, const char *fmt, va_list args);
 int _alpm_run_chroot(const char *root, const char *cmd);
-- 
1.6.4.4



More information about the pacman-dev mailing list