From 89e94ad333d6709846aaf2c063282583fec1e5f9 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 21 Aug 2018 16:24:23 +0900 Subject: [PATCH] udevadm-test: modernize code --- src/udev/udevadm-test.c | 99 ++++++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 47 deletions(-) diff --git a/src/udev/udevadm-test.c b/src/udev/udevadm-test.c index 2aa578b4c9..65e14a8664 100644 --- a/src/udev/udevadm-test.c +++ b/src/udev/udevadm-test.c @@ -15,9 +15,12 @@ #include "string-util.h" #include "udev.h" #include "udevadm.h" -#include "udevadm-util.h" -static void help(void) { +static const char *arg_action = "add"; +static int arg_resolve_names = 1; +static char arg_syspath[UTIL_PATH_SIZE] = {}; + +static int help(void) { printf("%s test [OPTIONS] DEVPATH\n\n" "Test an event run.\n\n" @@ -26,20 +29,11 @@ static void help(void) { " -a --action=ACTION Set action string\n" " -N --resolve-names=early|late|never When to resolve names\n" , program_invocation_short_name); + + return 0; } -int test_main(int argc, char *argv[], void *userdata) { - int resolve_names = 1; - char filename[UTIL_PATH_SIZE]; - const char *action = "add"; - const char *syspath = NULL; - struct udev_list_entry *entry; - _cleanup_(udev_rules_unrefp) struct udev_rules *rules = NULL; - _cleanup_(udev_device_unrefp) struct udev_device *dev = NULL; - _cleanup_(udev_event_unrefp) struct udev_event *event = NULL; - sigset_t mask, sigmask_orig; - int rc = 0, c; - +static int parse_argv(int argc, char *argv[]) { static const struct option options[] = { { "action", required_argument, NULL, 'a' }, { "resolve-names", required_argument, NULL, 'N' }, @@ -48,46 +42,63 @@ int test_main(int argc, char *argv[], void *userdata) { {} }; - log_set_max_level(LOG_DEBUG); - log_debug("version %s", PACKAGE_VERSION); + int c; while ((c = getopt_long(argc, argv, "a:N:Vh", options, NULL)) >= 0) switch (c) { case 'a': - action = optarg; + arg_action = optarg; break; case 'N': if (streq (optarg, "early")) { - resolve_names = 1; + arg_resolve_names = 1; } else if (streq (optarg, "late")) { - resolve_names = 0; + arg_resolve_names = 0; } else if (streq (optarg, "never")) { - resolve_names = -1; + arg_resolve_names = -1; } else { - fprintf(stderr, "resolve-names must be early, late or never\n"); log_error("resolve-names must be early, late or never"); - exit(EXIT_FAILURE); + return -EINVAL; } break; case 'V': - print_version(); - exit(EXIT_SUCCESS); + return version(); case 'h': - help(); - exit(EXIT_SUCCESS); + return help(); case '?': - exit(EXIT_FAILURE); + return -EINVAL; default: assert_not_reached("Unknown option"); } - syspath = argv[optind]; - if (syspath == NULL) { - fprintf(stderr, "syspath parameter missing\n"); - rc = 2; - goto out; + if (!argv[optind]) { + log_error("syspath parameter missing."); + return -EINVAL; } + /* add /sys if needed */ + if (!startswith(argv[optind], "/sys")) + strscpyl(arg_syspath, sizeof(arg_syspath), "/sys", argv[optind], NULL); + else + strscpy(arg_syspath, sizeof(arg_syspath), argv[optind]); + + return 1; +} + +int test_main(int argc, char *argv[], void *userdata) { + _cleanup_(udev_rules_unrefp) struct udev_rules *rules = NULL; + _cleanup_(udev_device_unrefp) struct udev_device *dev = NULL; + _cleanup_(udev_event_unrefp) struct udev_event *event = NULL; + struct udev_list_entry *entry; + sigset_t mask, sigmask_orig; + int r; + + log_set_max_level(LOG_DEBUG); + + r = parse_argv(argc, argv); + if (r <= 0) + return r; + printf("This program is for debugging only, it does not run any program\n" "specified by a RUN key. It may show incorrect results, because\n" "some values may be different, or not available at a simulation run.\n" @@ -97,24 +108,16 @@ int test_main(int argc, char *argv[], void *userdata) { udev_builtin_init(); - rules = udev_rules_new(resolve_names); - if (rules == NULL) { - fprintf(stderr, "error reading rules\n"); - rc = 3; + rules = udev_rules_new(arg_resolve_names); + if (!rules) { + log_error("Failed to read udev rules."); + r = -ENOMEM; goto out; } - /* add /sys if needed */ - if (!startswith(syspath, "/sys")) - strscpyl(filename, sizeof(filename), "/sys", syspath, NULL); - else - strscpy(filename, sizeof(filename), syspath); - delete_trailing_chars(filename, "/"); - - dev = udev_device_new_from_synthetic_event(NULL, filename, action); + dev = udev_device_new_from_synthetic_event(NULL, arg_syspath, arg_action); if (dev == NULL) { - fprintf(stderr, "unable to open device '%s'\n", filename); - rc = 4; + r = log_error_errno(errno, "Failed to open device '%s': %m", arg_syspath); goto out; } @@ -140,7 +143,9 @@ int test_main(int argc, char *argv[], void *userdata) { udev_event_apply_format(event, udev_list_entry_get_name(entry), program, sizeof(program), false); printf("run: '%s'\n", program); } + + r = 0; out: udev_builtin_exit(); - return rc; + return r; }