diff --git a/man/udevadm.xml b/man/udevadm.xml index 13cf106d876..07169f2e504 100644 --- a/man/udevadm.xml +++ b/man/udevadm.xml @@ -880,6 +880,15 @@ + + + + + Shows verbose logs in processing udev rules. + + + + diff --git a/shell-completion/bash/udevadm b/shell-completion/bash/udevadm index e5626c9301a..c4aea7039c6 100644 --- a/shell-completion/bash/udevadm +++ b/shell-completion/bash/udevadm @@ -69,7 +69,8 @@ _udevadm() { [CONTROL_ARG]='-l --log-priority -p --property -m --children-max -t --timeout' [MONITOR_STANDALONE]='-k --kernel -u --udev -p --property' [MONITOR_ARG]='-s --subsystem-match -t --tag-match' - [TEST]='-a --action -N --resolve-names' + [TEST_STANDALONE]='-v --verbose' + [TEST_ARG]='-a --action -N --resolve-names' [TEST_BUILTIN]='-a --action' [VERIFY]='-N --resolve-names --root --no-summary --no-style' [WAIT]='-t --timeout --initialized=no --removed --settle' @@ -216,7 +217,7 @@ _udevadm() { ;; 'test') - if __contains_word "$prev" ${OPTS[TEST]}; then + if __contains_word "$prev" ${OPTS[TEST_ARG]}; then case $prev in -a|--action) comps=$( udevadm test --action help ) @@ -225,12 +226,8 @@ _udevadm() { comps='early late never' ;; esac - COMPREPLY=( $(compgen -W '$comps' -- "$cur") ) - return 0 - fi - - if [[ $cur = -* ]]; then - comps="${OPTS[COMMON]} ${OPTS[TEST]}" + elif [[ $cur = -* ]]; then + comps="${OPTS[COMMON]} ${OPTS[TEST_ARG]} ${OPTS[TEST_STANDALONE]}" else comps=$( __get_all_devices ) local IFS=$'\n' diff --git a/shell-completion/zsh/_udevadm b/shell-completion/zsh/_udevadm index 5f5761cbfa3..c0141e5cd38 100644 --- a/shell-completion/zsh/_udevadm +++ b/shell-completion/zsh/_udevadm @@ -88,6 +88,7 @@ _udevadm_test(){ '(-)'{-V,--version}'[Show package version]' \ '--action=[The action string.]:actions:(add change remove move online offline bind unbind)' \ '--subsystem=[The subsystem string.]' \ + '(-v --verbose)'{-v,--verbose}'[Show verbose logs.]' \ '*::devpath:_files -P /sys/ -W /sys' } diff --git a/src/udev/udev-event.h b/src/udev/udev-event.h index b1ad2bf0c2f..11e2c700e63 100644 --- a/src/udev/udev-event.h +++ b/src/udev/udev-event.h @@ -48,6 +48,7 @@ typedef struct UdevEvent { bool name_final; bool devlink_final; bool run_final; + bool trace; bool log_level_was_debug; int default_log_level; EventMode event_mode; diff --git a/src/udev/udevadm-test.c b/src/udev/udevadm-test.c index 5db991b8a6a..088522b915f 100644 --- a/src/udev/udevadm-test.c +++ b/src/udev/udevadm-test.c @@ -34,6 +34,7 @@ static sd_device_action_t arg_action = SD_DEVICE_ADD; static ResolveNameTiming arg_resolve_name_timing = RESOLVE_NAME_EARLY; static const char *arg_syspath = NULL; +static bool arg_verbose = false; static int help(void) { @@ -42,7 +43,8 @@ static int help(void) { " -h --help Show this help\n" " -V --version Show package version\n" " -a --action=ACTION|help Set action string\n" - " -N --resolve-names=early|late|never When to resolve names\n", + " -N --resolve-names=early|late|never When to resolve names\n" + " -v --verbose Show verbose logs\n", program_invocation_short_name); return 0; @@ -52,6 +54,7 @@ static int parse_argv(int argc, char *argv[]) { static const struct option options[] = { { "action", required_argument, NULL, 'a' }, { "resolve-names", required_argument, NULL, 'N' }, + { "verbose", no_argument, NULL, 'v' }, { "version", no_argument, NULL, 'V' }, { "help", no_argument, NULL, 'h' }, {} @@ -59,7 +62,7 @@ static int parse_argv(int argc, char *argv[]) { int r, c; - while ((c = getopt_long(argc, argv, "a:N:Vh", options, NULL)) >= 0) + while ((c = getopt_long(argc, argv, "a:N:vVh", options, NULL)) >= 0) switch (c) { case 'a': r = parse_device_action(optarg, &arg_action); @@ -74,6 +77,9 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "--resolve-names= must be early, late or never"); break; + case 'v': + arg_verbose = true; + break; case 'V': return print_version(); case 'h': @@ -105,20 +111,23 @@ int test_main(int argc, char *argv[], void *userdata) { 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" - "\n"); + puts("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."); assert_se(sigprocmask(SIG_SETMASK, NULL, &sigmask_orig) >= 0); + puts("\nLoading builtins..."); udev_builtin_init(); + puts("Loading builtins done."); + puts("\nLoading udev rules files..."); r = udev_rules_load(&rules, arg_resolve_name_timing); if (r < 0) { log_error_errno(r, "Failed to read udev rules: %m"); goto out; } + puts("Loading udev rules files done."); r = find_device_with_action(arg_syspath, arg_action, &dev); if (r < 0) { @@ -134,12 +143,16 @@ int test_main(int argc, char *argv[], void *userdata) { log_oom(); goto out; } + event->trace = arg_verbose; assert_se(sigfillset(&mask) >= 0); assert_se(sigprocmask(SIG_SETMASK, &mask, &sigmask_orig) >= 0); + printf("\nProcessing udev rules%s...\n", arg_verbose ? "" : " (verbose logs can be shown by -v/--verbose)"); udev_event_execute_rules(event, rules); + puts("Processing udev rules done."); + puts(""); printf("%sProperties:%s\n", ansi_highlight(), ansi_normal()); FOREACH_DEVICE_PROPERTY(dev, key, value) printf(" %s=%s\n", key, value); diff --git a/test/units/TEST-17-UDEV.10.sh b/test/units/TEST-17-UDEV.10.sh index e38291bdde8..5ee1cd3e429 100755 --- a/test/units/TEST-17-UDEV.10.sh +++ b/test/units/TEST-17-UDEV.10.sh @@ -141,6 +141,7 @@ udevadm test -N early /sys/class/net/$netdev udevadm test -N late /sys/class/net/$netdev udevadm test --resolve-names never /sys/class/net/$netdev (! udevadm test -N hello /sys/class/net/$netdev) +udevadm test -v /sys/class/net/$netdev udevadm test -h # udevadm test-builtin path_id "$loopdev"