X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev_rules.c;h=6bd28ad4b7981a5ee136d38c6a80cd666b416fa6;hb=8127859217bcc4db6f42f8d549f157df93a44557;hp=c0f4cd2077b1f643898eeb7e9e9a97cda5982413;hpb=2dbb47f8606d18b14e981fb5cf245e8aaaad2de1;p=elogind.git diff --git a/udev_rules.c b/udev_rules.c index c0f4cd207..6bd28ad4b 100644 --- a/udev_rules.c +++ b/udev_rules.c @@ -236,7 +236,7 @@ static int import_parent_into_env(struct udevice *udev, const char *filter) struct name_entry *name_loop; dbg("found parent '%s', get the node name", dev_parent->devpath); - udev_parent = udev_device_init(); + udev_parent = udev_device_init(NULL); if (udev_parent == NULL) return -1; /* import the udev_db of the parent */ @@ -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; @@ -518,7 +518,7 @@ found: struct udevice *udev_parent; dbg("found parent '%s', get the node name", dev_parent->devpath); - udev_parent = udev_device_init(); + udev_parent = udev_device_init(NULL); if (udev_parent != NULL) { /* lookup the name in the udev_db with the DEVPATH of the parent */ if (udev_db_get_device(udev_parent, dev_parent->devpath) == 0) { @@ -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)); @@ -909,7 +914,7 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev) udev->ignore_remove = 1; dbg("remove event should be ignored"); } - if (rule->link_priority) { + if (rule->link_priority != 0) { udev->link_priority = rule->link_priority; info("link_priority=%i", udev->link_priority); }