err("invalid SUBSYSTEM operation");
goto invalid;
}
- add_rule_key(rule, &rule->subsystem, operation, value);
+ /* bus, class, subsystem events should all be the same */
+ if (strcmp(value, "subsystem") == 0 ||
+ strcmp(value, "bus") == 0 ||
+ strcmp(value, "class") == 0) {
+ if (strcmp(value, "bus") == 0 || strcmp(value, "class") == 0)
+ err("'%s' must be specified as 'subsystem' "
+ "please fix it in %s:%u", value, filename, lineno);
+ add_rule_key(rule, &rule->subsystem, operation, "subsystem|class|bus");
+ } else
+ add_rule_key(rule, &rule->subsystem, operation, value);
valid = 1;
continue;
}
if (strncmp(attr, "device/", 7) == 0)
err("the 'device' link is deprecated and will be removed from a future kernel, "
"please fix it in %s:%u", filename, lineno);
- else if (strchr(attr, '/') != NULL)
+ else if (strstr(attr, "../") != NULL)
err("do not reference parent sysfs directories directly, that may break with a future kernel, "
"please fix it in %s:%u", filename, lineno);
if (add_rule_key_pair(rule, &rule->attrs, operation, attr, value) != 0)
continue;
}
+ if (strncasecmp(key, "TEST", sizeof("TEST")-1) == 0) {
+ attr = get_key_attribute(key + sizeof("TEST")-1);
+ if (attr != NULL)
+ rule->test_mode_mask = strtol(attr, NULL, 8);
+ add_rule_key(rule, &rule->test, operation, value);
+ valid = 1;
+ continue;
+ }
+
if (strcasecmp(key, "RUN") == 0) {
add_rule_key(rule, &rule->run, operation, value);
valid = 1;