diff --git a/src/basic/verbs.c b/src/basic/verbs.c index cc1bd7e3231..cb42e6dd087 100644 --- a/src/basic/verbs.c +++ b/src/basic/verbs.c @@ -33,7 +33,7 @@ int dispatch_verb(int argc, char *argv[], const Verb verbs[], void *userdata) { const Verb *verb; const char *name; unsigned i; - int left; + int left, r; assert(verbs); assert(verbs[0].dispatch); @@ -89,6 +89,12 @@ int dispatch_verb(int argc, char *argv[], const Verb verbs[], void *userdata) { return 0; } + if (verb->flags & VERB_MUSTBEROOT) { + r = must_be_root(); + if (r < 0) + return r; + } + if (name) return verb->dispatch(left, argv + optind, userdata); else { diff --git a/src/basic/verbs.h b/src/basic/verbs.h index ed62f4d07b7..5f44a18f8e4 100644 --- a/src/basic/verbs.h +++ b/src/basic/verbs.h @@ -21,13 +21,17 @@ ***/ #define VERB_ANY ((unsigned) -1) -#define VERB_DEFAULT 1U -#define VERB_NOCHROOT 2U + +typedef enum VerbFlags { + VERB_DEFAULT = 1 << 0, + VERB_NOCHROOT = 1 << 1, + VERB_MUSTBEROOT = 1 << 2, +} VerbFlags; typedef struct { const char *verb; unsigned min_args, max_args; - unsigned flags; + VerbFlags flags; int (* const dispatch)(int argc, char *argv[], void *userdata); } Verb; diff --git a/src/boot/bootctl.c b/src/boot/bootctl.c index b685b3c7915..468a6551185 100644 --- a/src/boot/bootctl.c +++ b/src/boot/bootctl.c @@ -1087,10 +1087,6 @@ static int verb_install(int argc, char *argv[], void *userdata) { bool install; int r; - r = must_be_root(); - if (r < 0) - return r; - r = acquire_esp(false, &part, &pstart, &psize, &uuid); if (r < 0) return r; @@ -1122,10 +1118,6 @@ static int verb_remove(int argc, char *argv[], void *userdata) { sd_id128_t uuid = SD_ID128_NULL; int r; - r = must_be_root(); - if (r < 0) - return r; - r = acquire_esp(false, NULL, NULL, NULL, &uuid); if (r < 0) return r; @@ -1146,12 +1138,12 @@ static int verb_remove(int argc, char *argv[], void *userdata) { static int bootctl_main(int argc, char *argv[]) { static const Verb verbs[] = { - { "help", VERB_ANY, VERB_ANY, 0, help }, - { "status", VERB_ANY, 1, VERB_DEFAULT, verb_status }, - { "list", VERB_ANY, 1, 0, verb_list }, - { "install", VERB_ANY, 1, 0, verb_install }, - { "update", VERB_ANY, 1, 0, verb_install }, - { "remove", VERB_ANY, 1, 0, verb_remove }, + { "help", VERB_ANY, VERB_ANY, 0, help }, + { "status", VERB_ANY, 1, VERB_DEFAULT, verb_status }, + { "list", VERB_ANY, 1, 0, verb_list }, + { "install", VERB_ANY, 1, VERB_MUSTBEROOT, verb_install }, + { "update", VERB_ANY, 1, VERB_MUSTBEROOT, verb_install }, + { "remove", VERB_ANY, 1, VERB_MUSTBEROOT, verb_remove }, {} }; diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 4f92659fcd2..ef76af817c1 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -2074,10 +2074,6 @@ static int list_machines(int argc, char *argv[], void *userdata) { sd_bus *bus; int r; - r = must_be_root(); - if (r < 0) - return r; - r = acquire_bus(BUS_MANAGER, &bus); if (r < 0) return r; @@ -8408,7 +8404,7 @@ static int systemctl_main(int argc, char *argv[]) { { "list-sockets", VERB_ANY, VERB_ANY, VERB_NOCHROOT, list_sockets }, { "list-timers", VERB_ANY, VERB_ANY, VERB_NOCHROOT, list_timers }, { "list-jobs", VERB_ANY, VERB_ANY, VERB_NOCHROOT, list_jobs }, - { "list-machines", VERB_ANY, VERB_ANY, VERB_NOCHROOT, list_machines }, + { "list-machines", VERB_ANY, VERB_ANY, VERB_NOCHROOT|VERB_MUSTBEROOT, list_machines }, { "clear-jobs", VERB_ANY, 1, VERB_NOCHROOT, trivial_method }, { "cancel", VERB_ANY, VERB_ANY, VERB_NOCHROOT, cancel_job }, { "start", 2, VERB_ANY, VERB_NOCHROOT, start_unit },