Index: lib/libutil/getdiskrawname.c =================================================================== RCS file: /cvsroot/src/lib/libutil/getdiskrawname.c,v retrieving revision 1.1 diff -u -r1.1 getdiskrawname.c --- lib/libutil/getdiskrawname.c 7 Apr 2012 16:44:39 -0000 1.1 +++ lib/libutil/getdiskrawname.c 25 Nov 2013 22:29:00 -0000 @@ -37,18 +37,26 @@ #include #include #include +#include const char * getdiskrawname(char *buf, size_t bufsiz, const char *name) { const char *dp = strrchr(name, '/'); struct stat st; + ssize_t len; if (dp == NULL) { errno = EINVAL; return NULL; } + len = readlink(name, buf, bufsiz-1); + if (len > 0) { + buf[len] = '\0'; + name = buf; + } + if (stat(name, &st) == -1) return NULL; @@ -67,11 +75,19 @@ { const char *dp; struct stat st; + ssize_t len; if ((dp = strrchr(name, '/')) == NULL) { errno = EINVAL; return NULL; } + + len = readlink(name, buf, bufsiz-1); + if (len > 0) { + buf[len] = '\0'; + name = buf; + } + if (stat(name, &st) == -1) return NULL; @@ -79,10 +95,12 @@ errno = EFTYPE; return NULL; } + if (dp[1] != 'r') { errno = EINVAL; return NULL; } + (void)snprintf(buf, bufsiz, "%.*s/%s", (int)(dp - name), name, dp + 2); return buf;