bless-boot: use verb function argument

This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2026-03-18 10:28:47 +00:00
committed by Luca Boccassi
parent 1dc35ab944
commit 69544de33e
+24 -12
View File
@@ -26,6 +26,12 @@ static char **arg_path = NULL;
STATIC_DESTRUCTOR_REGISTER(arg_path, strv_freep);
typedef enum Status {
STATUS_GOOD,
STATUS_BAD,
STATUS_INDETERMINATE,
} Status;
static int help(void) {
_cleanup_free_ char *link = NULL;
int r;
@@ -344,7 +350,8 @@ static int verb_status(int argc, char *argv[], uintptr_t _data, void *userdata)
int r;
r = acquire_boot_count_path(&path, &prefix, &left, &done, &suffix);
if (r == -EUNATCH) { /* No boot count in place, then let's consider this a "clean" boot, as "good", "bad" or "indeterminate" don't apply. */
if (r == -EUNATCH) { /* No boot count in place, then let's consider this a "clean" boot,
* since "good", "bad", or "indeterminate" don't apply. */
puts("clean");
return 0;
}
@@ -444,12 +451,15 @@ static int rename_in_dir_idempotent(int fd, const char *from, const char *to) {
return 1;
}
static int verb_set(int argc, char *argv[], uintptr_t _data, void *userdata) {
static int verb_set(int argc, char *argv[], uintptr_t data, void *userdata) {
_cleanup_free_ char *path = NULL, *prefix = NULL, *suffix = NULL, *good = NULL, *bad = NULL;
const char *target, *source1, *source2;
uint64_t left, done;
Status status = data;
int r;
assert(IN_SET(status, STATUS_GOOD, STATUS_BAD, STATUS_INDETERMINATE));
r = acquire_boot_count_path(&path, &prefix, &left, &done, &suffix);
if (r == -EUNATCH) /* acquire_boot_count_path() won't log on its own for this specific error */
return log_error_errno(r, "Not booted with boot counting in effect.");
@@ -469,23 +479,25 @@ static int verb_set(int argc, char *argv[], uintptr_t _data, void *userdata) {
return log_oom();
/* Figure out what rename to what */
if (streq(argv[0], "good")) {
switch (status) {
case STATUS_GOOD:
target = good;
source1 = path;
source2 = bad; /* Maybe this boot was previously marked as 'bad'? */
} else if (streq(argv[0], "bad")) {
break;
case STATUS_BAD:
target = bad;
source1 = path;
source2 = good; /* Maybe this boot was previously marked as 'good'? */
} else {
assert(streq(argv[0], "indeterminate"));
break;
case STATUS_INDETERMINATE:
if (left == 0)
return log_error_errno(r, "Current boot entry was already marked bad in a previous boot, cannot reset to indeterminate.");
target = path;
source1 = good;
source2 = bad;
break;
}
STRV_FOREACH(p, arg_path) {
@@ -550,11 +562,11 @@ exists:
static int run(int argc, char *argv[]) {
static const Verb verbs[] = {
{ "help", VERB_ANY, VERB_ANY, 0, verb_help },
{ "status", VERB_ANY, 1, VERB_DEFAULT, verb_status },
{ "good", VERB_ANY, 1, 0, verb_set },
{ "bad", VERB_ANY, 1, 0, verb_set },
{ "indeterminate", VERB_ANY, 1, 0, verb_set },
{ "help", VERB_ANY, VERB_ANY, 0, verb_help },
{ "status", VERB_ANY, 1, VERB_DEFAULT, verb_status },
{ "good", VERB_ANY, 1, 0, verb_set, STATUS_GOOD },
{ "bad", VERB_ANY, 1, 0, verb_set, STATUS_BAD },
{ "indeterminate", VERB_ANY, 1, 0, verb_set, STATUS_INDETERMINATE },
{}
};