chiark / gitweb /
if needed, store database entries also for devices which do not have a device node
[elogind.git] / udev / lib / libudev-device.c
index 38af0e7c9411bb573c20d4a240d710fc2629c47a..055263bbef750232c22d48ff1b535f19ec634448 100644 (file)
@@ -77,7 +77,7 @@ static size_t devpath_to_db_path(struct udev *udev, const char *devpath, char *f
        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];
@@ -218,11 +218,11 @@ int udev_device_read_uevent_file(struct udev_device *udev_device)
        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)
@@ -501,9 +501,11 @@ static struct udev_device *device_new_from_parent(struct udev_device *udev_devic
            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));
@@ -676,7 +678,7 @@ const char *udev_device_get_devnode(struct udev_device *udev_device)
        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;
 }
 
@@ -739,7 +741,7 @@ struct udev_list_entry *udev_device_get_devlinks_list_entry(struct udev_device *
        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);
 }
 
@@ -766,7 +768,7 @@ struct udev_list_entry *udev_device_get_properties_list_entry(struct udev_device
        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;
@@ -804,7 +806,7 @@ dev_t udev_device_get_devnum(struct udev_device *udev_device)
        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;
 }
 
@@ -857,11 +859,16 @@ const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const
        }
 
        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';
@@ -1154,7 +1161,7 @@ int udev_device_set_timeout(struct udev_device *udev_device, int timeout)
 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;
 }
 
@@ -1190,7 +1197,7 @@ int udev_device_set_devnum(struct udev_device *udev_device, dev_t devnum)
 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;
 }
 
@@ -1203,7 +1210,7 @@ int udev_device_set_num_fake_partitions(struct udev_device *udev_device, int num
 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;
 }
 
@@ -1216,7 +1223,7 @@ int udev_device_set_devlink_priority(struct udev_device *udev_device, int prio)
 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;
 }