From 7df0ed83c113e4744786e7804d398d9d34b43281 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Wed, 25 May 2011 21:08:52 +0200 Subject: [PATCH] rules: implement TAGS== match --- NEWS | 8 ++++++++ TODO | 5 ----- udev/udev-rules.c | 26 ++++++++++++++++++++++++-- udev/udev.xml | 7 +++++++ 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index 0dc85ecb..c9ac6188 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,11 @@ +udev 171 +======== +!!! revert: "systemd: trigger - run after udev.service (for now)" + +The systemd service files require systemd version 28. The systemd +socket activation make it possible now to start 'udevd' and 'udevadm +trigger' in parallel. + udev 170 ======== Fix bug in control message handling, which can lead to a failing diff --git a/TODO b/TODO index 43e2b98e..ab7a5e85 100644 --- a/TODO +++ b/TODO @@ -1,8 +1,3 @@ - - add TAGS=="foo" match - - - revert: "systemd: trigger - run after udev.service (for now)" - after systemd has a new release we can depend on - - delete mobile-action-modeswitch (moved to usb_modeswitch) diff --git a/udev/udev-rules.c b/udev/udev-rules.c index c24da0c4..a77e1e22 100644 --- a/udev/udev-rules.c +++ b/udev/udev-rules.c @@ -136,6 +136,7 @@ enum token_type { TK_M_SUBSYSTEMS, /* val */ TK_M_DRIVERS, /* val */ TK_M_ATTRS, /* val, attr */ + TK_M_TAGS, /* val */ TK_M_PARENTS_MAX, TK_M_TEST, /* val, mode_t */ @@ -271,6 +272,7 @@ static const char *token_str(enum token_type type) [TK_M_SUBSYSTEMS] = "M SUBSYSTEMS", [TK_M_DRIVERS] = "M DRIVERS", [TK_M_ATTRS] = "M ATTRS", + [TK_M_TAGS] = "M TAGS", [TK_M_PARENTS_MAX] = "M PARENTS_MAX", [TK_M_TEST] = "M TEST", @@ -342,6 +344,7 @@ static void dump_token(struct udev_rules *rules, struct token *token) case TK_M_KERNELS: case TK_M_SUBSYSTEMS: case TK_M_DRIVERS: + case TK_M_TAGS: case TK_M_PROGRAM: case TK_M_IMPORT_FILE: case TK_M_IMPORT_PROG: @@ -1013,6 +1016,7 @@ static int rule_add_key(struct rule_tmp *rule_tmp, enum token_type type, case TK_M_KERNELS: case TK_M_SUBSYSTEMS: case TK_M_DRIVERS: + case TK_M_TAGS: case TK_M_PROGRAM: case TK_M_IMPORT_FILE: case TK_M_IMPORT_PROG: @@ -1342,6 +1346,15 @@ static int add_rule(struct udev_rules *rules, char *line, continue; } + if (strcmp(key, "TAGS") == 0) { + if (op > OP_MATCH_MAX) { + err(rules->udev, "invalid TAGS operation\n"); + goto invalid; + } + rule_add_key(&rule_tmp, TK_M_TAGS, op, value, NULL); + continue; + } + if (strncmp(key, "SYSFS{", sizeof("SYSFS{")-1) == 0) { if (!sysfs_warn) { sysfs_warn = true; @@ -2165,7 +2178,8 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event case TK_M_KERNELS: case TK_M_SUBSYSTEMS: case TK_M_DRIVERS: - case TK_M_ATTRS: { + case TK_M_ATTRS: + case TK_M_TAGS: { struct token *next; /* get whole sequence of parent matches */ @@ -2199,13 +2213,21 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event if (match_attr(rules, event->dev_parent, event, key) != 0) goto try_parent; break; + case TK_M_TAGS: { + bool match = udev_device_has_tag(event->dev_parent, &rules->buf[cur->key.value_off]); + + if (match && key->key.op == OP_NOMATCH) + goto try_parent; + if (!match && key->key.op == OP_MATCH) + goto try_parent; + break; + } default: goto nomatch; } dbg(event->udev, "parent key matched\n"); } dbg(event->udev, "all parent keys matched\n"); - /* all keys matched */ break; try_parent: diff --git a/udev/udev.xml b/udev/udev.xml index 8a4212fd..abbfee7a 100644 --- a/udev/udev.xml +++ b/udev/udev.xml @@ -233,6 +233,13 @@ + + + + Search the devpath upwards for a device with matching tag. + + + -- 2.39.5