* e.g.,
* /dev/sda3 -> sda
* /dev/cciss/c0d1p2 -> cciss/c0d1
+ * dev can a symbolic link.
*/
int get_block_device_base(const char *dev, char *out, size_t out_len)
{
DIR *dir;
char devname[PATH_MAX], fn[PATH_MAX];
char *p;
+ char realname[PATH_MAX] = {0};
- if (strncmp(dev, "/dev/", 5) != 0)
- return -EINVAL;
+ if (strncmp(dev, "/dev/", 5) != 0) {
+ if ((readlink(dev, realname, sizeof(realname)) == -1) || (strncmp(realname, "/dev/", 5) != 0))
+ return -EINVAL;
+ }
+
+ if (strlen(realname))
+ strncpy(devname, realname + 5, PATH_MAX -1);
+ else
+ strncpy(devname, dev + 5, PATH_MAX-1);
- strncpy(devname, dev + 5, PATH_MAX-1);
devname[PATH_MAX-1] = '\0';
for (p = devname; *p; ++p)
if (*p == '/')