udevadm: use dispatch_verb() and drop udevadm_cmd struct

This commit is contained in:
Yu Watanabe
2018-09-10 18:27:36 +09:00
parent bd696b953e
commit 3d05193e67
12 changed files with 108 additions and 148 deletions
+4 -3
View 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())
-16
View 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;
+2 -7
View 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",
};
+2 -6
View 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,
};
+2 -7
View 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",
};
+2 -7
View 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",
};
+2 -7
View 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",
};
+4 -8
View 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,
};
+3 -8
View 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,
};
+2 -7
View 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",
};
+74 -72
View 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"
#include "verbs.h"
#include "util.h"
static int adm_version(int argc, char *argv[]) {
printf("%s\n", PACKAGE_VERSION);
return 0;
}
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;
int c;
udev_parse_config();
log_parse_environment();
log_open();
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];
return 1; /* work to do */
}
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;
}
static int version_main(int argc, char *argv[], void *userdata) {
return version();
}
fprintf(stderr, "%s: missing or unknown command\n", program_invocation_short_name);
rc = 2;
out:
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;
}
+11
View File
@@ -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);