chiark / gitweb /
udevadm: control - add --exit
[elogind.git] / udev / udevadm-control.c
index 0447804..69da865 100644 (file)
 static void print_help(void)
 {
        printf("Usage: udevadm control COMMAND\n"
+               "  --exit                   instruct the daemon to cleanup and exit\n"
                "  --log-priority=<level>   set the udev log level for the daemon\n"
                "  --stop-exec-queue        keep udevd from executing events, queue only\n"
                "  --start-exec-queue       execute events, flush queue\n"
                "  --reload-rules           reloads the rules files\n"
                "  --property=<KEY>=<value> set a global property for all events\n"
                "  --children-max=<N>       maximum number of children\n"
+               "  --timeout=<seconds>      maximum time to block for a reply\n"
                "  --help                   print this help text\n\n");
 }
 
 int udevadm_control(struct udev *udev, int argc, char *argv[])
 {
        struct udev_ctrl *uctrl = NULL;
+       int timeout = 60;
        int rc = 1;
 
        static const struct option options[] = {
+               { "exit", no_argument, NULL, 'e' },
                { "log-priority", required_argument, NULL, 'l' },
                { "stop-exec-queue", no_argument, NULL, 's' },
                { "start-exec-queue", no_argument, NULL, 'S' },
@@ -52,6 +56,7 @@ int udevadm_control(struct udev *udev, int argc, char *argv[])
                { "property", required_argument, NULL, 'p' },
                { "env", required_argument, NULL, 'p' },
                { "children-max", required_argument, NULL, 'm' },
+               { "timeout", required_argument, NULL, 't' },
                { "help", no_argument, NULL, 'h' },
                {}
        };
@@ -67,39 +72,46 @@ int udevadm_control(struct udev *udev, int argc, char *argv[])
 
        for (;;) {
                int option;
-               int i;
-               char *endp;
 
-               option = getopt_long(argc, argv, "l:sSRp:m:h", options, NULL);
+               option = getopt_long(argc, argv, "el:sSRp:m:h", options, NULL);
                if (option == -1)
                        break;
 
                switch (option) {
-               case 'l':
+               case 'e':
+                       if (udev_ctrl_send_exit(uctrl, timeout) < 0)
+                               rc = 2;
+                       else
+                               rc = 0;
+                       break;
+               case 'l': {
+                       int i;
+
                        i = util_log_priority(optarg);
                        if (i < 0) {
                                fprintf(stderr, "invalid number '%s'\n", optarg);
-                               goto exit;
+                               goto out;
                        }
-                       if (udev_ctrl_send_set_log_level(uctrl, util_log_priority(optarg)) < 0)
+                       if (udev_ctrl_send_set_log_level(uctrl, util_log_priority(optarg), timeout) < 0)
                                rc = 2;
                        else
                                rc = 0;
                        break;
+               }
                case 's':
-                       if (udev_ctrl_send_stop_exec_queue(uctrl) < 0)
+                       if (udev_ctrl_send_stop_exec_queue(uctrl, timeout) < 0)
                                rc = 2;
                        else
                                rc = 0;
                        break;
                case 'S':
-                       if (udev_ctrl_send_start_exec_queue(uctrl) < 0)
+                       if (udev_ctrl_send_start_exec_queue(uctrl, timeout) < 0)
                                rc = 2;
                        else
                                rc = 0;
                        break;
                case 'R':
-                       if (udev_ctrl_send_reload_rules(uctrl) < 0)
+                       if (udev_ctrl_send_reload_rules(uctrl, timeout) < 0)
                                rc = 2;
                        else
                                rc = 0;
@@ -107,34 +119,45 @@ int udevadm_control(struct udev *udev, int argc, char *argv[])
                case 'p':
                        if (strchr(optarg, '=') == NULL) {
                                fprintf(stderr, "expect <KEY>=<value> instead of '%s'\n", optarg);
-                               goto exit;
+                               goto out;
                        }
-                       if (udev_ctrl_send_set_env(uctrl, optarg) < 0)
+                       if (udev_ctrl_send_set_env(uctrl, optarg, timeout) < 0)
                                rc = 2;
                        else
                                rc = 0;
                        break;
-               case 'm':
+               case 'm': {
+                       char *endp;
+                       int i;
+
                        i = strtoul(optarg, &endp, 0);
                        if (endp[0] != '\0' || i < 1) {
                                fprintf(stderr, "invalid number '%s'\n", optarg);
-                               goto exit;
+                               goto out;
                        }
-                       if (udev_ctrl_send_set_children_max(uctrl, i) < 0)
+                       if (udev_ctrl_send_set_children_max(uctrl, i, timeout) < 0)
                                rc = 2;
                        else
                                rc = 0;
                        break;
+               }
+               case 't': {
+                       int seconds;
+
+                       seconds = atoi(optarg);
+                       if (seconds >= 0)
+                               timeout = seconds;
+                       else
+                               fprintf(stderr, "invalid timeout value\n");
+                       break;
+               }
                case 'h':
                        print_help();
                        rc = 0;
                        break;
                }
        }
-
-       if (rc == 1)
-               err(udev, "unrecognized command\n");
-exit:
+out:
        udev_ctrl_unref(uctrl);
        return rc;
 }