summaryrefslogtreecommitdiff
path: root/src/udev
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2018-08-21 11:17:01 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2018-09-10 18:27:36 +0900
commit3d05193e67eac77d344607c33a6f2c99d94a0d33 (patch)
treed6edfecc1e026ef57b8151d93bda62c1ad1d3870 /src/udev
parentbd696b953e95a06aa1c157d653735afcc3d480f1 (diff)
downloadsystemd-3d05193e67eac77d344607c33a6f2c99d94a0d33.tar.gz
udevadm: use dispatch_verb() and drop udevadm_cmd struct
Diffstat (limited to 'src/udev')
-rw-r--r--src/udev/meson.build7
-rw-r--r--src/udev/udev.h16
-rw-r--r--src/udev/udevadm-control.c9
-rw-r--r--src/udev/udevadm-hwdb.c8
-rw-r--r--src/udev/udevadm-info.c9
-rw-r--r--src/udev/udevadm-monitor.c9
-rw-r--r--src/udev/udevadm-settle.c9
-rw-r--r--src/udev/udevadm-test-builtin.c12
-rw-r--r--src/udev/udevadm-test.c11
-rw-r--r--src/udev/udevadm-trigger.c9
-rw-r--r--src/udev/udevadm.c152
-rw-r--r--src/udev/udevadm.h11
12 files changed, 111 insertions, 151 deletions
diff --git a/src/udev/meson.build b/src/udev/meson.build
index 068eedcf31..665cb83fb8 100644
--- a/src/udev/meson.build
+++ b/src/udev/meson.build
@@ -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())
diff --git a/src/udev/udev.h b/src/udev/udev.h
index 2b6ef19214..b7b2c0420c 100644
--- a/src/udev/udev.h
+++ b/src/udev/udev.h
@@ -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;
diff --git a/src/udev/udevadm-control.c b/src/udev/udevadm-control.c
index 14b71cf6e8..9c6cec14e8 100644
--- a/src/udev/udevadm-control.c
+++ b/src/udev/udevadm-control.c
@@ -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",
-};
diff --git a/src/udev/udevadm-hwdb.c b/src/udev/udevadm-hwdb.c
index 6822f4d227..cf0c234391 100644
--- a/src/udev/udevadm-hwdb.c
+++ b/src/udev/udevadm-hwdb.c
@@ -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,
-};
diff --git a/src/udev/udevadm-info.c b/src/udev/udevadm-info.c
index 42f6becbd3..fceba78794 100644
--- a/src/udev/udevadm-info.c
+++ b/src/udev/udevadm-info.c
@@ -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",
-};
diff --git a/src/udev/udevadm-monitor.c b/src/udev/udevadm-monitor.c
index c7bd4ffdc1..7d39e5ba2a 100644
--- a/src/udev/udevadm-monitor.c
+++ b/src/udev/udevadm-monitor.c
@@ -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",
-};
diff --git a/src/udev/udevadm-settle.c b/src/udev/udevadm-settle.c
index f6454860d2..9d46cb5221 100644
--- a/src/udev/udevadm-settle.c
+++ b/src/udev/udevadm-settle.c
@@ -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",
-};
diff --git a/src/udev/udevadm-test-builtin.c b/src/udev/udevadm-test-builtin.c
index 0a47c43e82..24eb3e75ee 100644
--- a/src/udev/udevadm-test-builtin.c
+++ b/src/udev/udevadm-test-builtin.c
@@ -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,
-};
diff --git a/src/udev/udevadm-test.c b/src/udev/udevadm-test.c
index b27f82cfc6..2aa578b4c9 100644
--- a/src/udev/udevadm-test.c
+++ b/src/udev/udevadm-test.c
@@ -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,
-};
diff --git a/src/udev/udevadm-trigger.c b/src/udev/udevadm-trigger.c
index 8a936cc941..5674a99510 100644
--- a/src/udev/udevadm-trigger.c
+++ b/src/udev/udevadm-trigger.c
@@ -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",
-};
diff --git a/src/udev/udevadm.c b/src/udev/udevadm.c
index b674273ab2..7c6eb3bf4c 100644
--- a/src/udev/udevadm.c
+++ b/src/udev/udevadm.c
@@ -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
index 0000000000..7c20e0a8ff
--- /dev/null
+++ b/src/udev/udevadm.h
@@ -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);