summaryrefslogtreecommitdiff
path: root/udev/lib/libudev-device.c
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@vrfy.org>2008-10-01 10:22:47 +0200
committerKay Sievers <kay.sievers@vrfy.org>2008-10-01 10:22:47 +0200
commit62b9dfb62255c5b07f1356eee423aff18d6addaa (patch)
treec357a509ea6909d6dfdf62338539506660b4b68b /udev/lib/libudev-device.c
parent8249e04e3e9b6054768c3cd0ef72544831672b47 (diff)
libudev: device - handle /sys/block/<disk-device-link>/<partition>
Diffstat (limited to 'udev/lib/libudev-device.c')
-rw-r--r--udev/lib/libudev-device.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/udev/lib/libudev-device.c b/udev/lib/libudev-device.c
index 893ec080a6..a512537140 100644
--- a/udev/lib/libudev-device.c
+++ b/udev/lib/libudev-device.c
@@ -231,8 +231,8 @@ struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *
{
size_t len;
const char *subdir;
- const char *pos;
char path[UTIL_PATH_SIZE];
+ char *pos;
struct stat statbuf;
struct udev_device *udev_device;
@@ -260,6 +260,23 @@ struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *
util_strlcpy(path, syspath, sizeof(path));
util_resolve_sys_link(udev, path, sizeof(path));
+ /* try to resolve the silly block layout if needed */
+ if (strncmp(&path[len], "/block/", 7) == 0) {
+ char block[UTIL_PATH_SIZE];
+ char part[UTIL_PATH_SIZE];
+
+ util_strlcpy(block, path, sizeof(block));
+ pos = strrchr(block, '/');
+ if (pos == NULL)
+ return NULL;
+ util_strlcpy(part, pos, sizeof(part));
+ pos[0] = '\0';
+ if (util_resolve_sys_link(udev, block, sizeof(block)) == 0) {
+ util_strlcpy(path, block, sizeof(path));
+ util_strlcat(path, part, sizeof(path));
+ }
+ }
+
/* path exists in sys */
if (strncmp(&syspath[len], "/devices/", 9) == 0 ||
strncmp(&syspath[len], "/class/", 7) == 0 ||