Module Name:    src
Committed By:   tls
Date:           Sun Aug 10 06:52:34 UTC 2014

Modified Files:
        src/lib/libutil [tls-earlyentropy]: getfsspecname.c

Log Message:
Rebase.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.4.6.1 src/lib/libutil/getfsspecname.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/getfsspecname.c
diff -u src/lib/libutil/getfsspecname.c:1.4 src/lib/libutil/getfsspecname.c:1.4.6.1
--- src/lib/libutil/getfsspecname.c:1.4	Tue Jan  1 18:32:17 2013
+++ src/lib/libutil/getfsspecname.c	Sun Aug 10 06:52:34 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: getfsspecname.c,v 1.4 2013/01/01 18:32:17 dsl Exp $	*/
+/*	$NetBSD: getfsspecname.c,v 1.4.6.1 2014/08/10 06:52:34 tls Exp $	*/
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: getfsspecname.c,v 1.4 2013/01/01 18:32:17 dsl Exp $");
+__RCSID("$NetBSD: getfsspecname.c,v 1.4.6.1 2014/08/10 06:52:34 tls Exp $");
 
 #include <sys/types.h>
 #include <sys/ioctl.h>
@@ -53,13 +53,12 @@ getfsspecname(char *buf, size_t bufsiz, 
 {
 	static const int mib[] = { CTL_HW, HW_DISKNAMES };
 	static const unsigned int miblen = __arraycount(mib);
-	char *drives, *dk;
+	char *drives, *dk, *p;
 	size_t len;
-	int fd, savee;
+	int fd, savee = errno;
 	char *vname;
 
-	drives = NULL;
-	vname = NULL;
+	p = drives = vname = NULL;
 	if (strncasecmp(name, "NAME=", 5) != 0) {
 #ifdef COMPAT_DKWEDGE
 		/*
@@ -129,20 +128,28 @@ search:
 		}
 		(void)close(fd);
 		if (strcmp(vname, (char *)dkw.dkw_wname) == 0) {
-			char *p = strstr(buf, "/rdk");
-			if (p++ == NULL) 
-				return buf;
-			strcpy(p, p + 1);
-			free(drives);
-			free(vname);
-			return buf;
+			p = strstr(buf, "/rdk");
+			goto good;
 		}
 	}
+#ifdef COMPAT_DKWEDGE
+	/* Last ditch effort assuming NAME=label, and label is a disk name */
+	fd = opendisk(name, O_RDONLY, buf, bufsiz, 0);
+	if (fd != -1) {
+		close(fd);
+		p = strstr(buf, "/r");
+		goto good;
+	}
+#endif
 	savee = ESRCH;
 	snprintf(buf, bufsiz, "no match for `%s'", vname);
 out:
+	buf = NULL;
+good:
+	if (p++ != NULL) 
+		strcpy(p, p + 1);
 	free(drives);
 	free(vname);
 	errno = savee;
-	return NULL;
+	return buf;
 }

Reply via email to