summaryrefslogtreecommitdiff
path: root/src/udev/udevadm-control.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/udev/udevadm-control.c')
-rw-r--r--src/udev/udevadm-control.c146
1 files changed, 67 insertions, 79 deletions
diff --git a/src/udev/udevadm-control.c b/src/udev/udevadm-control.c
index a84cc156cb..d9320418cf 100644
--- a/src/udev/udevadm-control.c
+++ b/src/udev/udevadm-control.c
@@ -1,6 +1,5 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/*
- *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
@@ -20,13 +19,15 @@
#include <string.h>
#include <unistd.h>
+#include "parse-util.h"
#include "process-util.h"
+#include "syslog-util.h"
#include "time-util.h"
-#include "udev-util.h"
-#include "udev.h"
-#include "udevadm-util.h"
+#include "udevadm.h"
+#include "udev-ctrl.h"
+#include "util.h"
-static void print_help(void) {
+static int help(void) {
printf("%s control OPTION\n\n"
"Control the udev daemon.\n\n"
" -h --help Show this help\n"
@@ -40,12 +41,14 @@ static void print_help(void) {
" -m --children-max=N Maximum number of children\n"
" -t --timeout=SECONDS Maximum time to block for a reply\n"
, program_invocation_short_name);
+
+ return 0;
}
-static int adm_control(struct udev *udev, 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;
+ int c, r;
static const struct option options[] = {
{ "exit", no_argument, NULL, 'e' },
@@ -63,80 +66,70 @@ static int adm_control(struct udev *udev, int argc, char *argv[]) {
{}
};
- if (must_be_root() < 0)
- return 1;
+ r = must_be_root();
+ if (r < 0)
+ return r;
+
+ if (argc <= 1)
+ log_error("Option missing");
- uctrl = udev_ctrl_new(udev);
- if (uctrl == NULL)
- return 2;
+ uctrl = udev_ctrl_new();
+ if (!uctrl)
+ return -ENOMEM;
while ((c = getopt_long(argc, argv, "el:sSRp:m:t:Vh", options, NULL)) >= 0)
switch (c) {
case 'e':
- if (udev_ctrl_send_exit(uctrl, timeout) < 0)
- rc = 2;
- else
- rc = 0;
+ r = udev_ctrl_send_exit(uctrl, timeout);
+ if (r < 0)
+ return r;
break;
- case 'l': {
- int i;
+ case 'l':
+ r = log_level_from_string(optarg);
+ if (r < 0)
+ return log_error_errno(r, "Failed to parse log priority '%s': %m", optarg);
- i = util_log_priority(optarg);
- if (i < 0) {
- log_error("invalid number '%s'", optarg);
- return rc;
- }
- if (udev_ctrl_send_set_log_level(uctrl, util_log_priority(optarg), timeout) < 0)
- rc = 2;
- else
- rc = 0;
+ r = udev_ctrl_send_set_log_level(uctrl, r, timeout);
+ if (r < 0)
+ return r;
break;
- }
case 's':
- if (udev_ctrl_send_stop_exec_queue(uctrl, timeout) < 0)
- rc = 2;
- else
- rc = 0;
+ r = udev_ctrl_send_stop_exec_queue(uctrl, timeout);
+ if (r < 0)
+ return r;
break;
case 'S':
- if (udev_ctrl_send_start_exec_queue(uctrl, timeout) < 0)
- rc = 2;
- else
- rc = 0;
+ r = udev_ctrl_send_start_exec_queue(uctrl, timeout);
+ if (r < 0)
+ return r;
break;
case 'R':
- if (udev_ctrl_send_reload(uctrl, timeout) < 0)
- rc = 2;
- else
- rc = 0;
+ r = udev_ctrl_send_reload(uctrl, timeout);
+ if (r < 0)
+ return r;
break;
case 'p':
- if (strchr(optarg, '=') == NULL) {
+ if (!strchr(optarg, '=')) {
log_error("expect <KEY>=<value> instead of '%s'", optarg);
- return rc;
+ return -EINVAL;
}
- if (udev_ctrl_send_set_env(uctrl, optarg, timeout) < 0)
- rc = 2;
- else
- rc = 0;
+ r = udev_ctrl_send_set_env(uctrl, optarg, timeout);
+ if (r < 0)
+ return r;
break;
case 'm': {
- char *endp;
- int i;
+ unsigned i;
- i = strtoul(optarg, &endp, 0);
- if (endp[0] != '\0' || i < 1) {
- log_error("invalid number '%s'", optarg);
- return rc;
- }
- if (udev_ctrl_send_set_children_max(uctrl, i, timeout) < 0)
- rc = 2;
- else
- rc = 0;
+ r = safe_atou(optarg, &i);
+ if (r < 0)
+ return log_error_errno(r, "Failed to parse maximum number of events '%s': %m", optarg);
+
+ r = udev_ctrl_send_set_children_max(uctrl, i, timeout);
+ if (r < 0)
+ return r;
break;
}
case 't': {
- int r, seconds;
usec_t s;
r = parse_sec(optarg, &s);
@@ -144,33 +137,28 @@ static int adm_control(struct udev *udev, int argc, char *argv[]) {
return log_error_errno(r, "Failed to parse timeout value '%s'.", optarg);
if (DIV_ROUND_UP(s, USEC_PER_SEC) > INT_MAX)
- log_error("Timeout value is out of range.");
- else {
- seconds = s != USEC_INFINITY ? (int) DIV_ROUND_UP(s, USEC_PER_SEC) : INT_MAX;
- timeout = seconds;
- rc = 0;
- }
+ log_error("Timeout value is out of range, ignoring.");
+ else
+ timeout = s != USEC_INFINITY ? (int) DIV_ROUND_UP(s, USEC_PER_SEC) : INT_MAX;
break;
}
case 'V':
- print_version();
- rc = 0;
- break;
+ return print_version();
case 'h':
- print_help();
- rc = 0;
- break;
+ return help();
+ case '?':
+ return -EINVAL;
+ default:
+ assert_not_reached("Unknown option.");
}
- if (optind < argc)
+ if (optind < argc) {
log_error("Extraneous argument: %s", argv[optind]);
- else if (optind == 1)
+ return -EINVAL;
+ } else if (optind == 1) {
log_error("Option missing");
- return rc;
-}
+ return -EINVAL;
+ }
-const struct udevadm_cmd udevadm_control = {
- .name = "control",
- .cmd = adm_control,
- .help = "Control the udev daemon",
-};
+ return 0;
+}