sysupdate: add feature select

Prepartion for the next commit: also allow selecting the all or
suggested features.
This commit is contained in:
Lennart Poettering
2026-07-13 17:36:10 +02:00
parent 52d9906a54
commit f23224a7ca
2 changed files with 32 additions and 0 deletions
+31
View File
@@ -65,6 +65,7 @@ static char *arg_root = NULL;
static char *arg_image = NULL;
static bool arg_reboot = false;
static int arg_cleanup = -1;
static SelectMode arg_feature_select = SELECT_EXPLICIT;
static char *arg_component = NULL;
static SelectMode arg_component_select = SELECT_EXPLICIT;
static int arg_verify = -1;
@@ -144,6 +145,7 @@ static int context_from_cmdline(Context *ret) {
context.offline = arg_offline;
context.cleanup = arg_cleanup;
context.component_select = arg_component_select;
context.feature_select = arg_feature_select;
if (strdup_to(&context.definitions, arg_definitions) < 0)
return log_oom();
@@ -185,6 +187,7 @@ static int context_from_base_with_component(const Context *base, const char *com
context.verify = base->verify;
context.offline = base->offline;
context.cleanup = base->cleanup;
context.feature_select = base->feature_select;
if (strdup_to(&context.root, base->root) < 0)
return log_oom();
@@ -1763,6 +1766,8 @@ static int verb_list(int argc, char *argv[], uintptr_t _data, void *userdata) {
if (r < 0)
return r;
if (context.feature_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--feature-all/--feature-suggested is not supported for '%s'.", argv[0]);
if (context.component_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "--component-all/--component-suggested currently not supported for '%s'.", argv[0]);
@@ -1839,6 +1844,8 @@ static int verb_features(int argc, char *argv[], uintptr_t _data, void *userdata
if (r < 0)
return r;
if (context.feature_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--feature-all/--feature-suggested is not supported for '%s'.", argv[0]);
if (context.component_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "--component-all/--component-suggested currently not supported for '%s'.", argv[0]);
@@ -2031,6 +2038,8 @@ static int verb_enable_feature(int argc, char *argv[], uintptr_t _data, void *us
if (r < 0)
return r;
if (context.feature_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--feature-all/--feature-suggested is not supported for '%s'.", argv[0]);
if (context.component_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "--component-all currently not supported for '%s'.", argv[0]);
@@ -2090,6 +2099,8 @@ static int verb_check_new(int argc, char *argv[], uintptr_t _data, void *userdat
if (r < 0)
return r;
if (context.feature_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--feature-all/--feature-suggested is not supported for '%s'.", argv[0]);
if (context.component_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "--component-all/--component-suggested currently not supported for '%s'.", argv[0]);
@@ -2195,6 +2206,8 @@ static int verb_update_impl(int argc, char **argv, UpdateActionFlags action_flag
if (r < 0)
return r;
if (context.feature_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--feature-all/--feature-suggested is not supported for '%s'.", argv[0]);
if (context.component_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "--component-all/--component-suggested currently not supported for '%s'.", argv[0]);
@@ -2309,6 +2322,8 @@ static int verb_vacuum(int argc, char *argv[], uintptr_t _data, void *userdata)
if (r < 0)
return r;
if (context.feature_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--feature-all/--feature-suggested is not supported for '%s'.", argv[0]);
if (context.component_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "--component-all/--component-suggested currently not supported for '%s'.", argv[0]);
@@ -2340,6 +2355,8 @@ static int verb_cleanup(int argc, char *argv[], uintptr_t _data, void *userdata)
if (context.cleanup == 0)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invocation of 'cleanup' with --cleanup=no is contradictory, refusing.");
if (context.feature_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--feature-all/--feature-suggested is not supported for '%s'.", argv[0]);
if (!IN_SET(context.component_select, SELECT_EXPLICIT, SELECT_ALL))
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "--component-suggested currently not supported for '%s'.", argv[0]);
@@ -2405,6 +2422,8 @@ static int verb_pending_or_reboot(int argc, char *argv[], uintptr_t _data, void
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"The --root=/--image= switches may not be combined with the '%s' operation.", argv[0]);
if (context.feature_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--feature-all/--feature-suggested is not supported for '%s'.", argv[0]);
if (context.component || context.component_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"The --component=, --component-all and --component-suggested switches may not be combined with the '%s' operation, which only applies to the booted OS version.", argv[0]);
@@ -2510,6 +2529,8 @@ static int verb_components(int argc, char *argv[], uintptr_t _data, void *userda
if (r < 0)
return r;
if (context.feature_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--feature-all/--feature-suggested is not supported for '%s'.", argv[0]);
if (context.component_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "--component-all/--component-suggested currently not supported for '%s'.", argv[0]);
if (context.definitions)
@@ -2630,6 +2651,8 @@ static int verb_enable_component(int argc, char *argv[], uintptr_t _data, void *
if (r < 0)
return r;
if (context.feature_select != SELECT_EXPLICIT)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--feature-all/--feature-suggested is not supported for '%s'.", argv[0]);
if (context.definitions)
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"The --definitions= switch may not be combined with '%s'.", argv[0]);
@@ -2851,6 +2874,14 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
arg_component_select = SELECT_SUGGESTED;
break;
OPTION('a', "feature-all", NULL, "Select all features"):
arg_feature_select = SELECT_ALL;
break;
OPTION('s', "feature-suggested", NULL, "Select all suggested features"):
arg_feature_select = SELECT_SUGGESTED;
break;
OPTION_LONG("definitions", "DIR",
"Find transfer definitions in specified directory"):
r = parse_path_argument(opts.arg, /* suppress_root= */ false, &arg_definitions);
+1
View File
@@ -23,6 +23,7 @@ typedef struct Context {
int cleanup;
char *component;
SelectMode component_select;
SelectMode feature_select;
int verify;
ImagePolicy *image_policy;
bool offline;