diff options
author | Kay Sievers <kay@vrfy.org> | 2015-10-06 00:41:32 +0200 |
---|---|---|
committer | Kay Sievers <kay@vrfy.org> | 2015-10-06 00:41:32 +0200 |
commit | a9ec9f29420623133c419ddc8864921a824751fb (patch) | |
tree | 15ea4df345bcc26b66a090eb3e9a38f90fc0f704 | |
parent | f4e5a03ed7d62e21b5533a7e1124d610bd0a81a4 (diff) | |
download | systemd-a9ec9f29420623133c419ddc8864921a824751fb.tar.gz systemd-a9ec9f29420623133c419ddc8864921a824751fb.tar.bz2 systemd-a9ec9f29420623133c419ddc8864921a824751fb.zip |
libsystemd: sd-device - translate / vs. ! in sysname
The kernel replaces '/' in device names with '!', we translate that back
to '/' in sysname, when taking sysname as input, we should translate it
back again.
-rw-r--r-- | src/libsystemd/sd-device/sd-device.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index c528a157c1..e46546ed91 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -295,15 +295,27 @@ _public_ int sd_device_new_from_subsystem_sysname(sd_device **ret, const char *s } else return -EINVAL; } else { - syspath = strjoina("/sys/subsystem/", subsystem, "/devices/", sysname); + char *name; + size_t len = 0; + + /* translate sysname back to sysfs filename */ + name = strdupa(sysname); + while (name[len] != '\0') { + if (name[len] == '/') + name[len] = '!'; + + len ++; + } + + syspath = strjoina("/sys/subsystem/", subsystem, "/devices/", name); if (access(syspath, F_OK) >= 0) return sd_device_new_from_syspath(ret, syspath); - syspath = strjoina("/sys/bus/", subsystem, "/devices/", sysname); + syspath = strjoina("/sys/bus/", subsystem, "/devices/", name); if (access(syspath, F_OK) >= 0) return sd_device_new_from_syspath(ret, syspath); - syspath = strjoina("/sys/class/", subsystem, "/", sysname); + syspath = strjoina("/sys/class/", subsystem, "/", name); if (access(syspath, F_OK) >= 0) return sd_device_new_from_syspath(ret, syspath); } |