[pacman-dev] [PATCH 2/3] Optionally pass root path to fnmatch_patterns

Allan McRae allan at archlinux.org
Mon Nov 17 13:33:13 UTC 2014


When the system root is passed to fnmatch_patterns, it is stripped from
the start of the string before comparisions are made.

Signed-off-by: Allan McRae <allan at archlinux.org>
---
 lib/libalpm/add.c        | 4 ++--
 src/common/util-common.c | 9 ++++++++-
 src/common/util-common.h | 2 +-
 3 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index 9f7c9fa..604e0c7 100644
--- a/lib/libalpm/add.c
+++ b/lib/libalpm/add.c
@@ -190,7 +190,7 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
 	}
 
 	/* if a file is in NoExtract then we never extract it */
-	if(fnmatch_patterns(handle->noextract, entryname) == 0) {
+	if(fnmatch_patterns(handle->noextract, entryname, NULL) == 0) {
 		_alpm_log(handle, ALPM_LOG_DEBUG, "%s is in NoExtract,"
 				" skipping extraction of %s\n",
 				entryname, filename);
@@ -266,7 +266,7 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
 		} else {
 			/* case 3: */
 			/* if file is in NoUpgrade, don't touch it */
-			if(fnmatch_patterns(handle->noupgrade, entryname) == 0) {
+			if(fnmatch_patterns(handle->noupgrade, entryname, NULL) == 0) {
 				notouch = 1;
 			} else {
 				alpm_backup_t *backup;
diff --git a/src/common/util-common.c b/src/common/util-common.c
index 1930d64..63355a4 100644
--- a/src/common/util-common.c
+++ b/src/common/util-common.c
@@ -110,14 +110,21 @@ int llstat(char *path, struct stat *buf)
  * escaped. Subsequent matches override previous ones.
  * @param patterns patterns to match against
  * @param string string to check against pattern
+ * @param root prefix to be stripped from string before comparison
  * @return 0 if string matches pattern, negative if they don't match and
  * positive if the last match was inverted
  */
-int fnmatch_patterns(alpm_list_t *patterns, const char *string)
+int fnmatch_patterns(alpm_list_t *patterns, const char *string, const char *root)
 {
 	alpm_list_t *i;
 	char *pattern;
 	short inverted;
+	size_t len = 0;
+
+	if(root) {
+		len = strlen(root);
+	}
+	string = string + len;
 
 	for(i = alpm_list_last(patterns); i; i = alpm_list_previous(i)) {
 		pattern = i->data;
diff --git a/src/common/util-common.h b/src/common/util-common.h
index 17f8d87..e731e52 100644
--- a/src/common/util-common.h
+++ b/src/common/util-common.h
@@ -30,7 +30,7 @@ char *mdirname(const char *path);
 
 int llstat(char *path, struct stat *buf);
 
-int fnmatch_patterns(alpm_list_t *patterns, const char *string);
+int fnmatch_patterns(alpm_list_t *patterns, const char *string, const char *root);
 
 char *safe_fgets(char *s, int size, FILE *stream);
 
-- 
2.1.3


More information about the pacman-dev mailing list