From e3396a2d383cf19092911a4643e092f6a825b2aa Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Mon, 21 Aug 2006 02:38:20 +0200 Subject: [PATCH] cleanup commandline argument handling Print and log failure, but don't fail for tools which are usually not used iteractively. Add '--help' to all tools. --- udev.c | 4 ++-- udevcontrol.c | 29 +++++++++++---------------- udevd.c | 55 ++++++++++++++++++++++++++++----------------------- udevinfo.c | 53 ++++++++++++++++++++++++------------------------- udevmonitor.c | 9 ++++----- udevsettle.c | 23 ++++++++++----------- udevtest.c | 38 +++++++++++++++++++++-------------- udevtrigger.c | 22 +++++++++++++-------- 8 files changed, 122 insertions(+), 111 deletions(-) diff --git a/udev.c b/udev.c index c633fff14..6b454f315 100644 --- 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); diff --git a/udevcontrol.c b/udevcontrol.c index 9231f2e08..431befe39 100644 --- a/udevcontrol.c +++ b/udevcontrol.c @@ -1,7 +1,7 @@ /* * udevcontrol.c * - * Copyright (C) 2005 Kay Sievers + * Copyright (C) 2005-2006 Kay Sievers * * 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= 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= maximum number of childs\n" - " max_childs_running= 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= 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= maximum number of childs\n" + " max_childs_running= 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 3da56ca29..e27dd78db 100644 --- 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); diff --git a/udevinfo.c b/udevinfo.c index d6f564079..a0a17c40b 100644 --- a/udevinfo.c +++ b/udevinfo.c @@ -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; } diff --git a/udevmonitor.c b/udevmonitor.c index 4c59a495d..6f2844ff1 100644 --- a/udevmonitor.c +++ b/udevmonitor.c @@ -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); } diff --git a/udevsettle.c b/udevsettle.c index 3215b3c5b..b38968e7d 100644 --- a/udevsettle.c +++ b/udevsettle.c @@ -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=]\n"); + } else if (strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) { + printf("Usage: udevsettle [--help] [--timeout=]\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)); diff --git a/udevtest.c b/udevtest.c index 22627c05a..f8010ca5b 100644 --- a/udevtest.c +++ b/udevtest.c @@ -2,6 +2,7 @@ * udevtest.c * * Copyright (C) 2003-2004 Greg Kroah-Hartman + * Copyright (C) 2004-2006 Kay Sievers * * 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 "); - 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] \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; } diff --git a/udevtrigger.c b/udevtrigger.c index 9345a06ab..e530a61c0 100644 --- a/udevtrigger.c +++ b/udevtrigger.c @@ -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: -- 2.30.2