Given a duid, I want to be able to delete a disk. There seems to be no elegant way to get just the disk ("sd0") from a duid. I didn't like my code using opendev, so I've tried sysctl. Looks better imho. Still, is there a better way?
Index: bioctl.c =================================================================== RCS file: /srv/boron/data/vcs/cvs/openbsd/src/sbin/bioctl/bioctl.c,v retrieving revision 1.98 diff -u -p -r1.98 bioctl.c --- bioctl.c 1 Dec 2010 19:40:18 -0000 1.98 +++ bioctl.c 29 Dec 2010 14:46:30 -0000 @@ -32,6 +32,7 @@ #include <sys/param.h> #include <sys/types.h> #include <sys/stat.h> +#include <sys/sysctl.h> #include <dev/biovar.h> #include <dev/softraidvar.h> @@ -941,13 +942,38 @@ void bio_deleteraid(char *dev) { struct bioc_deleteraid bd; + char *disknames = NULL; memset(&bd, 0, sizeof(bd)); + if (isduid(dev, OPENDEV_PART)) { + int mib[2]; + size_t len; + char *duid, *name; + + mib[0] = CTL_HW; + mib[1] = HW_DISKNAMES; + if (sysctl(mib, 2, NULL, &len, NULL, 0) == -1) + err(1, "sysctl"); + if ((disknames = malloc(len)) == NULL) + err(1, "malloc"); + if (sysctl(mib, 2, disknames, &len, NULL, 0) == -1) + err(1, "sysctl"); + + duid = disknames; + while ((name = strsep(&duid, ":,")) != NULL) + if (duid && strcmp(dev, duid) == 0) { + dev = name; + break; + } + } + bd.bd_cookie = bd.bd_cookie; /* XXX make this a dev_t instead of a string */ strlcpy(bd.bd_dev, dev, sizeof bd.bd_dev); if (ioctl(devh, BIOCDELETERAID, &bd)) errx(1, "delete volume %s failed", dev); + + free(disknames); } void