summaryrefslogtreecommitdiff
path: root/udev_rules_parse.c
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@suse.de>2006-08-19 16:06:25 +0200
committerKay Sievers <kay.sievers@suse.de>2006-08-19 16:06:25 +0200
commit95776dc6ec174f47fa4dd4d8abf5d457223e5dd4 (patch)
treeff9f2e24f8333d460509c7fb987ce2ecb37605e1 /udev_rules_parse.c
parenteef7c9a385575375a3e3310900022b37777aeb6c (diff)
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.
Diffstat (limited to 'udev_rules_parse.c')
-rw-r--r--udev_rules_parse.c131
1 files changed, 82 insertions, 49 deletions
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");