From 9f93f11b6d93b66336cdf027a820c04acfe6b10b Mon Sep 17 00:00:00 2001 From: jsing <> Date: Mon, 15 Nov 2010 15:11:31 +0000 Subject: [PATCH] Teach readlabelfs() how to handle DUIDs. ok krw@ --- src/lib/libutil/readlabel.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/lib/libutil/readlabel.c b/src/lib/libutil/readlabel.c index acb3699c..ad533a26 100644 --- a/src/lib/libutil/readlabel.c +++ b/src/lib/libutil/readlabel.c @@ -1,4 +1,4 @@ -/* $OpenBSD: readlabel.c,v 1.10 2006/10/02 12:01:40 krw Exp $ */ +/* $OpenBSD: readlabel.c,v 1.11 2010/11/15 15:11:31 jsing Exp $ */ /* * Copyright (c) 1996, Jason Downs. All rights reserved. @@ -33,6 +33,7 @@ #include #include #include +#include #include #define DKTYPENAMES #include @@ -50,10 +51,27 @@ char * readlabelfs(char *device, int verbose) { char rpath[MAXPATHLEN]; + struct dk_diskmap dm; struct disklabel dk; char part, *type; struct stat sbuf; - int fd; + int fd = -1; + + /* Perform disk mapping if device is given as a DUID. */ + if (isduid(device, 0)) { + if ((fd = open("/dev/diskmap", O_RDONLY)) != -1) { + bzero(&dm, sizeof(struct dk_diskmap)); + strlcpy(rpath, device, sizeof(rpath)); + part = rpath[strlen(rpath) - 1]; + dm.device = rpath; + dm.fd = fd; + dm.flags = DM_OPENPART; + if (ioctl(fd, DIOCMAP, &dm) == -1) + close(fd); + else + goto disklabel; + } + } /* Assuming device is of the form /dev/??p, build a raw partition. */ if (stat(device, &sbuf) < 0) { @@ -64,8 +82,7 @@ readlabelfs(char *device, int verbose) switch (sbuf.st_mode & S_IFMT) { case S_IFCHR: /* Ok... already a raw device. Hmm. */ - strncpy(rpath, device, sizeof(rpath)); - rpath[sizeof(rpath) - 1] = '\0'; + strlcpy(rpath, device, sizeof(rpath)); /* Change partition name. */ part = rpath[strlen(rpath) - 1]; @@ -105,6 +122,9 @@ readlabelfs(char *device, int verbose) return (NULL); } } + +disklabel: + if (ioctl(fd, DIOCGDINFO, &dk) < 0) { if (verbose) warn("%s: couldn't read disklabel", rpath);