Module Name:    src
Committed By:   christos
Date:           Sat Apr  7 17:10:03 UTC 2012

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

Log Message:
Add and enable COMPAT_DKWEDGE which let's us autoconfigure wedges and boot
with a non-wedge aware fstab.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 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.1 src/lib/libutil/getfsspecname.c:1.2
--- src/lib/libutil/getfsspecname.c:1.1	Sat Apr  7 00:04:45 2012
+++ src/lib/libutil/getfsspecname.c	Sat Apr  7 13:10:02 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: getfsspecname.c,v 1.1 2012/04/07 04:04:45 christos Exp $	*/
+/*	$NetBSD: getfsspecname.c,v 1.2 2012/04/07 17:10:02 christos 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.1 2012/04/07 04:04:45 christos Exp $");
+__RCSID("$NetBSD: getfsspecname.c,v 1.2 2012/04/07 17:10:02 christos Exp $");
 
 #include <sys/types.h>
 #include <sys/sysctl.h>
@@ -45,6 +45,8 @@ __RCSID("$NetBSD: getfsspecname.c,v 1.1 
 #include <unistd.h>
 #include <util.h>
 
+#define COMPAT_DKWEDGE	/* To be removed */
+
 const char *
 getfsspecname(char *buf, size_t bufsiz, const char *name)
 {
@@ -58,11 +60,35 @@ getfsspecname(char *buf, size_t bufsiz, 
 	drives = NULL;
 	vname = NULL;
 	if (strncasecmp(name, "NAME=", 5) != 0) {
+#ifdef COMPAT_DKWEDGE
+		/*
+		 * We try to open the disk name, and if we fail with EBUSY
+		 * we use the name as the label to find the wedge.
+		 */
+		char rbuf[MAXPATHLEN];
+		if (name[0] == '/') {
+			if (getdiskrawname(rbuf, sizeof(rbuf), name) == NULL) {
+				savee = errno;
+				strlcpy(buf, "makeraw failed", bufsiz);
+				goto out;
+			}
+			if ((fd = open(rbuf, O_RDONLY)) == -1) {
+				if (errno == EBUSY) {
+					name = strrchr(name, '/') + 1;
+					goto search;
+				}
+			} else
+				close(fd);
+		}
+#endif
 		strlcpy(buf, name, bufsiz);
 		return buf;
-	}
+	} else
+		name += 5;
 
-	name += 5;
+#ifdef COMPAT_DKWEDGE
+search:
+#endif
 	vname = malloc(strlen(name) * 4 + 1);
 	if (vname == NULL) {
 		savee = errno;

Reply via email to