[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