From 3b529da42586aa430bb0d03800b19dd45552eae1 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Wed, 7 Jul 2010 11:35:40 +0200 Subject: [PATCH] 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. --- udev/udev-rules.c | 18 +++++++++++------- udev/udev.h | 3 ++- udev/udev.xml | 6 ++++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/udev/udev-rules.c b/udev/udev-rules.c index 230916a92..6d32e7301 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 23b720a46..6833e60d6 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 b971fadea..20c394c28 100644 --- a/udev/udev.xml +++ b/udev/udev.xml @@ -513,6 +513,12 @@ writing, a change uevent will be synthesised. + + + + Disable the watching of a device node with inotify. + + -- 2.30.2