chiark / gitweb /
udevinfo, udevtest: simplify '/sys' stripping from devpath argument
[elogind.git] / udev_rules_parse.c
index 442ec65390cef3d71d1bf2247a0644c00f501808..8d69e74864310e5f584f2d490402b914aeb92dd2 100644 (file)
@@ -342,6 +342,11 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
                }
 
                if (strncasecmp(key, "SYSFS", sizeof("SYSFS")-1) == 0) {
+                       if (operation != KEY_OP_MATCH &&
+                           operation != KEY_OP_NOMATCH) {
+                               err("invalid SYSFS operation");
+                               goto invalid;
+                       }
                        attr = get_key_attribute(key + sizeof("SYSFS")-1);
                        if (attr == NULL) {
                                err("error parsing SYSFS attribute in '%s'", line);
@@ -369,12 +374,6 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
                        continue;
                }
 
-               if (strcasecmp(key, "MODALIAS") == 0) {
-                       add_rule_key(rule, &rule->modalias, 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")) {
@@ -421,12 +420,22 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
                }
 
                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);
                        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;
@@ -534,7 +543,7 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena
                        continue;
                }
 
-               err("unknown key '%s'", key);
+               err("unknown key '%s' in %s:%u", key, filename, lineno);
        }
 
        /* skip line if not any valid key was found */
@@ -594,11 +603,6 @@ static int parse_file(struct udev_rules *rules, const char *filename)
                cur += count+1;
                lineno++;
 
-               if (count >= sizeof(line)) {
-                       err("line too long, rule skipped '%s:%u'", filename, lineno);
-                       continue;
-               }
-
                /* eat the whitespace */
                while ((count > 0) && isspace(bufline[0])) {
                        bufline++;
@@ -611,7 +615,12 @@ static int parse_file(struct udev_rules *rules, const char *filename)
                if (bufline[0] == COMMENT_CHARACTER)
                        continue;
 
-               /* skip backslash and newline from multi line rules */
+               if (count >= sizeof(line)) {
+                       err("line too long, rule skipped '%s:%u'", filename, lineno);
+                       continue;
+               }
+
+               /* skip backslash and newline from multiline rules */
                for (i = j = 0; i < count; i++) {
                        if (bufline[i] == '\\' && bufline[i+1] == '\n')
                                continue;