summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/sysfs.h20
-rw-r--r--lib/sysfs.c8
2 files changed, 25 insertions, 3 deletions
diff --git a/include/sysfs.h b/include/sysfs.h
index 4564124df..6b08bbed5 100644
--- a/include/sysfs.h
+++ b/include/sysfs.h
@@ -98,7 +98,7 @@ extern int sysfs_scsi_path_contains(struct sysfs_cxt *cxt, const char *pattern);
* Linux kernel linux/drivers/base/core.c: device_get_devnode()
* defines a replacement of '!' in the /sys device name by '/' in the
* /dev device name. This helper replaces all ocurrences of '!' in
- * @name by '/'.
+ * @name by '/' to convert from /sys to /dev.
*/
static inline void sysfs_devname_to_dev_name (char *name)
{
@@ -109,4 +109,22 @@ static inline void sysfs_devname_to_dev_name (char *name)
c[0] = '/';
}
+/**
+ * sysfs_dev_name_to_devname:
+ * @name: devname to be converted in place
+ *
+ * Linux kernel linux/drivers/base/core.c: device_get_devnode()
+ * defines a replacement of '!' in the /sys device name by '/' in the
+ * /dev device name. This helper replaces all ocurrences of '/' in
+ * @name by '!' to convert from /dev to /sys.
+ */
+static inline void sysfs_dev_name_to_devname (char *name)
+{
+ char *c;
+
+ if (name)
+ while ((c = strchr(name, '/')))
+ c[0] = '!';
+}
+
#endif /* UTIL_LINUX_SYSFS_H */
diff --git a/lib/sysfs.c b/lib/sysfs.c
index 8417d2d76..34a520758 100644
--- a/lib/sysfs.c
+++ b/lib/sysfs.c
@@ -74,10 +74,14 @@ dev_t sysfs_devname_to_devno(const char *name, const char *parent)
} else if (!dev) {
/*
- * Create path to /sys/block/<name>/dev
+ * Create path to /sys/block/<sysname>/dev
*/
+ char sysname[PATH_MAX];
+
+ strncpy(sysname, name, sizeof(sysname));
+ sysfs_dev_name_to_devname(sysname);
int len = snprintf(buf, sizeof(buf),
- _PATH_SYS_BLOCK "/%s/dev", name);
+ _PATH_SYS_BLOCK "/%s/dev", sysname);
if (len < 0 || (size_t) len + 1 > sizeof(buf))
return 0;
path = buf;