chiark / gitweb /
cleanup commandline argument handling
authorKay Sievers <kay.sievers@suse.de>
Mon, 21 Aug 2006 00:38:20 +0000 (02:38 +0200)
committerKay Sievers <kay.sievers@suse.de>
Mon, 21 Aug 2006 00:38:20 +0000 (02:38 +0200)
Print and log failure, but don't fail for tools which are
usually not used iteractively. Add '--help' to all tools.

udev.c
udevcontrol.c
udevd.c
udevinfo.c
udevmonitor.c
udevsettle.c
udevtest.c
udevtrigger.c

diff --git a/udev.c b/udev.c
index c633fff14b5afb9209f7d3d319befc8cdf9f6064..6b454f3157a3d46fff83916af8e22bdcdab2df83 100644 (file)
--- a/udev.c
+++ b/udev.c
@@ -77,7 +77,7 @@ int main(int argc, char *argv[], char *envp[])
                exit(0);
        }
 
-       /* set std fd's to /dev/null, if the kernel forks us, we don't have them at all */
+       /* set std fd's to /dev/null, /sbin/hotplug forks us, we don't have them at all */
        devnull = open("/dev/null", O_RDWR);
        if (devnull >= 0)  {
                if (devnull != STDIN_FILENO)
@@ -92,7 +92,7 @@ int main(int argc, char *argv[], char *envp[])
 
        logging_init("udev");
        if (devnull < 0)
-               err("fatal, could not open /dev/null: %s", strerror(errno));
+               err("open /dev/null failed: %s", strerror(errno));
        udev_config_init();
        selinux_init();
        dbg("version %s", UDEV_VERSION);
index 9231f2e08474d50a3f9cb78bf48caaaa0b39e6a5..431befe39cc210961da8dcde66365ede21059666 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * udevcontrol.c
  *
- * Copyright (C) 2005 Kay Sievers <kay.sievers@vrfy.org>
+ * Copyright (C) 2005-2006 Kay Sievers <kay.sievers@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 the
@@ -50,18 +50,6 @@ void log_message (int priority, const char *format, ...)
 }
 #endif
 
-static void usage(void)
-{
-       printf("Usage: udevcontrol COMMAND\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"
-               "  max_childs=<N>         maximum number of childs\n"
-               "  max_childs_running=<N> maximum number of childs running at the same time\n"
-               "  --help                 print this help text\n\n");
-}
-
 int main(int argc, char *argv[], char *envp[])
 {
        static struct udevd_ctrl_msg ctrl_msg;
@@ -82,7 +70,6 @@ int main(int argc, char *argv[], char *envp[])
 
        if (argc < 2) {
                fprintf(stderr, "missing command\n\n");
-               usage();
                goto exit;
        }
 
@@ -133,17 +120,23 @@ int main(int argc, char *argv[], char *envp[])
                        *intval = count;
                        info("send max_childs_running=%i", *intval);
                } else if (strcmp(arg, "help") == 0  || strcmp(arg, "--help") == 0  || strcmp(arg, "-h") == 0) {
-                       usage();
+                       printf("Usage: udevcontrol COMMAND\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"
+                               "  max_childs=<N>         maximum number of childs\n"
+                               "  max_childs_running=<N> maximum number of childs running at the same time\n"
+                               "  --help                 print this help text\n\n");
                        goto exit;
                } else {
-                       fprintf(stderr, "unknown option\n\n");
-                       usage();
+                       fprintf(stderr, "unrecognized command '%s'\n", arg);
                        goto exit;
                }
        }
 
        if (getuid() != 0) {
-               fprintf(stderr, "need to be root, exit\n\n");
+               fprintf(stderr, "root privileges required\n");
                goto exit;
        }
 
diff --git a/udevd.c b/udevd.c
index 3da56ca2944c529c73491561ff2562438580ca3b..e27dd78db321c2f07361c8d693f4a384d4f4b972 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -921,63 +921,56 @@ int main(int argc, char *argv[], char *envp[])
        const char *value;
        int daemonize = 0;
        int i;
-       int rc = 0;
+       int rc = 1;
        int maxfd;
 
-       /* redirect std fd's, if the kernel forks us, we don't have them at all */
-       fd = open("/dev/null", O_RDWR);
-       if (fd >= 0) {
-               if (fd != STDIN_FILENO)
-                       dup2(fd, STDIN_FILENO);
-               if (fd != STDOUT_FILENO)
-                       dup2(fd, STDOUT_FILENO);
-               if (fd != STDERR_FILENO)
-                       dup2(fd, STDERR_FILENO);
-               if (fd > STDERR_FILENO)
-                       close(fd);
-       }
-
        logging_init("udevd");
