summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@vrfy.org>2010-07-07 11:35:40 +0200
committerKay Sievers <kay.sievers@vrfy.org>2010-07-07 11:35:40 +0200
commit3b529da42586aa430bb0d03800b19dd45552eae1 (patch)
tree2f016fcf11afd4d170399e4cdb31f5ad8c58dfae
parent847b4f84c671e98f29f22d8e3e0d70a231d71a7b (diff)
allow final assignment for OPTIONS:="nowatch"
A final assignemnt operator will disable any device watching by inotify, and any possible later rules setting "watch" again will be ignored.
-rw-r--r--udev/udev-rules.c18
-rw-r--r--udev/udev.h3
-rw-r--r--udev/udev.xml6
3 files changed, 19 insertions, 8 deletions
diff --git a/udev/udev-rules.c b/udev/udev-rules.c
index 230916a92e..6d32e73017 100644
--- a/udev/udev-rules.c
+++ b/udev/udev-rules.c
@@ -1569,42 +1569,42 @@ static int add_rule(struct udev_rules *rules, char *line,
if (pos != NULL) {
int prio = atoi(&pos[strlen("link_priority=")]);
- rule_add_key(&rule_tmp, TK_A_DEVLINK_PRIO, 0, NULL, &prio);
+ rule_add_key(&rule_tmp, TK_A_DEVLINK_PRIO, op, NULL, &prio);
dbg(rules->udev, "link priority=%i\n", prio);
}
pos = strstr(value, "event_timeout=");
if (pos != NULL) {
int tout = atoi(&pos[strlen("event_timeout=")]);
- rule_add_key(&rule_tmp, TK_A_EVENT_TIMEOUT, 0, NULL, &tout);
+ rule_add_key(&rule_tmp, TK_A_EVENT_TIMEOUT, op, NULL, &tout);
dbg(rules->udev, "event timeout=%i\n", tout);
}
pos = strstr(value, "string_escape=");
if (pos != NULL) {
pos = &pos[strlen("string_escape=")];
if (strncmp(pos, "none", strlen("none")) == 0)
- rule_add_key(&rule_tmp, TK_A_STRING_ESCAPE_NONE, 0, NULL, NULL);
+ rule_add_key(&rule_tmp, TK_A_STRING_ESCAPE_NONE, op, NULL, NULL);
else if (strncmp(pos, "replace", strlen("replace")) == 0)
- rule_add_key(&rule_tmp, TK_A_STRING_ESCAPE_REPLACE, 0, NULL, NULL);
+ rule_add_key(&rule_tmp, TK_A_STRING_ESCAPE_REPLACE, op, NULL, NULL);
}
pos = strstr(value, "nowatch");
if (pos != NULL) {
const int off = 0;
- rule_add_key(&rule_tmp, TK_A_INOTIFY_WATCH, 0, NULL, &off);
+ rule_add_key(&rule_tmp, TK_A_INOTIFY_WATCH, op, NULL, &off);
dbg(rules->udev, "inotify watch of device disabled\n");
} else {
pos = strstr(value, "watch");
if (pos != NULL) {
const int on = 1;
- rule_add_key(&rule_tmp, TK_A_INOTIFY_WATCH, 0, NULL, &on);
+ rule_add_key(&rule_tmp, TK_A_INOTIFY_WATCH, op, NULL, &on);
dbg(rules->udev, "inotify watch of device requested\n");
}
}
pos = strstr(value, "static_node=");
if (pos != NULL) {
- rule_add_key(&rule_tmp, TK_A_STATIC_NODE, 0, &pos[strlen("static_node=")], NULL);
+ rule_add_key(&rule_tmp, TK_A_STATIC_NODE, op, &pos[strlen("static_node=")], NULL);
rule_tmp.rule.rule.has_static_node = true;
}
continue;
@@ -2400,6 +2400,10 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event
esc = ESCAPE_REPLACE;
break;
case TK_A_INOTIFY_WATCH:
+ if (event->inotify_watch_final)
+ break;
+ if (cur->key.op == OP_ASSIGN_FINAL)
+ event->inotify_watch_final = true;
event->inotify_watch = cur->key.watch;
break;
case TK_A_DEVLINK_PRIO:
diff --git a/udev/udev.h b/udev/udev.h
index 23b720a468..6833e60d61 100644
--- a/udev/udev.h
+++ b/udev/udev.h
@@ -44,13 +44,14 @@ struct udev_event {
gid_t gid;
struct udev_list_node run_list;
int exec_delay;
+ bool inotify_watch;
+ bool inotify_watch_final;
bool group_final;
bool owner_final;
bool mode_final;
bool name_final;
bool devlink_final;
bool run_final;
- bool inotify_watch;
};
struct udev_watch {
diff --git a/udev/udev.xml b/udev/udev.xml
index b971fadea6..20c394c28b 100644
--- a/udev/udev.xml
+++ b/udev/udev.xml
@@ -513,6 +513,12 @@
writing, a change uevent will be synthesised.</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>nowatch</option></term>
+ <listitem>
+ <para>Disable the watching of a device node with inotify.</para>
+ </listitem>
+ </varlistentry>
</variablelist>
</listitem>
</varlistentry>