diff options
author | Tom Gundersen <teg@jklm.no> | 2015-10-06 11:57:53 +0200 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2015-10-06 11:57:53 +0200 |
commit | 3d366432c160c211cc99165316024df3757166ef (patch) | |
tree | 48388d8d8dd0d0288397bbe8db39ab25fda7c5f5 /src | |
parent | edf4126f60561cc6236e46d07f4845dbc6935fa2 (diff) | |
parent | a9ec9f29420623133c419ddc8864921a824751fb (diff) |
Merge pull request #1466 from kaysievers/wip
libsystemd: sd-device - translate / vs. ! in sysname
Diffstat (limited to 'src')
-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); } |