From 421a4ba7e4a26332c271359a7a114a1da7a2afad Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Mon, 15 Apr 2024 23:00:12 +0100 Subject: [PATCH] vpick: add pick_filter_image_any filter that matches both dirs and images --- src/shared/discover-image.c | 4 ++-- src/shared/vpick.c | 38 +++++++++++++++++++++++-------------- src/shared/vpick.h | 3 ++- src/test/test-vpick.c | 2 +- src/vpick/vpick-tool.c | 2 +- 5 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/shared/discover-image.c b/src/shared/discover-image.c index b7a97f2b63..4e7a2049cf 100644 --- a/src/shared/discover-image.c +++ b/src/shared/discover-image.c @@ -639,7 +639,7 @@ int image_find(ImageClass class, .type_mask = endswith(suffix, ".raw") ? (UINT32_C(1) << DT_REG) | (UINT32_C(1) << DT_BLK) : (UINT32_C(1) << DT_DIR), .basename = name, .architecture = _ARCHITECTURE_INVALID, - .suffix = suffix, + .suffix = STRV_MAKE(suffix), }; _cleanup_(pick_result_done) PickResult result = PICK_RESULT_NULL; @@ -807,7 +807,7 @@ int image_discover( .type_mask = endswith(suffix, ".raw") ? (UINT32_C(1) << DT_REG) | (UINT32_C(1) << DT_BLK) : (UINT32_C(1) << DT_DIR), .basename = pretty, .architecture = _ARCHITECTURE_INVALID, - .suffix = suffix, + .suffix = STRV_MAKE(suffix), }; _cleanup_(pick_result_done) PickResult result = PICK_RESULT_NULL; diff --git a/src/shared/vpick.c b/src/shared/vpick.c index 1870fb97ef..41bd7301a0 100644 --- a/src/shared/vpick.c +++ b/src/shared/vpick.c @@ -85,8 +85,13 @@ static int format_fname( return -ENOMEM; } - if (filter->suffix && !strextend(&fn, filter->suffix)) - return -ENOMEM; + if (!strv_isempty(filter->suffix)) { + if (strv_length(filter->suffix) > 1) + return -ENOEXEC; + + if (!strextend(&fn, filter->suffix[0])) + return -ENOMEM; + } if (!filename_is_valid(fn)) return -EINVAL; @@ -352,8 +357,8 @@ static int make_choice( } else e = dname; - if (!isempty(filter->suffix)) { - char *sfx = endswith(e, filter->suffix); + if (!strv_isempty(filter->suffix)) { + char *sfx = endswith_strv(e, filter->suffix); if (!sfx) continue; @@ -493,7 +498,8 @@ int path_pick( PickResult *ret) { _cleanup_free_ char *filter_bname = NULL, *dir = NULL, *parent = NULL, *fname = NULL; - const char *filter_suffix, *enumeration_path; + char * const *filter_suffix_strv = NULL; + const char *filter_suffix = NULL, *enumeration_path; uint32_t filter_type_mask; int r; @@ -549,14 +555,12 @@ int path_pick( if (!filter_bname) return -ENOMEM; - if (filter->suffix) { - /* Chop off suffix, if specified */ - char *f = endswith(filter_bname, filter->suffix); - if (f) - *f = 0; - } + /* Chop off suffix, if specified */ + char *f = endswith_strv(filter_bname, filter->suffix); + if (f) + *f = 0; - filter_suffix = filter->suffix; + filter_suffix_strv = filter->suffix; filter_type_mask = filter->type_mask; enumeration_path = path; @@ -616,7 +620,7 @@ int path_pick( .basename = filter_bname, .version = filter->version, .architecture = filter->architecture, - .suffix = filter_suffix, + .suffix = filter_suffix_strv ?: STRV_MAKE(filter_suffix), }, flags, ret); @@ -685,10 +689,16 @@ int path_pick_update_warn( const PickFilter pick_filter_image_raw = { .type_mask = (UINT32_C(1) << DT_REG) | (UINT32_C(1) << DT_BLK), .architecture = _ARCHITECTURE_INVALID, - .suffix = ".raw", + .suffix = STRV_MAKE(".raw"), }; const PickFilter pick_filter_image_dir = { .type_mask = UINT32_C(1) << DT_DIR, .architecture = _ARCHITECTURE_INVALID, }; + +const PickFilter pick_filter_image_any = { + .type_mask = (UINT32_C(1) << DT_REG) | (UINT32_C(1) << DT_BLK) | (UINT32_C(1) << DT_DIR), + .architecture = _ARCHITECTURE_INVALID, + .suffix = STRV_MAKE(".raw", ""), +}; diff --git a/src/shared/vpick.h b/src/shared/vpick.h index 21ce668404..38251c84e8 100644 --- a/src/shared/vpick.h +++ b/src/shared/vpick.h @@ -16,7 +16,7 @@ typedef struct PickFilter { const char *basename; /* Can be overridden by search pattern */ const char *version; Architecture architecture; - const char *suffix; /* Can be overridden by search pattern */ + char * const *suffix; /* Can be overridden by search pattern */ } PickFilter; typedef struct PickResult { @@ -58,3 +58,4 @@ int path_pick_update_warn( extern const PickFilter pick_filter_image_raw; extern const PickFilter pick_filter_image_dir; +extern const PickFilter pick_filter_image_any; diff --git a/src/test/test-vpick.c b/src/test/test-vpick.c index feb16b61a4..88646ec053 100644 --- a/src/test/test-vpick.c +++ b/src/test/test-vpick.c @@ -47,7 +47,7 @@ TEST(path_pick) { PickFilter filter = { .architecture = _ARCHITECTURE_INVALID, - .suffix = ".raw", + .suffix = STRV_MAKE(".raw"), }; if (IN_SET(native_architecture(), ARCHITECTURE_X86, ARCHITECTURE_X86_64)) { diff --git a/src/vpick/vpick-tool.c b/src/vpick/vpick-tool.c index f3afc33a58..0504b7733b 100644 --- a/src/vpick/vpick-tool.c +++ b/src/vpick/vpick-tool.c @@ -241,7 +241,7 @@ static int run(int argc, char *argv[]) { .basename = arg_filter_basename, .version = arg_filter_version, .architecture = arg_filter_architecture, - .suffix = arg_filter_suffix, + .suffix = STRV_MAKE(arg_filter_suffix), .type_mask = arg_filter_type_mask, }, arg_flags, -- 2.25.1