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; }