]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udevadm: use dispatch_verb() and drop udevadm_cmd struct
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 21 Aug 2018 02:17:01 +0000 (11:17 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 10 Sep 2018 09:27:36 +0000 (18:27 +0900)
12 files changed:
src/udev/meson.build
src/udev/udev.h
src/udev/udevadm-control.c
src/udev/udevadm-hwdb.c
src/udev/udevadm-info.c
src/udev/udevadm-monitor.c
src/udev/udevadm-settle.c
src/udev/udevadm-test-builtin.c
src/udev/udevadm-test.c
src/udev/udevadm-trigger.c
src/udev/udevadm.c
src/udev/udevadm.h [new file with mode: 0644]

index 068eedcf3181748bd111cd2d01c5f8b114fd30ce..665cb83fb8c3c79063d85f6105eb66adbcaf6af4 100644 (file)
@@ -2,14 +2,15 @@
 
 udevadm_sources = files('''
         udevadm.c
-        udevadm-info.c
+        udevadm.h
         udevadm-control.c
-        udevadm-monitor.c
         udevadm-hwdb.c
+        udevadm-info.c
+        udevadm-monitor.c
         udevadm-settle.c
-        udevadm-trigger.c
         udevadm-test.c
         udevadm-test-builtin.c
+        udevadm-trigger.c
         udevadm-util.c
         udevadm-util.h
 '''.split())
index 2b6ef1921410fb2da988a954b3ff7ca3d7709f4a..b7b2c0420c270c906cc675964dd1520170344f72 100644 (file)
@@ -186,19 +186,3 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(struct udev_rules*, udev_rules_unref);
 DEFINE_TRIVIAL_CLEANUP_FUNC(struct udev_ctrl*, udev_ctrl_unref);
 DEFINE_TRIVIAL_CLEANUP_FUNC(struct udev_ctrl_connection*, udev_ctrl_connection_unref);
 DEFINE_TRIVIAL_CLEANUP_FUNC(struct udev_ctrl_msg*, udev_ctrl_msg_unref);
-
-/* udevadm commands */
-struct udevadm_cmd {
-        const char *name;
-        int (*cmd)(int argc, char *argv[]);
-        const char *help;
-        int debug;
-};
-extern const struct udevadm_cmd udevadm_info;
-extern const struct udevadm_cmd udevadm_trigger;
-extern const struct udevadm_cmd udevadm_settle;
-extern const struct udevadm_cmd udevadm_control;
-extern const struct udevadm_cmd udevadm_monitor;
-extern const struct udevadm_cmd udevadm_hwdb;
-extern const struct udevadm_cmd udevadm_test;
-extern const struct udevadm_cmd udevadm_test_builtin;
index 14b71cf6e82f63506bf8b7992f30bd27b3cefe32..9c6cec14e8fa8aaae27b40dcce1bf2f7141b1113 100644 (file)
@@ -22,6 +22,7 @@
 #include "process-util.h"
 #include "time-util.h"
 #include "udev.h"
+#include "udevadm.h"
 #include "udevadm-util.h"
 
 static void print_help(void) {
@@ -40,7 +41,7 @@ static void print_help(void) {
                , program_invocation_short_name);
 }
 
-static int adm_control(int argc, char *argv[]) {
+int control_main(int argc, char *argv[], void *userdata) {
         _cleanup_(udev_ctrl_unrefp) struct udev_ctrl *uctrl = NULL;
         int timeout = 60;
         int rc = 1, c;
@@ -166,9 +167,3 @@ static int adm_control(int argc, char *argv[]) {
                 log_error("Option missing");
         return rc;
 }
-
-const struct udevadm_cmd udevadm_control = {
-        .name = "control",
-        .cmd = adm_control,
-        .help = "Control the udev daemon",
-};
index 6822f4d2279cbf4943cc973c199467af0c94f6d5..cf0c23439178bd66f06891aa3a79c525d2fb7a1e 100644 (file)
@@ -16,6 +16,7 @@
 #include "strbuf.h"
 #include "string-util.h"
 #include "udev.h"
+#include "udevadm.h"
 #include "udevadm-util.h"
 #include "util.h"
 
@@ -553,7 +554,7 @@ static void help(void) {
                , program_invocation_short_name);
 }
 
-static int adm_hwdb(int argc, char *argv[]) {
+int hwdb_main(int argc, char *argv[], void *userdata) {
         enum {
                 ARG_USR = 0x100,
         };
@@ -704,8 +705,3 @@ out:
         }
         return rc;
 }
-
-const struct udevadm_cmd udevadm_hwdb = {
-        .name = "hwdb",
-        .cmd = adm_hwdb,
-};
index 42f6becbd3a118c202332eea858eabe3aa563044..fceba7879420b6451accc1e81a8af647a0d6ccc6 100644 (file)
@@ -14,6 +14,7 @@
 #include "fd-util.h"
 #include "string-util.h"
 #include "udev.h"
+#include "udevadm.h"
 #include "udevadm-util.h"
 
 static bool skip_attribute(const char *name) {
@@ -254,7 +255,7 @@ static void help(void) {
                , program_invocation_short_name);
 }
 
-static int uinfo(int argc, char *argv[]) {
+int info_main(int argc, char *argv[], void *userdata) {
         _cleanup_(udev_device_unrefp) struct udev_device *device = NULL;
         bool root = 0;
         bool export = 0;
@@ -459,9 +460,3 @@ static int uinfo(int argc, char *argv[]) {
 
         return 0;
 }
-
-const struct udevadm_cmd udevadm_info = {
-        .name = "info",
-        .cmd = uinfo,
-        .help = "Query sysfs or the udev database",
-};
index c7bd4ffdc1b09d931c53ae3d58f50e867e694a90..7d39e5ba2a06f89f94810a8b0abe5be94de6644e 100644 (file)
@@ -13,6 +13,7 @@
 #include "fd-util.h"
 #include "format-util.h"
 #include "udev.h"
+#include "udevadm.h"
 #include "udevadm-util.h"
 
 static bool udev_exit;
@@ -56,7 +57,7 @@ static void help(void) {
                , program_invocation_short_name);
 }
 
-static int adm_monitor(int argc, char *argv[]) {
+int monitor_main(int argc, char *argv[], void *userdata) {
         struct sigaction act = {};
         sigset_t mask;
         bool prop = false;
@@ -262,9 +263,3 @@ static int adm_monitor(int argc, char *argv[]) {
 
         return 0;
 }
-
-const struct udevadm_cmd udevadm_monitor = {
-        .name = "monitor",
-        .cmd = adm_monitor,
-        .help = "Listen to kernel and udev events",
-};
index f6454860d2d10dce71920b0b600d585455a0ef25..9d46cb52211ee5598cf2e986aeeda7536bf37bdf 100644 (file)
@@ -15,6 +15,7 @@
 
 #include "parse-util.h"
 #include "udev.h"
+#include "udevadm.h"
 #include "udevadm-util.h"
 #include "util.h"
 
@@ -28,7 +29,7 @@ static void help(void) {
                , program_invocation_short_name);
 }
 
-static int adm_settle(int argc, char *argv[]) {
+int settle_main(int argc, char *argv[], void *userdata) {
         static const struct option options[] = {
                 { "timeout",        required_argument, NULL, 't' },
                 { "exit-if-exists", required_argument, NULL, 'E' },
@@ -147,9 +148,3 @@ out:
         udev_queue_unref(queue);
         return rc;
 }
-
-const struct udevadm_cmd udevadm_settle = {
-        .name = "settle",
-        .cmd = adm_settle,
-        .help = "Wait for pending udev events",
-};
index 0a47c43e82fc1689470c6e721a3c351f7015a06f..24eb3e75eeb2695de334ade5f64e208556273191 100644 (file)
@@ -9,6 +9,7 @@
 #include "path-util.h"
 #include "string-util.h"
 #include "udev.h"
+#include "udevadm.h"
 #include "udevadm-util.h"
 
 static void help(void) {
@@ -22,7 +23,7 @@ static void help(void) {
         udev_builtin_list();
 }
 
-static int adm_builtin(int argc, char *argv[]) {
+int builtin_main(int argc, char *argv[], void *userdata) {
         static const struct option options[] = {
                 { "version", no_argument, NULL, 'V' },
                 { "help",    no_argument, NULL, 'h' },
@@ -35,6 +36,8 @@ static int adm_builtin(int argc, char *argv[]) {
         enum udev_builtin_cmd cmd;
         int rc = EXIT_SUCCESS, c;
 
+        log_set_max_level(LOG_DEBUG);
+
         while ((c = getopt_long(argc, argv, "Vh", options, NULL)) >= 0)
                 switch (c) {
                 case 'V':
@@ -94,10 +97,3 @@ out:
         udev_builtin_exit();
         return rc;
 }
-
-const struct udevadm_cmd udevadm_test_builtin = {
-        .name = "test-builtin",
-        .cmd = adm_builtin,
-        .help = "Test a built-in command",
-        .debug = true,
-};
index b27f82cfc61d223735ef3f3f419304987192b0fd..2aa578b4c93ea973f815e6ad30425854c986612c 100644 (file)
@@ -14,6 +14,7 @@
 
 #include "string-util.h"
 #include "udev.h"
+#include "udevadm.h"
 #include "udevadm-util.h"
 
 static void help(void) {
@@ -27,7 +28,7 @@ static void help(void) {
                , program_invocation_short_name);
 }
 
-static int adm_test(int argc, char *argv[]) {
+int test_main(int argc, char *argv[], void *userdata) {
         int resolve_names = 1;
         char filename[UTIL_PATH_SIZE];
         const char *action = "add";
@@ -47,6 +48,7 @@ static int adm_test(int argc, char *argv[]) {
                 {}
         };
 
+        log_set_max_level(LOG_DEBUG);
         log_debug("version %s", PACKAGE_VERSION);
 
         while ((c = getopt_long(argc, argv, "a:N:Vh", options, NULL)) >= 0)
@@ -142,10 +144,3 @@ out:
         udev_builtin_exit();
         return rc;
 }
-
-const struct udevadm_cmd udevadm_test = {
-        .name = "test",
-        .cmd = adm_test,
-        .help = "Test an event run",
-        .debug = true,
-};
index 8a936cc94135d7c1781698e2312e3c20ec1880bb..5674a995101055b16872a1597298a71a04c39956 100644 (file)
@@ -12,6 +12,7 @@
 #include "set.h"
 #include "string-util.h"
 #include "udev.h"
+#include "udevadm.h"
 #include "udevadm-util.h"
 #include "util.h"
 
@@ -88,7 +89,7 @@ static void help(void) {
                , program_invocation_short_name);
 }
 
-static int adm_trigger(int argc, char *argv[]) {
+int trigger_main(int argc, char *argv[], void *userdata) {
         enum {
                 ARG_NAME = 0x100,
         };
@@ -356,9 +357,3 @@ static int adm_trigger(int argc, char *argv[]) {
 
         return 0;
 }
-
-const struct udevadm_cmd udevadm_trigger = {
-        .name = "trigger",
-        .cmd = adm_trigger,
-        .help = "Request events from the kernel",
-};
index b674273ab2c7e396b3d9ffcfcdd05eeeb8d03754..7c6eb3bf4c3832e06c942aca36cb642cd186bc59 100644 (file)
@@ -5,43 +5,26 @@
 #include <stddef.h>
 #include <stdio.h>
 
+#include "alloc-util.h"
 #include "selinux-util.h"
 #include "string-util.h"
 #include "terminal-util.h"
+#include "udevadm.h"
 #include "udev-util.h"
-#include "udev.h"
-
-static int adm_version(int argc, char *argv[]) {
-        printf("%s\n", PACKAGE_VERSION);
-        return 0;
-}
+#include "verbs.h"
+#include "util.h"
+
+static int help(void) {
+        static const char * short_descriptions[][2] = {
+                { "info",         "Query sysfs or the udev database" },
+                { "trigger",      "Request events from the kernel"   },
+                { "settle",       "Wait for pending udev events"     },
+                { "control",      "Control the udev daemon"          },
+                { "monitor",      "Listen to kernel and udev events" },
+                { "test",         "Test an event run"                },
+                { "test-builtin", "Test a built-in command"          },
+        };
 
-static const struct udevadm_cmd udevadm_version = {
-        .name = "version",
-        .cmd = adm_version,
-};
-
-static int adm_help(int argc, char *argv[]);
-
-static const struct udevadm_cmd udevadm_help = {
-        .name = "help",
-        .cmd = adm_help,
-};
-
-static const struct udevadm_cmd *udevadm_cmds[] = {
-        &udevadm_info,
-        &udevadm_trigger,
-        &udevadm_settle,
-        &udevadm_control,
-        &udevadm_monitor,
-        &udevadm_hwdb,
-        &udevadm_test,
-        &udevadm_test_builtin,
-        &udevadm_version,
-        &udevadm_help,
-};
-
-static int adm_help(int argc, char *argv[]) {
         _cleanup_free_ char *link = NULL;
         size_t i;
         int r;
@@ -55,37 +38,24 @@ static int adm_help(int argc, char *argv[]) {
                "Commands:\n"
                , program_invocation_short_name);
 
-        for (i = 0; i < ELEMENTSOF(udevadm_cmds); i++)
-                if (udevadm_cmds[i]->help != NULL)
-                        printf("  %-12s  %s\n", udevadm_cmds[i]->name, udevadm_cmds[i]->help);
+        for (i = 0; i < ELEMENTSOF(short_descriptions); i++)
+                printf("  %-12s  %s\n", short_descriptions[i][0], short_descriptions[i][1]);
 
         printf("\nSee the %s for details.\n", link);
         return 0;
 }
 
-static int run_command(const struct udevadm_cmd *cmd, int argc, char *argv[]) {
-        if (cmd->debug)
-                log_set_max_level(LOG_DEBUG);
-        log_debug("calling: %s", cmd->name);
-        return cmd->cmd(argc, argv);
-}
-
-int main(int argc, char *argv[]) {
+static int parse_argv(int argc, char *argv[]) {
         static const struct option options[] = {
-                { "debug", no_argument, NULL, 'd' },
-                { "help", no_argument, NULL, 'h' },
+                { "debug",   no_argument, NULL, 'd' },
+                { "help",    no_argument, NULL, 'h' },
                 { "version", no_argument, NULL, 'V' },
                 {}
         };
-        const char *command;
-        unsigned int i;
-        int rc = 1, c;
-
-        udev_parse_config();
-        log_parse_environment();
-        log_open();
+        int c;
 
-        mac_selinux_init();
+        assert(argc >= 0);
+        assert(argv);
 
         while ((c = getopt_long(argc, argv, "+dhV", options, NULL)) >= 0)
                 switch (c) {
@@ -95,34 +65,66 @@ int main(int argc, char *argv[]) {
                         break;
 
                 case 'h':
-                        rc = adm_help(argc, argv);
-                        goto out;
+                        return help();
 
                 case 'V':
-                        rc = adm_version(argc, argv);
-                        goto out;
+                        return version();
+
+                case '?':
+                        return -EINVAL;
 
                 default:
-                        goto out;
+                        assert_not_reached("Unhandled option");
                 }
 
-        command = argv[optind];
-
-        if (command != NULL)
-                for (i = 0; i < ELEMENTSOF(udevadm_cmds); i++)
-                        if (streq(udevadm_cmds[i]->name, command)) {
-                                argc -= optind;
-                                argv += optind;
-                                /* we need '0' here to reset the internal state */
-                                optind = 0;
-                                rc = run_command(udevadm_cmds[i], argc, argv);
-                                goto out;
-                        }
-
-        fprintf(stderr, "%s: missing or unknown command\n", program_invocation_short_name);
-        rc = 2;
-out:
+        return 1; /* work to do */
+}
+
+static int version_main(int argc, char *argv[], void *userdata) {
+        return version();
+}
+
+static int help_main(int argc, char *argv[], void *userdata) {
+        return help();
+}
+
+static int udevadm_main(int argc, char *argv[]) {
+        static const Verb verbs[] = {
+                { "info",         VERB_ANY, VERB_ANY, 0, info_main    },
+                { "trigger",      VERB_ANY, VERB_ANY, 0, trigger_main },
+                { "settle",       VERB_ANY, VERB_ANY, 0, settle_main  },
+                { "control",      VERB_ANY, VERB_ANY, 0, control_main },
+                { "monitor",      VERB_ANY, VERB_ANY, 0, monitor_main },
+                { "hwdb",         VERB_ANY, VERB_ANY, 0, hwdb_main    },
+                { "test",         VERB_ANY, VERB_ANY, 0, test_main    },
+                { "test-builtin", VERB_ANY, VERB_ANY, 0, builtin_main },
+                { "version",      VERB_ANY, VERB_ANY, 0, version_main },
+                { "help",         VERB_ANY, VERB_ANY, 0, help_main    },
+                {}
+        };
+
+        return dispatch_verb(argc, argv, verbs, NULL);
+}
+
+int main(int argc, char *argv[]) {
+        int r;
+
+        udev_parse_config();
+        log_parse_environment();
+        log_open();
+        mac_selinux_init();
+
+        r = parse_argv(argc, argv);
+        if (r <= 0)
+                goto finish;
+
+        r = udevadm_main(argc, argv);
+
+finish:
         mac_selinux_finish();
         log_close();
-        return rc;
+
+        /* TODO: fix this later.
+         * Currently, verbs return positive values on failure. */
+        return r < 0 ? EXIT_FAILURE : r;
 }
diff --git a/src/udev/udevadm.h b/src/udev/udevadm.h
new file mode 100644 (file)
index 0000000..7c20e0a
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+#pragma once
+
+int info_main(int argc, char *argv[], void *userdata);
+int trigger_main(int argc, char *argv[], void *userdata);
+int settle_main(int argc, char *argv[], void *userdata);
+int control_main(int argc, char *argv[], void *userdata);
+int monitor_main(int argc, char *argv[], void *userdata);
+int hwdb_main(int argc, char *argv[], void *userdata);
+int test_main(int argc, char *argv[], void *userdata);
+int builtin_main(int argc, char *argv[], void *userdata);