-       if (fd < 0)
-               err("fatal, could not open /dev/null: %s", strerror(errno));
-
        udev_config_init();
        selinux_init();
        dbg("version %s", UDEV_VERSION);
 
        if (getuid() != 0) {
-               err("need to be root, exit");
+               fprintf(stderr, "root privileges required\n");
+               err("root privileges required");
                goto exit;
        }
 
        /* parse commandline options */
        for (i = 1 ; i < argc; i++) {
                char *arg = argv[i];
-               if (strcmp(arg, "--daemon") == 0 || strcmp(arg, "-d") == 0) {
-                       info("will daemonize");
+               if (strcmp(arg, "--daemon") == 0 || strcmp(arg, "-d") == 0)
                        daemonize = 1;
+               else if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) {
+                       printf("Usage: udevd [--help] [--daemon]\n");
+                       goto exit;
+               } else {
+                       fprintf(stderr, "unrecognized option '%s'\n", arg);
+                       err("unrecognized option '%s'\n", arg);
                }
        }
 
        /* init sockets to receive events */
        if (init_udevd_socket() < 0) {
                if (errno == EADDRINUSE) {
-                       err("another udevd running, exit");
+                       fprintf(stderr, "another udev daemon already running\n");
+                       err("another udev daemon already running");
                        rc = 1;
                } else {
-                       err("error initializing udevd socket: %s", strerror(errno));
+                       fprintf(stderr, "error initializing udevd socket\n");
+                       err("error initializing udevd socket");
                        rc = 2;
                }
                goto exit;
        }
 
        if (init_uevent_netlink_sock() < 0) {
-               err("uevent socket not available");
+               fprintf(stderr, "error initializing netlink socket\n");
+               err("error initializing netlink socket");
                rc = 3;
                goto exit;
        }
 
-       /* parse the rules and keep it in memory */
+       /* parse the rules and keep them in memory */
        sysfs_init();
        udev_rules_init(&rules, 1);
 
@@ -1001,6 +994,17 @@ int main(int argc, char *argv[], char *envp[])
                }
        }
 
+       /* redirect std fd's */
+       fd = open("/dev/null", O_RDWR);
+       if (fd >= 0) {
+               dup2(fd, STDIN_FILENO);
+               dup2(fd, STDOUT_FILENO);
+               dup2(fd, STDERR_FILENO);
+               if (fd > STDERR_FILENO)
+                       close(fd);
+       } else
+               err("error opening /dev/null: %s", strerror(errno));
+
        /* set scheduling priority for the daemon */
        setpriority(PRIO_PROCESS, 0, UDEVD_PRIORITY);
 
@@ -1162,7 +1166,7 @@ int main(int argc, char *argv[], char *envp[])
                        }
                }
 
-               /* rules changed, set by inotify or a signal*/
+               /* rules changed, set by inotify or a HUP signal */
                if (reload_config) {
                        reload_config = 0;
                        udev_rules_cleanup(&rules);
@@ -1181,6 +1185,7 @@ int main(int argc, char *argv[], char *envp[])
                                msg_queue_manager();
                }
        }
+       rc = 0;
 
 exit:
        udev_rules_cleanup(&rules);
index d6f564079f0510687c67576efc52434e0c4af6cf..a0a17c40b4d1828e31eaa6c4f8318fe577a0b906 100644 (file)
@@ -163,30 +163,8 @@ static void export_db(void fnct(struct udevice *udev)) {
        name_list_cleanup(&name_list);
 }
 
-static void print_help(void)
-{
-       fprintf(stderr, "Usage: udevinfo [-anpqrVh]\n"
-              "  -q TYPE  query database for the specified value:\n"
-              "             'name'    name of device node\n"
-              "             'symlink' pointing to node\n"
-              "             'path'    sysfs device path\n"
-              "             'env'     the device related imported environment\n"
-              "             'all'     all values\n"
-              "\n"
-              "  -p PATH  sysfs device path used for query or chain\n"
-              "  -n NAME  node/symlink name used for query\n"
-              "\n"
-              "  -r       prepend to query result or print udev_root\n"
-              "  -a       print all SYSFS_attributes along the device chain\n"
-              "  -e       export the content of the udev database\n"
-              "  -V       print udev version\n"
-              "  -h       print this help text\n"
-              "\n");
-}
-
 int main(int argc, char *argv[], char *envp[])
 {
-       static const char short_options[] = "aden:p:q:rVh";
        int option;
        struct udevice *udev;
        int root = 0;
@@ -213,7 +191,6 @@ int main(int argc, char *argv[], char *envp[])
        int rc = 0;
 
        logging_init("udevinfo");
-
        udev_config_init();
        sysfs_init();
 
@@ -224,8 +201,9 @@ int main(int argc, char *argv[], char *envp[])
        }
 
        /* get command line options */
