From 7ce05a8d6631b2e99fb101bd639838c5ce8f60a7 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 17 Aug 2021 23:14:29 +0900 Subject: [PATCH] udevadm: introduce -a|--action option for test-builtin command As net_setup_link builtin requires that a device action is set for the sd_device object. --- man/udevadm.xml | 12 ++++++++++++ shell-completion/bash/udevadm | 13 ++++++++++++- shell-completion/zsh/_udevadm | 3 +++ src/udev/udevadm-test-builtin.c | 24 +++++++++++++++++------- 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/man/udevadm.xml b/man/udevadm.xml index 90adc64543..2704156840 100644 --- a/man/udevadm.xml +++ b/man/udevadm.xml @@ -619,6 +619,18 @@ for device DEVPATH, and print debug output. + + + + + Type of event to be simulated. Possible actions are add, + remove, change, move, + online, offline, bind, + and unbind. Also, the special value help can be used + to list the possible actions. The default value is add. + + + diff --git a/shell-completion/bash/udevadm b/shell-completion/bash/udevadm index 81036f3588..4210366808 100644 --- a/shell-completion/bash/udevadm +++ b/shell-completion/bash/udevadm @@ -61,6 +61,7 @@ _udevadm() { [MONITOR_STANDALONE]='-k --kernel -u --udev -p --property' [MONITOR_ARG]='-s --subsystem-match -t --tag-match' [TEST]='-a --action -N --resolve-names' + [TEST_BUILTIN]='-a --action' ) local verbs=(info trigger settle control monitor test-builtin test) @@ -215,6 +216,16 @@ _udevadm() { ;; 'test-builtin') + if __contains_word "$prev" ${OPTS[TEST_BUILTIN]}; then + case $prev in + -a|--action) + comps=$( udevadm test-builtin --action help ) + ;; + esac + COMPREPLY=( $(compgen -W '$comps' -- "$cur") ) + return 0 + fi + for ((i=0; i < COMP_CWORD; i++)); do if __contains_word "${COMP_WORDS[i]}" "${builtins[@]}"; then builtin=${COMP_WORDS[i]} @@ -225,7 +236,7 @@ _udevadm() { if [[ -z $builtin ]]; then comps="${builtins[@]}" elif [[ $cur = -* ]]; then - comps="${OPTS[COMMON]}" + comps="${OPTS[COMMON]} ${OPTS[TEST_BUILTIN]}" else comps=$( __get_all_sysdevs ) local IFS=$'\n' diff --git a/shell-completion/zsh/_udevadm b/shell-completion/zsh/_udevadm index 87fdb5e42c..1179f81a8b 100644 --- a/shell-completion/zsh/_udevadm +++ b/shell-completion/zsh/_udevadm @@ -84,14 +84,17 @@ _udevadm_test(){ _udevadm_test-builtin(){ if (( CURRENT == 2 )); then _arguments \ + '--action=[The action string.]:actions:(add change remove move online offline bind unbind)' \ '--help[Print help text]' \ '*::builtins:(blkid btrfs hwdb input_id net_id net_setup_link kmod path_id usb_id uaccess)' elif (( CURRENT == 3 )); then _arguments \ + '--action=[The action string.]:actions:(add change remove move online offline bind unbind)' \ '--help[Print help text]' \ '*::syspath:_files -P /sys -W /sys' else _arguments \ + '--action=[The action string.]:actions:(add change remove move online offline bind unbind)' \ '--help[Print help text]' fi } diff --git a/src/udev/udevadm-test-builtin.c b/src/udev/udevadm-test-builtin.c index 992fc70807..cae2950c8f 100644 --- a/src/udev/udevadm-test-builtin.c +++ b/src/udev/udevadm-test-builtin.c @@ -11,14 +11,16 @@ #include "udevadm.h" #include "udevadm-util.h" +static sd_device_action_t arg_action = SD_DEVICE_ADD; static const char *arg_command = NULL; static const char *arg_syspath = NULL; static int help(void) { printf("%s test-builtin [OPTIONS] COMMAND DEVPATH\n\n" "Test a built-in command.\n\n" - " -h --help Print this message\n" - " -V --version Print version of the program\n\n" + " -h --help Print this message\n" + " -V --version Print version of the program\n\n" + " -a --action=ACTION|help Set action string\n" "Commands:\n", program_invocation_short_name); @@ -29,15 +31,23 @@ static int help(void) { static int parse_argv(int argc, char *argv[]) { static const struct option options[] = { - { "version", no_argument, NULL, 'V' }, - { "help", no_argument, NULL, 'h' }, + { "action", required_argument, NULL, 'a' }, + { "version", no_argument, NULL, 'V' }, + { "help", no_argument, NULL, 'h' }, {} }; - int c; + int r, c; - while ((c = getopt_long(argc, argv, "Vh", options, NULL)) >= 0) + while ((c = getopt_long(argc, argv, "a:Vh", options, NULL)) >= 0) switch (c) { + case 'a': + r = parse_device_action(optarg, &arg_action); + if (r < 0) + return log_error_errno(r, "Invalid action '%s'", optarg); + if (r == 0) + return 0; + break; case 'V': return print_version(); case 'h': @@ -81,7 +91,7 @@ int builtin_main(int argc, char *argv[], void *userdata) { goto finish; } - r = find_device(arg_syspath, "/sys", &dev); + r = find_device_with_action(arg_syspath, arg_action, &dev); if (r < 0) { log_error_errno(r, "Failed to open device '%s': %m", arg_syspath); goto finish;