From bcfc0e8872053bb6cd14fa704829fe7aee4adbc6 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 29 Aug 2022 11:06:39 +0200 Subject: [PATCH] strv: modernize strv_fnmatch() a bit --- src/basic/strv.c | 27 ++++++++++++++++++++------- src/basic/strv.h | 2 +- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/basic/strv.c b/src/basic/strv.c index b2fe8d9d4e..eea34ca68d 100644 --- a/src/basic/strv.c +++ b/src/basic/strv.c @@ -828,13 +828,26 @@ char** strv_shell_escape(char **l, const char *bad) { return l; } -bool strv_fnmatch_full(char* const* patterns, const char *s, int flags, size_t *matched_pos) { - for (size_t i = 0; patterns && patterns[i]; i++) - if (fnmatch(patterns[i], s, flags) == 0) { - if (matched_pos) - *matched_pos = i; - return true; - } +bool strv_fnmatch_full( + char* const* patterns, + const char *s, + int flags, + size_t *ret_matched_pos) { + + assert(s); + + if (patterns) + for (size_t i = 0; patterns[i]; i++) + /* NB: We treat all fnmatch() errors as equivalent to FNM_NOMATCH, i.e. if fnmatch() fails to + * process the pattern for some reason we'll consider this equivalent to non-matching. */ + if (fnmatch(patterns[i], s, flags) == 0) { + if (ret_matched_pos) + *ret_matched_pos = i; + return true; + } + + if (ret_matched_pos) + *ret_matched_pos = SIZE_MAX; return false; } diff --git a/src/basic/strv.h b/src/basic/strv.h index 87ec6337bd..d6f5ac6ba5 100644 --- a/src/basic/strv.h +++ b/src/basic/strv.h @@ -240,7 +240,7 @@ void strv_print(char * const *l); char** strv_reverse(char **l); char** strv_shell_escape(char **l, const char *bad); -bool strv_fnmatch_full(char* const* patterns, const char *s, int flags, size_t *matched_pos); +bool strv_fnmatch_full(char* const* patterns, const char *s, int flags, size_t *ret_matched_pos); static inline bool strv_fnmatch(char* const* patterns, const char *s) { return strv_fnmatch_full(patterns, s, 0, NULL); }