Module Name:    src
Committed By:   mlelstv
Date:           Sun Dec 22 14:31:51 UTC 2013

Modified Files:
        src/lib/libutil: getdiskrawname.c

Log Message:
Resolve symlinks and cook the targets instead of the symlink names.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/lib/libutil/getdiskrawname.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libutil/getdiskrawname.c
diff -u src/lib/libutil/getdiskrawname.c:1.1 src/lib/libutil/getdiskrawname.c:1.2
--- src/lib/libutil/getdiskrawname.c:1.1	Sat Apr  7 16:44:39 2012
+++ src/lib/libutil/getdiskrawname.c	Sun Dec 22 14:31:51 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: getdiskrawname.c,v 1.1 2012/04/07 16:44:39 christos Exp $	*/
+/*	$NetBSD: getdiskrawname.c,v 1.2 2013/12/22 14:31:51 mlelstv Exp $	*/
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: getdiskrawname.c,v 1.1 2012/04/07 16:44:39 christos Exp $");
+__RCSID("$NetBSD: getdiskrawname.c,v 1.2 2013/12/22 14:31:51 mlelstv Exp $");
 
 #include <sys/stat.h>
 
@@ -37,18 +37,26 @@ __RCSID("$NetBSD: getdiskrawname.c,v 1.1
 #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 @@ getdiskcookedname(char *buf, size_t bufs
 {
 	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 @@ getdiskcookedname(char *buf, size_t bufs
 		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;

Reply via email to