verbs: add a new VERB_MUSTBEROOT flag
authorLennart Poettering <lennart@poettering.net>
Mon, 11 Dec 2017 22:10:11 +0000 (23:10 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 11 Dec 2017 22:19:46 +0000 (23:19 +0100)
Given that we regularly have verbs that require privileges, let's just
make this a flag of the verb.

src/basic/verbs.c
src/basic/verbs.h
src/boot/bootctl.c
src/systemctl/systemctl.c

index cc1bd7e..cb42e6d 100644 (file)
@@ -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 {
index ed62f4d..5f44a18 100644 (file)
 ***/
 
 #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;
 
index b685b3c..468a655 100644 (file)
@@ -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  },
                 {}
         };
 
index 4f92659..ef76af8 100644 (file)
@@ -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           },