if ((stats.st_mode & S_IFMT) == S_IFLNK) {
char target[UTIL_PATH_SIZE];
int target_len;
+ char *next;
target_len = readlink(filename, target, sizeof(target));
if (target_len > 0)
info(udev_device->udev, "error reading db link %s: %m\n", filename);
return -1;
}
+
+ next = strchr(target, ' ');
+ if (next != NULL) {
+ next[0] = '\0';
+ next = &next[1];
+ }
if (asprintf(&udev_device->devnode, "%s/%s", udev_get_dev_path(udev_device->udev), target) < 0)
return -ENOMEM;
+ while (next != NULL) {
+ char linkname[UTIL_PATH_SIZE];
+ const char *lnk;
+
+ lnk = next;
+ next = strchr(next, ' ');
+ if (next != NULL) {
+ next[0] = '\0';
+ next = &next[1];
+ }
+ util_strlcpy(linkname, udev_get_dev_path(udev_device->udev), sizeof(linkname));
+ util_strlcat(linkname, "/", sizeof(linkname));
+ util_strlcat(linkname, lnk, sizeof(linkname));
+ device_add_devlink(udev_device, linkname);
+ }
info(udev_device->udev, "device %p filled with db symlink data '%s'\n", udev_device, udev_device->devnode);
return 0;
}
return udev_device->parent_device;
}
+struct udev_device *udev_device_get_parent_with_subsystem(struct udev_device *udev_device, const char *subsystem)
+{
+ struct udev_device *parent;
+
+ parent = udev_device_get_parent(udev_device);
+ while (parent != NULL) {
+ const char *parent_subsystem;
+
+ parent_subsystem = udev_device_get_subsystem(parent);
+ if (parent_subsystem != NULL && strcmp(parent_subsystem, subsystem) == 0)
+ break;
+ parent = udev_device_get_parent(parent);
+ }
+ return parent;
+}
+
/**
* udev_device_get_udev:
* @udev_device: udev device