linepos = line;
if (get_key(&linepos, &variable, &value) == 0) {
dbg("import '%s=%s'", variable, value);
- name_list_key_add(&udev->env_list, variable, value);
+
+ /* handle device, renamed by external tool, returning new path */
+ if (strcmp(variable, "DEVPATH") == 0) {
+ info("updating devpath from '%s' to '%s'", udev->dev->devpath, value);
+ sysfs_device_set_values(udev->dev, value, NULL, NULL);
+ } else
+ name_list_key_add(&udev->env_list, variable, value);
setenv(variable, value, 1);
}
}
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 */
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;
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) {
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, '|');
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;
}
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));
udev->ignore_remove = 1;
dbg("remove event should be ignored");
}
+ if (rule->link_priority != 0) {
+ udev->link_priority = rule->link_priority;
+ info("link_priority=%i", udev->link_priority);
+ }
/* apply all_partitions option only at a main block device */
if (rule->partitions &&
strcmp(udev->dev->subsystem, "block") == 0 && udev->dev->kernel_number[0] == '\0') {