From 95776dc6ec174f47fa4dd4d8abf5d457223e5dd4 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Sat, 19 Aug 2006 16:06:25 +0200 Subject: consistent key naming to match only the event device or include all parent devices This scheme is more consistent and makes it obvious if a match happens against the event device only, or the full chain of parent devices. The old key names are now: BUS -> SUBSYSTEMS ID -> KERNELS SYSFS -> ATTRS DRIVER -> DRIVERS Match keys for the event device: KERNEL SUBSYSTEM ATTR DRIVER (in a future release, for now the same as DRIVERS) Match keys for all devices along the parent device chain: KERNELS SUBSYSTEMS ATTRS DRIVERS ID, BUS, SYSFS are no longer mentioned in the man page but still work. DRIVER must be converted to DRIVERS to match the new scheme. For now, an error is logged, if DRIVER is used. In a future release, the DRIVER key behaviour will change. --- udev_rules_parse.c | 131 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 82 insertions(+), 49 deletions(-) (limited to 'udev_rules_parse.c') diff --git a/udev_rules_parse.c b/udev_rules_parse.c index 8d69e74864..5e93e60d4f 100644 --- a/udev_rules_parse.c +++ b/udev_rules_parse.c @@ -263,14 +263,24 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena if (retval) break; - if (strcasecmp(key, "LABEL") == 0) { - add_rule_key(rule, &rule->label, operation, value); + if (strcasecmp(key, "ACTION") == 0) { + if (operation != KEY_OP_MATCH && + operation != KEY_OP_NOMATCH) { + err("invalid ACTION operation"); + goto invalid; + } + add_rule_key(rule, &rule->action, operation, value); valid = 1; continue; } - if (strcasecmp(key, "GOTO") == 0) { - add_rule_key(rule, &rule->goto_label, operation, value); + if (strcasecmp(key, "DEVPATH") == 0) { + if (operation != KEY_OP_MATCH && + operation != KEY_OP_NOMATCH) { + err("invalid DEVPATH operation"); + goto invalid; + } + add_rule_key(rule, &rule->devpath, operation, value); valid = 1; continue; } @@ -281,7 +291,7 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena err("invalid KERNEL operation"); goto invalid; } - add_rule_key(rule, &rule->kernel_name, operation, value); + add_rule_key(rule, &rule->kernel, operation, value); valid = 1; continue; } @@ -297,68 +307,84 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena continue; } - if (strcasecmp(key, "ACTION") == 0) { + if (strcasecmp(key, "DRIVER") == 0) { if (operation != KEY_OP_MATCH && operation != KEY_OP_NOMATCH) { - err("invalid ACTION operation"); + err("invalid DRIVER operation"); goto invalid; } - add_rule_key(rule, &rule->action, operation, value); + err("DRIVER== will change in a future relase, " + "please use DRIVERS== in %s:%u", filename, lineno); + /* FIXME: this should be rule->driver to match only the event device */ + add_rule_key(rule, &rule->drivers, operation, value); valid = 1; continue; } - if (strcasecmp(key, "DEVPATH") == 0) { + if (strncasecmp(key, "ATTR", sizeof("ATTR")-1) == 0) { if (operation != KEY_OP_MATCH && operation != KEY_OP_NOMATCH) { - err("invalid DEVPATH operation"); + err("invalid ATTR operation"); goto invalid; } - add_rule_key(rule, &rule->devpath, operation, value); + attr = get_key_attribute(key + sizeof("ATTR")-1); + if (attr == NULL) { + err("error parsing ATTR attribute in '%s'", line); + continue; + } + add_rule_key_pair(rule, &rule->attr, operation, attr, value); valid = 1; continue; } - if (strcasecmp(key, "BUS") == 0) { + if (strcasecmp(key, "KERNELS") == 0 || + strcasecmp(key, "ID") == 0) { if (operation != KEY_OP_MATCH && operation != KEY_OP_NOMATCH) { - err("invalid BUS operation"); + err("invalid KERNELS operation"); goto invalid; } - add_rule_key(rule, &rule->bus, operation, value); + add_rule_key(rule, &rule->kernels, operation, value); valid = 1; continue; } - if (strcasecmp(key, "ID") == 0) { + if (strcasecmp(key, "SUBSYTEMS") == 0 || + strcasecmp(key, "BUS") == 0) { if (operation != KEY_OP_MATCH && operation != KEY_OP_NOMATCH) { - err("invalid ID operation"); + err("invalid SUBSYSTEMS operation"); goto invalid; } - add_rule_key(rule, &rule->id, operation, value); + add_rule_key(rule, &rule->subsystems, operation, value); valid = 1; continue; } - if (strncasecmp(key, "SYSFS", sizeof("SYSFS")-1) == 0) { + if (strcasecmp(key, "DRIVERS") == 0) { if (operation != KEY_OP_MATCH && operation != KEY_OP_NOMATCH) { - err("invalid SYSFS operation"); + err("invalid DRIVERS operation"); goto invalid; } - attr = get_key_attribute(key + sizeof("SYSFS")-1); - if (attr == NULL) { - err("error parsing SYSFS attribute in '%s'", line); - continue; - } - add_rule_key_pair(rule, &rule->sysfs, operation, attr, value); + add_rule_key(rule, &rule->drivers, operation, value); valid = 1; continue; } - if (strcasecmp(key, "WAIT_FOR_SYSFS") == 0) { - add_rule_key(rule, &rule->wait_for_sysfs, operation, value); + if (strncasecmp(key, "ATTRS", sizeof("ATTRS")-1) == 0 || + strncasecmp(key, "SYSFS", sizeof("SYSFS")-1) == 0) { + if (operation != KEY_OP_MATCH && + operation != KEY_OP_NOMATCH) { + err("invalid ATTRSS operation"); + goto invalid; + } + attr = get_key_attribute(key + sizeof("ATTRS")-1); + if (attr == NULL) { + err("error parsing ATTRS attribute in '%s'", line); + continue; + } + add_rule_key_pair(rule, &rule->attrs, operation, attr, value); valid = 1; continue; } @@ -374,6 +400,23 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena continue; } + if (strcasecmp(key, "PROGRAM") == 0) { + add_rule_key(rule, &rule->program, operation, value); + valid = 1; + continue; + } + + if (strcasecmp(key, "RESULT") == 0) { + if (operation != KEY_OP_MATCH && + operation != KEY_OP_NOMATCH) { + err("invalid RESULT operation"); + goto invalid; + } + add_rule_key(rule, &rule->result, operation, value); + valid = 1; + continue; + } + if (strncasecmp(key, "IMPORT", sizeof("IMPORT")-1) == 0) { attr = get_key_attribute(key + sizeof("IMPORT")-1); if (attr && strstr(attr, "program")) { @@ -419,30 +462,26 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena continue; } - if (strcasecmp(key, "DRIVER") == 0) { - if (operation != KEY_OP_MATCH && - operation != KEY_OP_NOMATCH) { - err("invalid DRIVER operation"); - goto invalid; - } - add_rule_key(rule, &rule->driver, operation, value); + if (strcasecmp(key, "RUN") == 0) { + add_rule_key(rule, &rule->run, operation, value); valid = 1; continue; } - if (strcasecmp(key, "RESULT") == 0) { - if (operation != KEY_OP_MATCH && - operation != KEY_OP_NOMATCH) { - err("invalid RESULT operation"); - goto invalid; - } - add_rule_key(rule, &rule->result, operation, value); + if (strcasecmp(key, "WAIT_FOR_SYSFS") == 0) { + add_rule_key(rule, &rule->wait_for_sysfs, operation, value); valid = 1; continue; } - if (strcasecmp(key, "PROGRAM") == 0) { - add_rule_key(rule, &rule->program, operation, value); + if (strcasecmp(key, "LABEL") == 0) { + add_rule_key(rule, &rule->label, operation, value); + valid = 1; + continue; + } + + if (strcasecmp(key, "GOTO") == 0) { + add_rule_key(rule, &rule->goto_label, operation, value); valid = 1; continue; } @@ -516,12 +555,6 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena continue; } - if (strcasecmp(key, "RUN") == 0) { - add_rule_key(rule, &rule->run, operation, value); - valid = 1; - continue; - } - if (strcasecmp(key, "OPTIONS") == 0) { if (strstr(value, "last_rule") != NULL) { dbg("last rule to be applied"); -- cgit v1.2.3-54-g00ecf