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 <string.h>
 #include <errno.h>
 #include <util.h>
+#include <unistd.h>
 
 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;
