1
0
mirror of https://github.com/systemd/systemd.git synced 2025-01-11 09:18:07 +03:00

rules: implement TAGS== match

This commit is contained in:
Kay Sievers 2011-05-25 21:08:52 +02:00
parent 38932b9fba
commit 7df0ed83c1
4 changed files with 39 additions and 7 deletions

8
NEWS
View File

@ -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

5
TODO
View File

@ -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)

View File

@ -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:

View File

@ -233,6 +233,13 @@
</listitem>
</varlistentry>
<varlistentry>
<term><option>TAGS</option></term>
<listitem>
<para>Search the devpath upwards for a device with matching tag.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>ENV{<replaceable>key</replaceable>}</option></term>
<listitem>