diff options
Diffstat (limited to 'src/udev/udevadm-control.c')
-rw-r--r-- | src/udev/udevadm-control.c | 146 |
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; +} |