vpick: add pick_filter_image_any filter that matches both dirs and images
This commit is contained in:
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user