diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2010-07-07 11:35:40 +0200 |
---|---|---|
committer | Kay Sievers <kay.sievers@vrfy.org> | 2010-07-07 11:35:40 +0200 |
commit | 3b529da42586aa430bb0d03800b19dd45552eae1 (patch) | |
tree | 2f016fcf11afd4d170399e4cdb31f5ad8c58dfae | |
parent | 847b4f84c671e98f29f22d8e3e0d70a231d71a7b (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.c | 18 | ||||
-rw-r--r-- | udev/udev.h | 3 | ||||
-rw-r--r-- | udev/udev.xml | 6 |
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> |