chiark / gitweb /
build-sys: add one more Makefile symlink
[elogind.git] / src / udev / udevadm-control.c
index cafa2149442172c08bee4f1a47a541c7413f090d..78170463b6536d1f926bf772565af7ca07c180ad 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2011 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2005-2011 Kay Sievers <kay@vrfy.org>
  *
  * 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
@@ -12,7 +12,6 @@
  * GNU General Public License for more details.
  */
 
-#include <time.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 #include <getopt.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/wait.h>
-#include <sys/un.h>
 
 #include "udev.h"
+#include "udev-util.h"
 
-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        do not execute events, queue only\n"
-                "  --start-exec-queue       execute events, flush queue\n"
-                "  --reload                 reload rules and databases\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");
+static void print_help(void) {
+        printf("%s control COMMAND\n\n"
+               "Control the udev daemon.\n\n"
+               "  -h --help                Show this help\n"
+               "     --version             Show package version\n"
+               "  -e --exit                Instruct the daemon to cleanup and exit\n"
+               "  -l --log-priority=LEVEL  Set the udev log level for the daemon\n"
+               "  -s --stop-exec-queue     Do not execute events, queue only\n"
+               "  -S --start-exec-queue    Execute events, flush queue\n"
+               "  -R --reload              Reload rules and databases\n"
+               "  -p --property=KEY=VALUE  Set a global property for all events\n"
+               "  -m --children-max=N      Maximum number of children\n"
+               "     --timeout=SECONDS     Maximum time to block for a reply\n"
+               , program_invocation_short_name);
 }
 
-static int adm_control(struct udev *udev, int argc, char *argv[])
-{
-        struct udev_ctrl *uctrl = NULL;
+static int adm_control(struct udev *udev, int argc, char *argv[]) {
+        _cleanup_udev_ctrl_unref_ struct udev_ctrl *uctrl = NULL;
         int timeout = 60;
-        int rc = 1;
+        int rc = 1, c;
 
         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' },
-                { "reload", no_argument, NULL, 'R' },
-                { "reload-rules", no_argument, NULL, 'R' },
-                { "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' },
+                { "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' },
+                { "reload",           no_argument,       NULL, 'R' },
+                { "reload-rules",     no_argument,       NULL, 'R' }, /* alias for -R */
+                { "property",         required_argument, NULL, 'p' },
+                { "env",              required_argument, NULL, 'p' }, /* alias for -p */
+                { "children-max",     required_argument, NULL, 'm' },
+                { "timeout",          required_argument, NULL, 't' },
+                { "help",             no_argument,       NULL, 'h' },
                 {}
         };
 
@@ -71,14 +68,8 @@ static int adm_control(struct udev *udev, int argc, char *argv[])
         if (uctrl == NULL)
                 return 2;
 
-        for (;;) {
-                int option;
-
-                option = getopt_long(argc, argv, "el:sSRp:m:h", options, NULL);
-                if (option == -1)
-                        break;
-
-                switch (option) {
+        while ((c = getopt_long(argc, argv, "el:sSRp:m:h", options, NULL)) >= 0)
+                switch (c) {
                 case 'e':
                         if (udev_ctrl_send_exit(uctrl, timeout) < 0)
                                 rc = 2;
@@ -91,7 +82,7 @@ static int adm_control(struct udev *udev, int argc, char *argv[])
                         i = util_log_priority(optarg);
                         if (i < 0) {
                                 fprintf(stderr, "invalid number '%s'\n", optarg);
-                                goto out;
+                                return rc;
                         }
                         if (udev_ctrl_send_set_log_level(uctrl, util_log_priority(optarg), timeout) < 0)
                                 rc = 2;
@@ -120,7 +111,7 @@ static int adm_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 out;
+                                return rc;
                         }
                         if (udev_ctrl_send_set_env(uctrl, optarg, timeout) < 0)
                                 rc = 2;
@@ -134,7 +125,7 @@ static int adm_control(struct udev *udev, int argc, char *argv[])
                         i = strtoul(optarg, &endp, 0);
                         if (endp[0] != '\0' || i < 1) {
                                 fprintf(stderr, "invalid number '%s'\n", optarg);
-                                goto out;
+                                return rc;
                         }
                         if (udev_ctrl_send_set_children_max(uctrl, i, timeout) < 0)
                                 rc = 2;
@@ -157,19 +148,16 @@ static int adm_control(struct udev *udev, int argc, char *argv[])
                         rc = 0;
                         break;
                 }
-        }
 
-        if (argv[optind] != NULL)
-                fprintf(stderr, "unknown option\n");
+        if (optind < argc)
+                fprintf(stderr, "Extraneous argument: %s\n", argv[optind]);
         else if (optind == 1)
-                fprintf(stderr, "missing option\n");
-out:
-        udev_ctrl_unref(uctrl);
+                fprintf(stderr, "Option missing\n");
         return rc;
 }
 
 const struct udevadm_cmd udevadm_control = {
         .name = "control",
         .cmd = adm_control,
-        .help = "control the udev daemon",
+        .help = "Control the udev daemon",
 };