udevadm: use dispatch_verb() and drop udevadm_cmd struct
This commit is contained in:
@@ -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())
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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",
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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",
|
||||
};
|
||||
|
||||
@@ -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",
|
||||
};
|
||||
|
||||
@@ -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",
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
Reference in New Issue
Block a user