return util_path_encode(&filename[start], len - start);
}
-static int device_read_db(struct udev_device *udev_device)
+int udev_device_read_db(struct udev_device *udev_device)
{
struct stat stats;
char filename[UTIL_PATH_SIZE];
return 0;
}
-void udev_device_load_info(struct udev_device *device)
+static void device_load_info(struct udev_device *device)
{
device->info_loaded = 1;
udev_device_read_uevent_file(device);
- device_read_db(device);
+ udev_device_read_db(device);
}
void udev_device_set_info_loaded(struct udev_device *device)
strncmp(udev_device->devpath, "/block/", 7) == 0) {
util_strlcpy(path, udev_device->syspath, sizeof(path));
util_strlcat(path, "/device", sizeof(path));
- if (util_resolve_sys_link(udev_device->udev, path, sizeof(path)) == 0)
+ if (util_resolve_sys_link(udev_device->udev, path, sizeof(path)) == 0) {
udev_device_parent = udev_device_new_from_syspath(udev_device->udev, path);
- return udev_device_parent;
+ if (udev_device_parent != NULL)
+ return udev_device_parent;
+ }
}
util_strlcpy(path, udev_device->syspath, sizeof(path));
if (udev_device == NULL)
return NULL;
if (!udev_device->info_loaded)
- udev_device_load_info(udev_device);
+ device_load_info(udev_device);
return udev_device->devnode;
}
if (udev_device == NULL)
return NULL;
if (!udev_device->info_loaded)
- udev_device_load_info(udev_device);
+ device_load_info(udev_device);
return udev_list_get_entry(&udev_device->devlinks_list);
}
if (udev_device == NULL)
return NULL;
if (!udev_device->info_loaded)
- udev_device_load_info(udev_device);
+ device_load_info(udev_device);
if (!udev_device->devlinks_uptodate) {
char symlinks[UTIL_PATH_SIZE];
struct udev_list_entry *list_entry;
if (udev_device == NULL)
return makedev(0, 0);
if (!udev_device->info_loaded)
- udev_device_load_info(udev_device);
+ device_load_info(udev_device);
return udev_device->devnum;
}
}
if (S_ISLNK(statbuf.st_mode)) {
- /* links return the last element of the target path */
char target[UTIL_NAME_SIZE];
int len;
char *pos;
+ /* some core links return the last element of the target path */
+ if (strcmp(sysattr, "driver") != 0 &&
+ strcmp(sysattr, "subsystem") != 0 &&
+ strcmp(sysattr, "module") != 0)
+ goto out;
+
len = readlink(path, target, sizeof(target));
if (len > 0) {
target[len] = '\0';
int udev_device_get_event_timeout(struct udev_device *udev_device)
{
if (!udev_device->info_loaded)
- udev_device_load_info(udev_device);
+ device_load_info(udev_device);
return udev_device->event_timeout;
}
int udev_device_get_num_fake_partitions(struct udev_device *udev_device)
{
if (!udev_device->info_loaded)
- udev_device_load_info(udev_device);
+ device_load_info(udev_device);
return udev_device->num_fake_partitions;
}
int udev_device_get_devlink_priority(struct udev_device *udev_device)
{
if (!udev_device->info_loaded)
- udev_device_load_info(udev_device);
+ device_load_info(udev_device);
return udev_device->devlink_priority;
}
int udev_device_get_ignore_remove(struct udev_device *udev_device)
{
if (!udev_device->info_loaded)
- udev_device_load_info(udev_device);
+ device_load_info(udev_device);
return udev_device->ignore_remove;
}