From a9d861c6196de94ea141f68ae41bf4ff33c225aa Mon Sep 17 00:00:00 2001 From: huyubiao Date: Tue, 12 Dec 2023 09:26:34 +0800 Subject: [PATCH 1/2] docs(devmaster): Add man for hwdb and devctl --- docs/man/exts/devmaster/devctl .md | 135 --------------- docs/man/exts/devmaster/devctl.md | 240 +++++++++++++++++++++++++++ docs/man/exts/hwdb/hwdb.md | 82 +++++++++ docs/man/exts/hwdb/sysmaster-hwdb.md | 38 +++++ 4 files changed, 360 insertions(+), 135 deletions(-) delete mode 100644 docs/man/exts/devmaster/devctl .md create mode 100644 docs/man/exts/devmaster/devctl.md create mode 100644 docs/man/exts/hwdb/hwdb.md create mode 100644 docs/man/exts/hwdb/sysmaster-hwdb.md diff --git a/docs/man/exts/devmaster/devctl .md b/docs/man/exts/devmaster/devctl .md deleted file mode 100644 index f5ce1e69..00000000 --- a/docs/man/exts/devmaster/devctl .md +++ /dev/null @@ -1,135 +0,0 @@ -# devctl使用手册 - -## 1.简介 - -`devctl`是`devmaster`的客户端管理工具,用来控制`demaster`的行为、模拟设备事件、调试规则等等。 - -```shell -# devctl --help -devmaster 0.5.0 -parse program arguments - -USAGE: - devctl - -OPTIONS: - -h, --help Print help information - -V, --version Print version information - -SUBCOMMANDS: - monitor Monitor device events from kernel and userspace - kill Kill all devmaster workers - test Send a fake device to devmaster - trigger Trigger a fake device action, then the kernel will report an uevent - test-builtin Test builtin command on a device - help Print this message or the help of the given subcommand(s) -``` - -## 2.选项 - -### devctl monitor [options] -监听内核上报的`uevent`事件和`devmaster`处理完设备后发出的事件,分别以`KERNEL`和`USERSPACE`作为前缀进行区分。 - -```shell -# devctl monitor --help -devctl-monitor -Monitor device events from kernel and userspace - -USAGE: - devctl monitor - -OPTIONS: - -h, --help Print help information -``` - -参数:无 - -选项: - -h, --help 显示帮助信息 - -### [deprecated] devctl kill -使`devmaster`终止所有`worker`,正在运行中的`worker`会等待执行完当前任务再终止,期间无法再接收新的任务。 - -参数:无 - -选项: - -h, --help 显示帮助信息 - -### [deprecated] devctl test -向`devmaster`发送模拟设备,调试`devmaster`的框架功能。 - -参数: - `` 模拟设备的名称 - -选项: - -h, --help 显示帮助信息 - -### devctl trigger [OPTIONS] [DEVICES]... - -模拟一个设备动作,使内核上报对应的uevent事件,用于重放内核初始化过程中的冷插(coldplug)设备事件。 - -```shell -# devctl trigger --help -devctl-trigger -Trigger a fake device action, then the kernel will report an uevent - -USAGE: - devctl trigger [OPTIONS] [DEVICES]... - -ARGS: - ... the devices to be triggered - -OPTIONS: - -a, --action the kind of device action to trigger - -h, --help Print help information - -n, --dry-run do not actually trigger the device events - -t, --type the enumerator type, can be devices (default) or subsystems - -v, --verbose print searched devices by enumerator -``` - -参数: - `...` 以`/sys`或`/dev`开头的设备路径 - -选项: - -h, --help 显示帮助信息 - - -a, --action `` 指定设备事件的动作类型 - - -t, --type `` 指定搜索的设备类型,可以是devices(设备)或者subsystems(子系统) - - -v, --verbose 打印搜索到的设备 - - -n, --dry-run 不会实际触发设备事件,配合--verbose选项使用时,可以查看系统中的设备清单 - -### devctl test-builtin [OPTIONS] - -测试内置命令在某个设备上的执行效果。 - -```shell -# devctl test-builtin --help -devctl-test-builtin -Test builtin command on a device - -USAGE: - devctl test-builtin [OPTIONS] - -ARGS: - builtin command - device syspath - -OPTIONS: - -a, --action device action - -h, --help Print help information -``` - -参数: - -​ `` 目前支持的内置命令包括:`blkid`、`input_id`、`kmod`、`net_id`、`net_setup_link`、`path_id`、`usb_id` - -​ `` 设备的`sysfs`路径 - -选项: - -​ -a, --action `` 指定设备事件的动作类型,包括:`add`、`change`、`remove`、`move`、`online`、`offline`、`bind`和`unbind` - -​ -h, --help 显示帮助信息 diff --git a/docs/man/exts/devmaster/devctl.md b/docs/man/exts/devmaster/devctl.md new file mode 100644 index 00000000..b0a2f316 --- /dev/null +++ b/docs/man/exts/devmaster/devctl.md @@ -0,0 +1,240 @@ +# devctl使用手册 + +## 1. 简介 + +`devctl`是`devmaster`的客户端管理工具,用来控制`devmaster`的行为、模拟设备事件、调试规则等等。 + +```shell +# devctl --help +devmaster 0.5.0 +parse program arguments + +USAGE: + devctl + +OPTIONS: + -h, --help Print help information + -V, --version Print version information + +SUBCOMMANDS: + info Query sysfs or the devmaster database + monitor Monitor device events from kernel and userspace + kill Kill all devmaster workers + trigger Trigger a fake device action, then the kernel will report an uevent + test-builtin Test builtin command on a device + control Control the devmaster daemon + hwdb The sub-command 'hwdb' is deprecated, and is left for backwards + compatibility. Please use sysmaster-hwdb instead + help Print this message or the help of the given subcommand(s) +``` + +## 2. 选项 +### devctl info [OPTIONS] [DEVICES] +从sysfs路径或devmaster数据库中查询设备信息。DEVICES参数用于指定一个或多个设备,它可以是 一个设备名(必须以 /dev/ 开头)、 一个 sys 路径(必须以 /sys/ 开头) +```shell +OPTIONS: + -a, --attribute-walk + 按照devmaster中匹配规则的格式,显示所有可用于匹配该设备的sysfs属性: 从该设备自身开始,沿着设备树向上回溯(一直到树根), 显示沿途每个设备的sysfs属性。 + + -c, --cleanup-db + 清除devmaster数据库。 + + -d, --device-id-of-file + 显示文件所在底层设备的主/次设备号。如果使用了此选项,那么将忽略所有位置参数。 + + -e, --export-db + 导出devmaster数据库的全部内容。 + + -h, --help + 显示简短的帮助信息并退出。 + + -q, --query + 提取特定类型的设备信息。TYPE 可以是下列值之一:name, symlink, path, property, all(默认值) + name 设备节点名称 + symlink 指向设备节点的软链接 + path 设备路径 + property or env 设备属性 + all 所有信息 + + -r, --root + 以绝对路径显示 --query=name 与 --query=symlink 的查询结果。 + + -x, --export + 以 key='value' 的格式输出此设备的属性(注意,值两边有单引号界定)。 仅在指定了 --query=property --query=env或 --device-id-of-file=FILE 的情况下才有效。 +``` + +### devctl monitor [OPTIONS] +监听内核上报的`uevent`事件和`devmaster`处理完设备后发出的事件,分别以`KERNEL`和`USERSPACE`作为前缀进行区分。 + +```shell +OPTIONS: + -e, --environment + 显示事件的各属性 (与-p功能一致)。 + + -h, --help + 显示简短的帮助信息并退出。 + + -k, --kernel + 显示"KERNEL"事件。 + + -p, --property + 显示事件的各属性。 + + -s, --subsystem-match + 根据 subsystem[/devtype] 对事件进行过滤,仅显示与"subsystem[/devtype]"匹配的事件。 如果多次使用此选项,那么表示以 OR 逻辑连接每个匹配规则,即任一匹配的设备都会被监视。 + + -t, --tag-match + 根据设备标签对事件进行过滤,仅显示与"标签"匹配的事件。 如果多次使用此选项,那么表示以 OR 逻辑连接每个匹配规则, 即拥有任一指定标签的设备都会被监视。 + + -u, --userspace + 显示"devmaster"处理完设备后发出的事件。 +``` + +### [deprecated] devctl kill +使`devmaster`终止所有`worker`,正在运行中的`worker`会等待执行完当前任务再终止,期间无法再接收新的任务。 + +参数:无 + +选项: + -h, --help 显示帮助信息 + +### devctl trigger [OPTIONS] [DEVICES]... +模拟一个设备动作,使内核上报对应的uevent事件,用于重放内核初始化过程中的冷插(coldplug)设备事件。 + +```shell +OPTIONS: + -a, --attr-match + 仅触发匹配 ATTR 属性的设备事件。如果同时还指定了"=VALUE",那么表示仅触发 ATTR 属性匹配 VALUE 的设备事件。 注意,可以在 VALUE 中使用shell风格的通配符。 如果多次使用此选项,那么表示以 AND 逻辑连接每个匹配规则, 即只有匹配所有指定属性的设备才会被触发。 + + -A, --attr-nomatch + 不触发匹配 ATTR 属性的设备事件。如果同时还指定了"=VALUE",那么表示不触发 ATTR 属性匹配 VALUE 的设备事件。 注意,可以在 VALUE 中使用shell风格的通配符。 如果多次使用此选项,那么表示以 AND 逻辑连接每个匹配规则, 即只有不匹配指定属性的设备才会被触发。 + + -b, --parent-match + 仅触发给定设备及其所有子设备的事件。PARENT_MATCH 是该设备在 /sys 目录下的路径。 如果多次使用此选项,那么仅以最后一个为准。 + + -c, --action + 指定触发哪种类型的设备事件,ACTION 可以是下列值之一: add, remove, change(默认值), move, online, offline, bind, unbind。 + + -g, --tag-match + 仅触发匹配 TAG_MATCH 标签的设备事件。如果多次使用此选项, 那么表示以 AND 逻辑连接每个匹配规则,即只有匹配所有指定标签的设备才会被触发。 + + -h, --help + 显示简短的帮助信息并退出。 + + -n, --dry-run + 并不真正触发设备事件。 + + --name-match + 仅触发/dev name匹配NAME_MATCH的设备事件。如果多次使用此选项,那么表示以 OR 逻辑连接每个匹配规则,即任意匹配/dev name的设备都会被触发。 + + -p, --property-match + 仅触发那些设备的 PROPERTY 属性值匹配 VALUE 的设备事件。注意,可以在 VALUE 中使用shell风格的通配符。 如果多次使用此选项,那么表示以 OR 逻辑连接每个匹配规则,即匹配任意一个属性值的设备都会被触发。 + + -s, --subsystem-match + 仅触发匹配 SUBSYSTEM 子系统的设备事件。 可以在 SUBSYSTEM 中使用shell风格的通配符。 如果多次使用此选项,那么表示以 OR 逻辑连接每个匹配规则, 即所有匹配的子系统中的设备都会被触发。 + + -S, --subsystem-nomatch + 不触发匹配 SUBSYSTEM 子系统的设备事件。 可以在 SUBSYSTEM 中使用shell风格的通配符。 如果多次使用此选项,那么表示以 AND 逻辑连接每个匹配规则, 即只有不匹配所有指定子系统中的设备才会被触发。 + + -t, --type + 仅触发特定类型的设备, TYPE 可以是下列值之一: + devices sysfs下的设备对象 (默认值) + subsystems sysfs下的总线或驱动对象 + all 所有类型 + + --uuid + 显示uevent事件的uuid。 + + -v, --verbose + 显示被触发的设备列表。 + + -w, --settle + 除了触发设备事件之外,还要等待这些事件完成。注意,此选项仅等待该命令自身触发的事件完成, 而 devctl settle 则要一直等到所有设备事件全部完成。 + + -y, --sysname-match + 仅触发设备/sys name(也就是该设备在 /sys 路径下最末端的文件名)匹配 SYSNAME_MATCH 的设备事件。注意,可以在 SYSNAME 中使用shell风格的通配符。 如果多次使用此选项,那么表示以 OR 逻辑连接每个匹配规则,即匹配任意一个sys名称的设备都会被触发。 +``` + +### devctl settle [OPTIONS] +监视devmaster事件队列,并且在所有事件全部处理完成之后退出。 + +```shell +OPTIONS: + -E, --exit-if-exists + 如果 FILE 文件存在,则停止等待。 + -h, --help + 显示简短的帮助信息并退出。 + -t, --timeout + 最多允许花多少秒等候事件队列清空。 默认值是120秒。设为 0 表示仅检查事件队列是否为空,并且立即返回。 +``` + + +### devctl test-builtin [OPTIONS] +测试内置命令在某个设备上的执行效果。 + +```shell +ARGS: + + builtin 子命令,目前支持的内置命令包括: + blkid 文件系统和分区探测 + hwdb 设备硬件数据库属性 + input_id input设备属性 + keyboard 更改键位设置,使能对应硬件的特殊键位。 + kmod 内核模块加载 + net_id 显示网络设备属性 + net_setup_link 配置网络链接 + path_id 显示设备的PATH_ID属性 + usb_id 显示USB设备属性 + + 设备 /sys 路径 + +OPTIONS: + -a, --action + 指定设备事件的动作类型,包括:add、change、remove、move、online、offline、bind 和 unbind + -h, --help + 显示简短的帮助信息并退出。 +``` + +参数: + +​ `` 目前支持的内置命令包括:`blkid`、`input_id`、`kmod`、`net_id`、`net_setup_link`、`path_id`、`usb_id` + +​ `` 设备的`sysfs`路径 + +选项: + +​ -a, --action `` 指定设备事件的动作类型,包括:`add`、`change`、`remove`、`move`、`online`、`offline`、`bind`和`unbind` + +​ -h, --help 显示帮助信息 + +### devctl control [OPTIONS] +控制devmaster守护进程的内部状态。 + +```shell +OPTIONS: + -e, --exit + 向 devmaster 发送"退出"信号并等待其退出。 + -h, --help + 显示简短的帮助信息并退出。 +``` + +### devctl hwdb [OPTIONS] +hwdb子命令已弃用,保留是为了向后兼容性。请使用sysmaster-hwdb替代devctl hwdb + +```shell +OPTIONS: + -h, --help + 显示简短的帮助信息并退出。 + --path + 自定义.hwdb文件的路径。 + -r, --root + 指定根文件系统的路径。 + -s, --strict + 在更新时,如果遇到任何解析错误,那么就返回非零退出码表示出错。 + -t, --test + 查询二进制格式的硬件数据库,并显示查询结果 + -u, --update + 更新二进制格式的硬件数据库。 + --usr + 输出到 /usr/lib/devmaster 目录中(而不是默认的 /etc/devmaster 目录)。 +``` diff --git a/docs/man/exts/hwdb/hwdb.md b/docs/man/exts/hwdb/hwdb.md new file mode 100644 index 00000000..285c7ba5 --- /dev/null +++ b/docs/man/exts/hwdb/hwdb.md @@ -0,0 +1,82 @@ +# hwdb 手册 + +## 1. 简介 +### 1.1 hwdb - 硬件数据库 + +硬件数据库是一个由 `modalias` 风格键和 `devmaster属性` 风格的值组成的 key-value 文本数据库。主要用于 `devmaster` 为匹配到的硬件设备添加关联属性,但也可以用于直接查询。 + +### 1.2 modalias介绍 +modalias是Linux系统中的一种文件,存储了用于描述设备的属性和标识符。它通常位于/sys目录下的设备路径中,例如`/sys/devices/LNXSYSTM\:00/modalias`。 + +## 2. hwdb文件 +### 2.1 hwdb文件读取路径 +hwdb文件位于操作系统发行商维护的 `/usr/lib/devmaster/hwdb.d` 目录中,以及系统管理员维护的 `/etc/devmaster/hwdb.d` 目录中。注意:文件必须以 `.hwdb` 作为后缀名,目录中其他扩展名的文件将被忽略。 + +### 2.2 hwdb文件规则 +每个hwdb文件都包含一系列由 `modalias字符串` 与关联的 `devmaster属性键值对` 组成的记录。每条记录都由一行或多行 `modalias字符串(可包含shell风格的通配符)` 开头,多个 `modalias字符串` 之间使用换行符分隔, 但必须是依次紧紧相连的行(也就是中间不能出现空行),每一行都必须是一个完整的`modalias字符串` (也就是不能将一个 `modalias字符串` 分为两行), 多行之间是逻辑或(OR)的关系。每一个 `modalias字符串` 都必须顶行书写(也就是行首不能是空白字符)。 + +`modalias字符串`可用的通配符: +- `"*"` :匹配任意数量的字符 +- `"?"` :匹配单个字符 +- `"[]"` :匹配括号中的任意一个字符,比如 `[ab]` 可以匹配单个 `a` 或 `b` ,`[0-9]` 匹配任意个位数字。如果中括号中的内容以 `!` 开头,则匹配不属于中括号中内容的单个字符,比如 `[!a]` 表示匹配任意一个非 `a` 字符。 + +`modalias字符串` 后面跟一行或多行以空格开头 `devmaster属性键值对`。`devmaster属性键值对` 的书写必须符合 `key=value` 格式。最后通过空行表示一条记录的结束。`"#"`开头的行将被视为注释而忽略。 + +如果查询的 `modalias字符串` 匹配到了多个记录,那么记录中的 `devmaster属性键值对` 都会被获取。如果匹配到 `devmaster属性键值对` 中的 `key` 出现了多次,那么仅以最高优先级记录中的 `value` 为准(每个 `key` 仅允许拥有一个单独的 `value`)。对于不同hwdb文件中的记录来说,文件名的字典顺序越靠后,优先级越高;对于同一个hwdb文件中的记录来说, 记录自身的位置越靠后,优先级越高。 + +## 3. hwdb.bin文件 +所有hwdb文件的数据都由 `sysmaster-hwdb` 读取并编译到 `/etc/devmaster/hwdb.bin` 或 `/usr/lib/devmaster/hwdb.bin` 中。在系统运行期间,仅会读取二进制格式的硬件数据库 `hwdb.bin` 而不会操作hwdb文件。 + +## 4. 示例 +### 4.1 示例1:hwdb文件的一般语法 +- /usr/lib/devmaster/hwdb.d/example.hwdb +``` +# Comments can be placed before any records. This is a good spot +# to describe what that file is used for, what kind of properties +# it defines, and the ordering convention. + +# A record with three matches and one property +mouse:*:name:*Trackball*:* +mouse:*:name:*trackball*:* +mouse:*:name:*TrackBall*:* + ID_INPUT_TRACKBALL=1 + +# The rule above could be also be written in a form that +# matches Tb, tb, TB, tB: +mouse:*:name:*[tT]rack[bB]all*:* + ID_INPUT_TRACKBALL=1 + +# A record with a single match and five properties +mouse:usb:v046dp4041:name:Logitech MX Master:* + MOUSE_DPI=1000@166 + MOUSE_WHEEL_CLICK_ANGLE=15 + MOUSE_WHEEL_CLICK_ANGLE_HORIZONTAL=26 + MOUSE_WHEEL_CLICK_COUNT=24 + MOUSE_WHEEL_CLICK_COUNT_HORIZONTAL=14 +``` +### 4.2 示例2:devmaster属性值的覆盖 +- /usr/lib/devmaster/hwdb.d/60-keyboard.hwdb +``` +evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer*:pn*:* + KEYBOARD_KEY_a1=help + KEYBOARD_KEY_a2=setup + KEYBOARD_KEY_a3=battery + +# Match vendor name "Acer" and any product name starting with "X123" +evdev:atkbd:dmi:bvn*:bvr*:bd*:svnAcer:pnX123*:* + KEYBOARD_KEY_a2=wlan +``` +- /etc/devmaster/hwdb.d/70-keyboard.hwdb +``` +# disable wlan key on all at keyboards +evdev:atkbd:* + KEYBOARD_KEY_a2=reserved + PROPERTY_WITH_SPACES=some string +``` +如果`hwdb.bin`仅由这两个文件组成,那么查找`modalias`值为`evdev:atkbd:dmi:bvn:bvr:bdXXXXX:bd08/05/2010:svnAcer:pnX123:`的键盘将匹配上述全部三条记录,并且最终获得如下"属性=值": +``` + KEYBOARD_KEY_a1=help + KEYBOARD_KEY_a2=reserved + KEYBOARD_KEY_a3=battery + PROPERTY_WITH_SPACES=some string +``` diff --git a/docs/man/exts/hwdb/sysmaster-hwdb.md b/docs/man/exts/hwdb/sysmaster-hwdb.md new file mode 100644 index 00000000..c65cfcec --- /dev/null +++ b/docs/man/exts/hwdb/sysmaster-hwdb.md @@ -0,0 +1,38 @@ +# sysmaster-hwdb 使用手册 + +## 1. 简介 +sysmaster-hwdb 是硬件数据库(hwdb)的管理工具,主要用于管理二进制格式的硬件数据库 hwdb.bin:生成二进制格式的硬件数据库、二进制格式的硬件数据库数据查询。 + +## 2. 大纲 +sysmaster-hwdb的命令主要分为以下两种: +``` +sysmaster-hwdb update [OPTIONS] +sysmaster-hwdb query [OPTIONS] +``` + +## 3. 选项 +### sysmaster-hwdb update [OPTIONS] +更新二进制格式的硬件数据库。 +``` +--usr + 输出到 /usr/lib/devmaster 目录中(而不是默认的 /etc/devmaster 目录)。 + +-r, --root=PATH + 指定根文件系统的路径。 + +-s, --strict + 在更新时,如果遇到任何解析错误,那么就返回非零退出码表示出错。 + +-h, --help + 显示简短的帮助信息并退出。 +``` + +### sysmaster-hwdb query [OPTIONS] +查询二进制格式的硬件数据库,并显示查询结果。 +``` +-r, --root=PATH + 指定根文件系统的路径。 + +-h, --help + 显示简短的帮助信息并退出。 +``` -- Gitee From 66d013cbbd75e156fa9e523b5bdf0646393b08a6 Mon Sep 17 00:00:00 2001 From: huyubiao Date: Tue, 12 Dec 2023 09:27:59 +0800 Subject: [PATCH 2/2] fix(devmaster): remove the devctl prefix from the file name delete useless parameters --- exts/devmaster/src/bin/devctl/main.rs | 29 ++++++------------- .../subcmds/{devctl_hwdb.rs => hwdb.rs} | 0 .../subcmds/{devctl_info.rs => info.rs} | 4 +-- exts/devmaster/src/bin/devctl/subcmds/mod.rs | 14 ++++----- .../subcmds/{devctl_monitor.rs => monitor.rs} | 3 -- .../subcmds/{devctl_settle.rs => settle.rs} | 10 ++----- ...devctl_test_builtin.rs => test_builtin.rs} | 0 .../subcmds/{devctl_trigger.rs => trigger.rs} | 2 +- .../subcmds/{devctl_utils.rs => utils.rs} | 9 ++++-- 9 files changed, 27 insertions(+), 44 deletions(-) rename exts/devmaster/src/bin/devctl/subcmds/{devctl_hwdb.rs => hwdb.rs} (100%) rename exts/devmaster/src/bin/devctl/subcmds/{devctl_info.rs => info.rs} (99%) rename exts/devmaster/src/bin/devctl/subcmds/{devctl_monitor.rs => monitor.rs} (99%) rename exts/devmaster/src/bin/devctl/subcmds/{devctl_settle.rs => settle.rs} (96%) rename exts/devmaster/src/bin/devctl/subcmds/{devctl_test_builtin.rs => test_builtin.rs} (100%) rename exts/devmaster/src/bin/devctl/subcmds/{devctl_trigger.rs => trigger.rs} (99%) rename exts/devmaster/src/bin/devctl/subcmds/{devctl_utils.rs => utils.rs} (88%) diff --git a/exts/devmaster/src/bin/devctl/main.rs b/exts/devmaster/src/bin/devctl/main.rs index 1b4c696e..a8a821f1 100644 --- a/exts/devmaster/src/bin/devctl/main.rs +++ b/exts/devmaster/src/bin/devctl/main.rs @@ -23,12 +23,12 @@ use libdevmaster::framework::control_manager::CONTROL_MANAGER_LISTEN_ADDR; use log::init_log_to_console_syslog; use log::Level; use std::{io::Write, os::unix::net::UnixStream}; -use subcmds::devctl_hwdb::HwdbArgs; -use subcmds::devctl_info::InfoArgs; -use subcmds::devctl_monitor::MonitorArgs; -use subcmds::devctl_settle::SettleArgs; -use subcmds::devctl_test_builtin::subcommand_test_builtin; -use subcmds::devctl_trigger::TriggerArgs; +use subcmds::hwdb::HwdbArgs; +use subcmds::info::InfoArgs; +use subcmds::monitor::MonitorArgs; +use subcmds::settle::SettleArgs; +use subcmds::test_builtin::subcommand_test_builtin; +use subcmds::trigger::TriggerArgs; use subcmds::Result; /// parse program arguments @@ -116,10 +116,6 @@ enum SubCmd { /// Filter events by tag #[clap(short('t'), long)] tag_match: Option>, - - /// other args - #[clap(required = false)] - _other: Vec, }, /// Kill all devmaster workers @@ -199,7 +195,7 @@ enum SubCmd { devices: Vec, }, - /// Kill all devmaster workers + /// Wait for pending devmaster events #[clap(display_order = 5)] Settle { /// Maximum time to wait for events @@ -209,10 +205,6 @@ enum SubCmd { /// Stop waiting if file exists #[clap(short('E'), long)] exit_if_exists: Option, - - /// other args - #[clap(required = false)] - _other: Vec, }, /// Test builtin command on a device @@ -251,7 +243,7 @@ enum SubCmd { #[clap(short, long)] root: Option, }, - /// + /// Control the devmaster daemon. #[clap(display_order = 7)] Control { #[clap(short, long)] @@ -316,7 +308,6 @@ fn main() -> Result<()> { userspace, subsystem_match, tag_match, - _other, } => { return MonitorArgs::new( property, @@ -325,7 +316,6 @@ fn main() -> Result<()> { userspace, subsystem_match, tag_match, - _other, ) .subcommand() } @@ -371,9 +361,8 @@ fn main() -> Result<()> { SubCmd::Settle { timeout, exit_if_exists, - _other, } => { - return SettleArgs::new(timeout, exit_if_exists, _other).subcommand(); + return SettleArgs::new(timeout, exit_if_exists).subcommand(); } SubCmd::TestBuiltin { action, diff --git a/exts/devmaster/src/bin/devctl/subcmds/devctl_hwdb.rs b/exts/devmaster/src/bin/devctl/subcmds/hwdb.rs similarity index 100% rename from exts/devmaster/src/bin/devctl/subcmds/devctl_hwdb.rs rename to exts/devmaster/src/bin/devctl/subcmds/hwdb.rs diff --git a/exts/devmaster/src/bin/devctl/subcmds/devctl_info.rs b/exts/devmaster/src/bin/devctl/subcmds/info.rs similarity index 99% rename from exts/devmaster/src/bin/devctl/subcmds/devctl_info.rs rename to exts/devmaster/src/bin/devctl/subcmds/info.rs index d220369a..0457dc08 100644 --- a/exts/devmaster/src/bin/devctl/subcmds/devctl_info.rs +++ b/exts/devmaster/src/bin/devctl/subcmds/info.rs @@ -12,7 +12,7 @@ //! subcommand for devctl info -use crate::subcmds::devctl_utils; +use crate::subcmds::utils; use crate::Result; use basic::fd_util::{dot_or_dot_dot, xopendirat}; use device::{device_enumerator::DeviceEnumerator, Device}; @@ -110,7 +110,7 @@ impl InfoArgs { let mut r: Result<()> = Ok(()); for dev in &self.devices { - let device = match devctl_utils::find_device(dev, "") { + let device = match utils::find_device(dev, "") { Ok(d) => d, Err(e) => { if e == nix::Error::EINVAL { diff --git a/exts/devmaster/src/bin/devctl/subcmds/mod.rs b/exts/devmaster/src/bin/devctl/subcmds/mod.rs index 25936c6d..688a49f7 100644 --- a/exts/devmaster/src/bin/devctl/subcmds/mod.rs +++ b/exts/devmaster/src/bin/devctl/subcmds/mod.rs @@ -13,12 +13,12 @@ //! the module of devctl subcommands //! -pub(crate) mod devctl_hwdb; -pub(crate) mod devctl_info; -pub(crate) mod devctl_monitor; -pub(crate) mod devctl_settle; -pub(crate) mod devctl_test_builtin; -pub(crate) mod devctl_trigger; -pub(self) mod devctl_utils; +pub(crate) mod hwdb; +pub(crate) mod info; +pub(crate) mod monitor; +pub(crate) mod settle; +pub(crate) mod test_builtin; +pub(crate) mod trigger; +pub(self) mod utils; pub(crate) type Result = std::result::Result; diff --git a/exts/devmaster/src/bin/devctl/subcmds/devctl_monitor.rs b/exts/devmaster/src/bin/devctl/subcmds/monitor.rs similarity index 99% rename from exts/devmaster/src/bin/devctl/subcmds/devctl_monitor.rs rename to exts/devmaster/src/bin/devctl/subcmds/monitor.rs index df6768ab..50f310a2 100644 --- a/exts/devmaster/src/bin/devctl/subcmds/devctl_monitor.rs +++ b/exts/devmaster/src/bin/devctl/subcmds/monitor.rs @@ -157,7 +157,6 @@ pub struct MonitorArgs { userspace: bool, subsystem_match: Option>, tag_match: Option>, - _other: Vec, } impl MonitorArgs { @@ -168,7 +167,6 @@ impl MonitorArgs { userspace: bool, subsystem_match: Option>, tag_match: Option>, - _other: Vec, ) -> Self { MonitorArgs { property, @@ -177,7 +175,6 @@ impl MonitorArgs { userspace, subsystem_match, tag_match, - _other, } } diff --git a/exts/devmaster/src/bin/devctl/subcmds/devctl_settle.rs b/exts/devmaster/src/bin/devctl/subcmds/settle.rs similarity index 96% rename from exts/devmaster/src/bin/devctl/subcmds/devctl_settle.rs rename to exts/devmaster/src/bin/devctl/subcmds/settle.rs index a276099d..7bbe69fc 100644 --- a/exts/devmaster/src/bin/devctl/subcmds/devctl_settle.rs +++ b/exts/devmaster/src/bin/devctl/subcmds/settle.rs @@ -13,7 +13,7 @@ //! subcommand for devctl settle //! -use crate::subcmds::devctl_utils::devmaster_queue_is_empty; +use crate::subcmds::utils::devmaster_queue_is_empty; use crate::Result; use basic::time_util::{parse_sec, USEC_INFINITY, USEC_PER_SEC}; use event::{EventState, EventType, Events, Source}; @@ -29,19 +29,13 @@ use std::rc::Rc; pub struct SettleArgs { timeout: Option, exit_if_exists: Option, - _other: Vec, } impl SettleArgs { - pub fn new( - timeout: Option, - exit_if_exists: Option, - _other: Vec, - ) -> Self { + pub fn new(timeout: Option, exit_if_exists: Option) -> Self { SettleArgs { timeout, exit_if_exists, - _other, } } diff --git a/exts/devmaster/src/bin/devctl/subcmds/devctl_test_builtin.rs b/exts/devmaster/src/bin/devctl/subcmds/test_builtin.rs similarity index 100% rename from exts/devmaster/src/bin/devctl/subcmds/devctl_test_builtin.rs rename to exts/devmaster/src/bin/devctl/subcmds/test_builtin.rs diff --git a/exts/devmaster/src/bin/devctl/subcmds/devctl_trigger.rs b/exts/devmaster/src/bin/devctl/subcmds/trigger.rs similarity index 99% rename from exts/devmaster/src/bin/devctl/subcmds/devctl_trigger.rs rename to exts/devmaster/src/bin/devctl/subcmds/trigger.rs index 93a57cb4..74a9e77e 100644 --- a/exts/devmaster/src/bin/devctl/subcmds/devctl_trigger.rs +++ b/exts/devmaster/src/bin/devctl/subcmds/trigger.rs @@ -13,7 +13,7 @@ //! subcommand for devctl trigger //! -use crate::subcmds::devctl_utils::find_device; +use crate::subcmds::utils::find_device; use crate::Result; use device::device_monitor::{DeviceMonitor, MonitorNetlinkGroup}; diff --git a/exts/devmaster/src/bin/devctl/subcmds/devctl_utils.rs b/exts/devmaster/src/bin/devctl/subcmds/utils.rs similarity index 88% rename from exts/devmaster/src/bin/devctl/subcmds/devctl_utils.rs rename to exts/devmaster/src/bin/devctl/subcmds/utils.rs index c6bef201..faab8c46 100644 --- a/exts/devmaster/src/bin/devctl/subcmds/devctl_utils.rs +++ b/exts/devmaster/src/bin/devctl/subcmds/utils.rs @@ -29,9 +29,12 @@ pub fn find_device(id: &str, prefix: &str) -> Result { let mut path = PathBuf::from(id); if !prefix.is_empty() && !id.starts_with(prefix) { - path = PathBuf::from(prefix.to_string() + "/" + id) - .canonicalize() - .unwrap(); + path = match PathBuf::from(prefix.to_string() + "/" + id).canonicalize() { + Ok(path) => path, + Err(err) => { + return Err(nix::errno::from_i32(err.raw_os_error().unwrap_or_default())); + } + }; if let Ok(device) = Device::from_path(path.to_str().unwrap()) { return Ok(device); } -- Gitee