chiark / gitweb /
make ACTION!="add|change" working
[elogind.git] / udev_rules.c
index ea02b8e9455763ae9346dfc96a2661ecc2f44b97..d77d5ec19691c4c664c2cb1ddb3314352f76a67c 100644 (file)
@@ -289,7 +289,7 @@ static int wait_for_sysfs(struct udevice *udev, const char *file, int timeout)
                        info("file '%s' appeared after %i loops", filepath, (timeout * WAIT_LOOP_PER_SECOND) - loop-1);
                        return 0;
                }
-               /* make sure the device does not have disappeared in the meantime */
+               /* make sure, the device did not disappear in the meantime */
                if (stat(devicepath, &stats) != 0) {
                        info("device disappeared while waiting for '%s'", filepath);
                        return -2;
@@ -584,18 +584,18 @@ static char *key_pair_name(struct udev_rule *rule, struct key_pair *pair)
 
 static int match_key(const char *key_name, struct udev_rule *rule, struct key *key, const char *val)
 {
-       int match;
        char value[PATH_SIZE];
        char *key_value;
        char *pos;
+       int match = 0;
 
        if (key->operation != KEY_OP_MATCH &&
            key->operation != KEY_OP_NOMATCH)
                return 0;
 
+       /* look for a matching string, parts are separated by '|' */
        strlcpy(value, rule->buf + key->val_off, sizeof(value));
        key_value = value;
-
        dbg("key %s value='%s'", key_name, key_value);
        while (key_value) {
                pos = strchr(key_value, '|');
@@ -603,19 +603,23 @@ static int match_key(const char *key_name, struct udev_rule *rule, struct key *k
                        pos[0] = '\0';
                        pos++;
                }
+
                dbg("match %s '%s' <-> '%s'", key_name, key_value, val);
                match = (fnmatch(key_value, val, 0) == 0);
-               if (match && (key->operation != KEY_OP_NOMATCH)) {
-                       dbg("%s is true (matching value)", key_name);
-                       return 0;
-               }
-               if (!match && (key->operation == KEY_OP_NOMATCH)) {
-                       dbg("%s is true (non-matching value)", key_name);
-                       return 0;
-               }
+               if (match)
+                       break;
+
                key_value = pos;
        }
-       dbg("%s is false", key_name);
+
+       if (match && (key->operation == KEY_OP_MATCH)) {
+               dbg("%s is true (matching value)", key_name);
+               return 0;
+       }
+       if (!match && (key->operation == KEY_OP_NOMATCH)) {
+               dbg("%s is true (non-matching value)", key_name);
+               return 0;
+       }
        return -1;
 }
 
@@ -861,8 +865,9 @@ try_parent:
                        info("writing '%s' to sysfs file '%s'", value, attr);
                        f = fopen(attr, "w");
                        if (f != NULL) {
-                               if (fprintf(f, "%s", value) <= 0)
-                                       err("error writing ATTR{%s}: %s", attr, strerror(errno));
+                               if (!udev->test_run)
+                                       if (fprintf(f, "%s", value) <= 0)
+                                               err("error writing ATTR{%s}: %s", attr, strerror(errno));
                                fclose(f);
                        } else
                                err("error opening ATTR{%s} for writing: %s", attr, strerror(errno));