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

Andrew Gregory andrew.gregory.8 at gmail.com
Mon Nov 17 16:38:39 UTC 2014


On 11/17/14 at 11:33pm, Allan McRae wrote:
> 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;

Why do this here?  The caller can just as easily achieve this by calling
fnmatch_patterns(patterns, string + strlen(root)) and may even be able to avoid
duplicate strlen calls by caching the root length.

>  	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