diff --git a/man/udevadm.xml b/man/udevadm.xml
index 4e1255bf4d..5636d102b7 100644
--- a/man/udevadm.xml
+++ b/man/udevadm.xml
@@ -769,6 +769,16 @@
+
+
+
+ Revert settings previously set with udevadm control command. When
+ specified, settings set with , ,
+ , and will be cleared.
+
+
+
+
diff --git a/shell-completion/bash/udevadm b/shell-completion/bash/udevadm
index d3c07e81dd..ee463902b5 100644
--- a/shell-completion/bash/udevadm
+++ b/shell-completion/bash/udevadm
@@ -93,7 +93,7 @@ _udevadm() {
-g --tag-match -y --sysname-match --name-match -b --parent-match
--prioritized-subsystem'
[SETTLE]='-t --timeout -E --exit-if-exists'
- [CONTROL_STANDALONE]='-e --exit -s --stop-exec-queue -S --start-exec-queue -R --reload --ping
+ [CONTROL_STANDALONE]='-e --exit -s --stop-exec-queue -S --start-exec-queue -R --reload --ping --revert
--load-credentials'
[CONTROL_ARG]='-l --log-priority -p --property -m --children-max -t --timeout --trace'
[MONITOR_STANDALONE]='-k --kernel -u --udev -p --property'
diff --git a/shell-completion/zsh/_udevadm b/shell-completion/zsh/_udevadm
index d5cda3977e..0f4b8aff2c 100644
--- a/shell-completion/zsh/_udevadm
+++ b/shell-completion/zsh/_udevadm
@@ -67,6 +67,7 @@ _udevadm_control(){
'(-p --property)'{-p,--property=}'[Set a global property for all events.]:KEY=VALUE' \
'(-m --children-max=)'{-m,--children-max=}'[Set the maximum number of events.]:N' \
'--trace=[Enable/disable trace logging.]:BOOL' \
+ '--revert[Revert previously set configurations.]' \
'(-t --timeout=)'{-t,--timeout=}'[The maximum number of seconds to wait for a reply from systemd-udevd.]:SECONDS'
}
diff --git a/src/udev/udevadm-control.c b/src/udev/udevadm-control.c
index 1fa5a42018..f9cc4c34cf 100644
--- a/src/udev/udevadm-control.c
+++ b/src/udev/udevadm-control.c
@@ -32,6 +32,7 @@ static int arg_max_children = -1;
static int arg_log_level = -1;
static int arg_start_exec_queue = -1;
static int arg_trace = -1;
+static bool arg_revert = false;
static bool arg_load_credentials = false;
STATIC_DESTRUCTOR_REGISTER(arg_env, strv_freep);
@@ -45,7 +46,8 @@ static bool arg_has_control_commands(void) {
!strv_isempty(arg_env) ||
arg_max_children >= 0 ||
arg_ping ||
- arg_trace >= 0;
+ arg_trace >= 0 ||
+ arg_revert;
}
static int help(void) {
@@ -62,6 +64,7 @@ static int help(void) {
" -m --children-max=N Maximum number of children\n"
" --ping Wait for udev to respond to a ping message\n"
" --trace=BOOL Enable/disable trace logging\n"
+ " --revert Revert previously set configurations\n"
" -t --timeout=SECONDS Maximum time to block for a reply\n"
" --load-credentials Load udev rules from credentials\n",
program_invocation_short_name);
@@ -73,6 +76,7 @@ static int parse_argv(int argc, char *argv[]) {
enum {
ARG_PING = 0x100,
ARG_TRACE,
+ ARG_REVERT,
ARG_LOAD_CREDENTIALS,
};
@@ -89,6 +93,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "children-max", required_argument, NULL, 'm' },
{ "ping", no_argument, NULL, ARG_PING },
{ "trace", required_argument, NULL, ARG_TRACE },
+ { "revert", no_argument, NULL, ARG_REVERT },
{ "timeout", required_argument, NULL, 't' },
{ "load-credentials", no_argument, NULL, ARG_LOAD_CREDENTIALS },
{ "version", no_argument, NULL, 'V' },
@@ -157,6 +162,10 @@ static int parse_argv(int argc, char *argv[]) {
arg_trace = r;
break;
+ case ARG_REVERT:
+ arg_revert = true;
+ break;
+
case 't':
r = parse_sec(optarg, &arg_timeout);
if (r < 0)
@@ -270,6 +279,12 @@ static int send_control_commands(void) {
if (arg_exit)
return varlink_call_and_log(link, "io.systemd.Udev.Exit", /* parameters = */ NULL, /* reply = */ NULL);
+ if (arg_revert) {
+ r = varlink_call_and_log(link, "io.systemd.Udev.Revert", /* parameters = */ NULL, /* reply = */ NULL);
+ if (r < 0)
+ return r;
+ }
+
if (arg_log_level >= 0) {
r = varlink_callbo_and_log(link, "io.systemd.service.SetLogLevel", /* reply = */ NULL,
SD_JSON_BUILD_PAIR_INTEGER("level", arg_log_level));