]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
vpick: add pick_filter_image_any filter that matches both dirs and images
authorLuca Boccassi <bluca@debian.org>
Mon, 15 Apr 2024 22:00:12 +0000 (23:00 +0100)
committerLuca Boccassi <bluca@debian.org>
Fri, 19 Apr 2024 12:25:32 +0000 (13:25 +0100)
src/shared/discover-image.c
src/shared/vpick.c
src/shared/vpick.h
src/test/test-vpick.c
src/vpick/vpick-tool.c

index b7a97f2b63aa475e20d3b7cae2d5b69ae45772bb..4e7a2049cf4f1fde1e83a2cfd173676df3cb3a29 100644 (file)
@@ -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;
index 1870fb97ef7ed6aad4ea5306680d423f6ac48fb9..41bd7301a0c7cc4b4a71419a242659da41335d5e 100644 (file)
@@ -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", ""),
+};
index 21ce6684041efcaa02e58b744fde5432bf47801f..38251c84e8576706012b1d829332bba12809eb1a 100644 (file)
@@ -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;
index feb16b61a464487aa97150e055340e9d3d9bd3e5..88646ec053eb64cb762138a5faa39ec89315286a 100644 (file)
@@ -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)) {
index f3afc33a5897efb74e08c5780c59173ec88abc4b..0504b7733b7e91a9214c844b1dacbb32aca6bf9d 100644 (file)
@@ -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,