+       opterr = 0;
        while (1) {
-               option = getopt(argc, argv, short_options);
+               option = getopt(argc, argv, ":aden:p:q:rVh");
                if (option == -1)
                        break;
 
@@ -291,9 +269,30 @@ int main(int argc, char *argv[], char *envp[])
                        printf("udevinfo, version %s\n", UDEV_VERSION);
                        goto exit;
                case 'h':
+                       printf("Usage: udevinfo [-anpqrVh]\n"
+                              "  -q TYPE  query database for the specified value:\n"
+                              "             'name'    name of device node\n"
+                              "             'symlink' pointing to node\n"
+                              "             'path'    sysfs device path\n"
+                              "             'env'     the device related imported environment\n"
+                              "             'all'     all values\n"
+                              "\n"
+                              "  -p PATH  sysfs device path used for query or chain\n"
+                              "  -n NAME  node/symlink name used for query\n"
+                              "\n"
+                              "  -r       prepend to query result or print udev_root\n"
+                              "  -a       print all SYSFS_attributes along the device chain\n"
+                              "  -e       export the content of the udev database\n"
+                              "  -V       print udev version\n"
+                              "  -h       print this help text\n"
+                              "\n");
+                       goto exit;
+               case ':':
+                       fprintf(stderr, "missing argument for '%c'\n", optopt);
+                       goto exit;
                case '?':
                default:
-                       print_help();
+                       fprintf(stderr, "unrecognized option '%c'\n", optopt);
                        goto exit;
                }
        }
@@ -352,7 +351,7 @@ int main(int argc, char *argv[], char *envp[])
                        print_record(udev);
                        break;
                default:
-                       print_help();
+                       fprintf(stderr, "unknown query type\n");
                        break;
                }
                break;
@@ -378,7 +377,7 @@ int main(int argc, char *argv[], char *envp[])
                printf("%s\n", udev_root);
                break;
        default:
-               print_help();
+               fprintf(stderr, "missing option\n");
                rc = 1;
                break;
        }
index 4c59a495dbc92c90fa77e45ff6a43401463646e0..6f2844ff150b46265cd506184a4c06a64ed47d61 100644 (file)
@@ -118,22 +118,21 @@ int main(int argc, char *argv[])
 
        for (i = 1 ; i < argc; i++) {
                char *arg = argv[i];
-               if (strcmp(arg, "--env") == 0 || strcmp(arg, "-e") == 0) {
+               if (strcmp(arg, "--env") == 0 || strcmp(arg, "-e") == 0)
                        env = 1;
-               }
                else if (strcmp(arg, "--help") == 0  || strcmp(arg, "-h") == 0){
-                       printf("Usage: udevmonitor [--env]\n"
+                       printf("Usage: udevmonitor [--help] [--env]\n"
                                "  --env    print the whole event environment\n"
                                "  --help   print this help text\n\n");
                        exit(0);
                } else {
-                       fprintf(stderr, "unknown option\n\n");
+                       fprintf(stderr, "unrecognized option '%s'\n", arg);
                        exit(1);
                }
        }
 
        if (getuid() != 0) {
-               fprintf(stderr, "need to be root, exit\n\n");
+               fprintf(stderr, "root privileges required\n");
                exit(2);
        }
 
index 3215b3c5baa259c37da5d8d3c69d2d2151da11ba..b38968e7dfa644b6b08501a771fdafd945041bee 100644 (file)
@@ -36,7 +36,6 @@
 #define DEFAULT_TIMEOUT                        180
 #define LOOP_PER_SECOND                        20
 
-static const char *udev_log_str;
 
 #ifdef USE_LOG
 void log_message(int priority, const char *format, ...)
@@ -69,28 +68,30 @@ int main(int argc, char *argv[], char *envp[])
        logging_init("udevsettle");
        udev_config_init();
        dbg("version %s", UDEV_VERSION);
-
-       udev_log_str = getenv("UDEV_LOG");
+       sysfs_init();
 
        for (i = 1 ; i < argc; i++) {
                char *arg = argv[i];
 
                if (strncmp(arg, "--timeout=", 10) == 0) {
                        char *str = &arg[10];
+                       int seconds;
 
-                       timeout = atoi(str);
+                       seconds = atoi(str);
+                       if (seconds > 0)
+                               timeout = seconds;
+                       else
+                               fprintf(stderr, "invalid timeout value\n");
                        dbg("timeout=%i", timeout);
-                       if (timeout <= 0) {
-                               fprintf(stderr, "Invalid timeout value.\n");
-                               goto exit;
-                       }
-               } else {
-                       fprintf(stderr, "Usage: udevsettle [--timeout=<seconds>]\n");
+               } else if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) {
+                       printf("Usage: udevsettle [--help] [--timeout=<seconds>]\n");
                        goto exit;
+               } else {
+                       fprintf(stderr, "unrecognized option '%s'\n", arg);
+                       err("unrecognized option '%s'\n", arg);
                }
        }
 
