bless-boot: use verb function argument
This commit is contained in:
committed by
Luca Boccassi
parent
1dc35ab944
commit
69544de33e
+24
-12
@@ -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 },
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user