]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udevadm-control: modernize code a bit
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 24 Aug 2018 12:55:19 +0000 (21:55 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 10 Sep 2018 09:27:36 +0000 (18:27 +0900)
src/udev/udevadm-control.c

index 9c6cec14e8fa8aaae27b40dcce1bf2f7141b1113..68c6b8104ca750e42986724f88c45935cc902d43 100644 (file)
 #include <string.h>
 #include <unistd.h>
 
+#include "parse-util.h"
 #include "process-util.h"
 #include "time-util.h"
 #include "udev.h"
 #include "udevadm.h"
-#include "udevadm-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"
@@ -39,12 +39,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;
 }
 
 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' },
@@ -62,80 +64,73 @@ int control_main(int argc, char *argv[], void *userdata) {
                 {}
         };
 
-        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();
-        if (uctrl == NULL)
-                return 2;
+        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;
 
                         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;
+                        if (i < 0)
+                                return log_error_errno(i, "invalid number '%s'", optarg);
+
+                        r = udev_ctrl_send_set_log_level(uctrl, i, 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);
@@ -143,27 +138,28 @@ int control_main(int argc, char *argv[], void *userdata) {
                                 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 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;
+        }
+
+        return 0;
 }