-       sysfs_init();
        strlcpy(queuename, udev_root, sizeof(queuename));
        strlcat(queuename, "/" EVENT_QUEUE_DIR, sizeof(queuename));
 
index 22627c05a7eb9c59dc63f2fb689817964c71f869..f8010ca5b889613ac96b1d13a665c7148e849820 100644 (file)
@@ -2,6 +2,7 @@
  * udevtest.c
  *
  * Copyright (C) 2003-2004 Greg Kroah-Hartman <greg@kroah.com>
+ * Copyright (C) 2004-2006 Kay Sievers <kay.sievers@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 the
@@ -50,45 +51,52 @@ void log_message (int priority, const char *format, ...)
 
 int main(int argc, char *argv[], char *envp[])
 {
-       struct udev_rules rules;
-       char *devpath;
+       struct udev_rules rules = {};
+       char *devpath = NULL;
        struct udevice *udev;
        struct sysfs_device *dev;
+       int i;
        int retval;
        int rc = 0;
 
        info("version %s", UDEV_VERSION);
-
-       /* initialize our configuration */
        udev_config_init();
        if (udev_log_priority < LOG_INFO)
                udev_log_priority = LOG_INFO;
 
-       if (argc != 2) {
-               info("Usage: udevtest <devpath>");
-               return 1;
+       for (i = 1 ; i < argc; i++) {
+               char *arg = argv[i];
+
+               if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) {
+                       printf("Usage: udevtest [--help] <devpath>\n");
+                       goto exit;
+               } else
+                       devpath = arg;
+       }
+
+       if (devpath == NULL) {
+               fprintf(stderr, "devpath parameter missing\n");
+               rc = 1;
+               goto exit;
        }
 
        sysfs_init();
+       udev_rules_init(&rules, 0);
 
        /* remove /sys if given */
-       if (strncmp(argv[1], sysfs_path, strlen(sysfs_path)) == 0)
-               devpath = &argv[1][strlen(sysfs_path)];
-       else
-               devpath = argv[1];
-
-       udev_rules_init(&rules, 0);
+       if (strncmp(devpath, sysfs_path, strlen(sysfs_path)) == 0)
+               devpath = &devpath[strlen(sysfs_path)];
 
        dev = sysfs_device_get(devpath);
        if (dev == NULL) {
-               info("unable to open '%s'", devpath);
+               fprintf(stderr, "unable to open device '%s'\n", devpath);
                rc = 2;
                goto exit;
        }
 
        udev = udev_device_init();
        if (udev == NULL) {
-               info("can't open device");
+               fprintf(stderr, "error initializing device\n");
                rc = 3;
                goto exit;
        }
index 9345a06ab7b0c530cb37cca26d4db368d4f928cc..e530a61c0bf5a35e3c24d334d98d83a7b93e1dc4 100644 (file)
@@ -359,6 +359,7 @@ static void scan_failed(void)
 int main(int argc, char *argv[], char *envp[])
 {
        int i;
+       int failed = 0;
 
        logging_init("udevtrigger");
        udev_config_init();
@@ -373,19 +374,24 @@ int main(int argc, char *argv[], char *envp[])
                } else if (strcmp(arg, "--dry-run") == 0 || strcmp(arg, "-n") == 0) {
                        dry_run = 1;
                } else if (strcmp(arg, "--retry-failed") == 0 || strcmp(arg, "-F") == 0) {
-                       scan_failed();
-                       exec_lists();
+                       failed = 1;
+               } else if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) {
+                       printf("Usage: udevtrigger [--help] [--verbose] [--dry-run] [--retry-failed]\n");
                        goto exit;
                } else {
-                       fprintf(stderr, "Usage: udevtrigger [--verbose] [--dry-run] [--retry-failed]\n");
-                       goto exit;
+                       fprintf(stderr, "unrecognized option '%s'\n", arg);
+                       err("unrecognized option '%s'\n", arg);
                }
        }
 
-       /* default action */
-       scan_bus();
-       scan_class();
-       scan_block();
+       if (failed)
+               scan_failed();
+       else {
+               /* default action */
+               scan_bus();
+               scan_class();
+               scan_block();
+       }
        exec_lists();
 
 exit: