vpick: add pick_filter_image_any filter that matches both dirs and images

This commit is contained in:
Luca Boccassi
2024-04-19 13:25:32 +01:00
parent dd37963aff
commit 421a4ba7e4
5 changed files with 30 additions and 19 deletions
+2 -2
View 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;
+24 -14
View 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", ""),
};
+2 -1
View 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;
+1 -1
View 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)) {
+1 -1
View 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,