Index: mount/Makefile
===================================================================
RCS file: /cvsroot/src/sbin/mount/Makefile,v
retrieving revision 1.29
diff -u -r1.29 Makefile
--- mount/Makefile 19 Aug 2004 23:02:27 -0000 1.29
+++ mount/Makefile 27 Mar 2011 22:59:06 -0000
@@ -6,5 +6,6 @@
PROG= mount
MAN= mount.8
SRCS= mount.c vfslist.c
+LDADD+= -lutil
.include <bsd.prog.mk>
Index: mount/mount.c
===================================================================
RCS file: /cvsroot/src/sbin/mount/mount.c,v
retrieving revision 1.92
diff -u -r1.92 mount.c
--- mount/mount.c 13 Jan 2011 11:57:02 -0000 1.92
+++ mount/mount.c 27 Mar 2011 22:59:06 -0000
@@ -46,6 +46,8 @@
#include <sys/param.h>
#include <sys/mount.h>
#include <sys/wait.h>
+#include <sys/disk.h>
+#include <sys/sysctl.h>
#include <fs/puffs/puffs_msgif.h>
@@ -58,6 +60,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <util.h>
#define MOUNTNAMES
#include <fcntl.h>
@@ -76,6 +79,8 @@
static struct statvfs *
getmntpt(const char *);
static int getmntargs(struct statvfs *, char *, size_t);
+static const char *
+ getspec(const char *);
static int hasopt(const char *, const char *);
static void mangle(char *, int *, const char ** volatile *, int *);
static int mountfs(const char *, const char *, const char *,
@@ -183,7 +188,8 @@
mntfromname = mntbuf->f_mntfromname;
} else
mntfromname = fs->fs_spec;
- if (mountfs(fs->fs_vfstype, mntfromname,
+ if (mountfs(fs->fs_vfstype,
+ getspec(mntfromname),
fs->fs_file, init_flags, options,
fs->fs_mntops, !forceall, NULL, 0))
rval = 1;
@@ -274,7 +280,7 @@
fstypename = fs->fs_vfstype;
mountopts = fs->fs_mntops;
}
- rval = mountfs(fstypename, mntfromname,
+ rval = mountfs(fstypename, getspec(mntfromname),
mntonname, init_flags, options, mountopts, 0, NULL, 0);
break;
case 2:
@@ -283,6 +289,7 @@
* a ':' or a '@' then assume that an NFS filesystem is being
* specified ala Sun.
*/
+ mntfromname = getspec(argv[0]);
if (vfslist == NULL) {
if (strpbrk(argv[0], ":@") != NULL) {
fprintf(stderr, "WARNING: autoselecting nfs "
@@ -292,13 +299,13 @@
"in a future release\n");
vfstype = "nfs";
} else {
- vfstype = getfslab(argv[0]);
+ vfstype = getfslab(mntfromname);
if (vfstype == NULL)
vfstype = ffs_fstype;
}
}
- rval = mountfs(vfstype,
- argv[0], argv[1], init_flags, options, NULL, 0, NULL, 0);
+ rval = mountfs(vfstype, mntfromname,
+ argv[1], init_flags, options, NULL, 0, NULL, 0);
break;
default:
usage();
@@ -767,6 +774,58 @@
return (vfstype);
}
+/* Query device path from disk name */
+static const char *
+getspec(const char *name)
+{
+ struct dkwedge_info dkw;
+ char *drives, *dk;
+ int mib[2];
+ size_t len;
+ int fd;
+ static char devpath[MAXPATHLEN];
+ const char *match = name;
+ char *bn;
+
+ if (strncasecmp(name, "NAME=", 5) != 0)
+ return name;
+ name += 5;
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_DISKNAMES;
+ if (sysctl(mib, 2, NULL, &len, NULL, 0) < 0)
+ err(1, "sysctl hw.disknames failed");
+ drives = (char *)malloc(len);
+ if (drives == NULL)
+ err(1, "out of memory");
+ if (sysctl(mib, 2, drives, &len, NULL, 0) < 0)
+ err(1, "sysctl hw.disknames failed");
+
+ for (dk = drives; (dk = strtok(dk, " ")) != NULL; dk = NULL) {
+ if (strncmp(dk, "dk", 2) != 0)
+ continue;
+ /* must use raw device, the block device can be busy */
+ fd = opendisk(dk, O_RDONLY, devpath, sizeof(devpath), 0);
+ if (fd < 0)
+ continue;
+ if (ioctl(fd, DIOCGWEDGEINFO, &dkw) == -1)
+ err(1, "%s: getwedgeinfo", dk);
+ close(fd);
+ if (strcmp(name, (char *)dkw.dkw_wname) == 0) {
+ /* fix up raw path */
+ bn = strrchr(devpath,'/');
+ if (bn != NULL && bn[1] == 'r')
+ memmove(&bn[1],&bn[2],strlen(&bn[2])+1);
+ match = devpath;
+ break;
+ }
+ }
+
+ free(drives);
+
+ return match;
+}
+
static void
usage(void)
{
Index: umount/Makefile
===================================================================
RCS file: /cvsroot/src/sbin/umount/Makefile,v
retrieving revision 1.16
diff -u -r1.16 Makefile
--- umount/Makefile 21 Jan 2006 11:59:53 -0000 1.16
+++ umount/Makefile 27 Mar 2011 22:59:06 -0000
@@ -15,5 +15,6 @@
.PATH: ${MOUNT}
SRCS+= vfslist.c
.endif
+LDADD+= -lutil
.include <bsd.prog.mk>
Index: umount/umount.c
===================================================================
RCS file: /cvsroot/src/sbin/umount/umount.c,v
retrieving revision 1.43
diff -u -r1.43 umount.c
--- umount/umount.c 5 Aug 2008 20:57:45 -0000 1.43
+++ umount/umount.c 27 Mar 2011 22:59:06 -0000
@@ -47,6 +47,8 @@
#include <sys/stat.h>
#include <sys/mount.h>
#include <sys/time.h>
+#include <sys/disk.h>
+#include <sys/sysctl.h>
#ifndef SMALL
#include <sys/socket.h>
@@ -63,6 +65,8 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <fcntl.h>
+#include <util.h>
typedef enum { MNTANY, MNTON, MNTFROM } mntwhat;
@@ -80,6 +84,8 @@
static int fflag;
static char *getmntname(const char *, mntwhat, char **);
+static const char *
+ getspec(const char *);
static int umountfs(const char *, const char **, int);
static void usage(void) __dead;
@@ -93,6 +99,7 @@
struct addrinfo hints;
#endif /* SMALL */
const char **typelist = NULL;
+ const char *spec;
/* Start disks transferring immediately. */
sync();
@@ -166,9 +173,11 @@
}
} else
#endif /* !SMALL */
- for (errs = 0; *argv != NULL; ++argv)
- if (umountfs(*argv, typelist, raw) != 0)
+ for (errs = 0; *argv != NULL; ++argv) {
+ spec = getspec(*argv);
+ if (umountfs(spec, typelist, raw) != 0)
errs = 1;
+ }
return errs;
}
@@ -321,6 +330,58 @@
return (NULL);
}
+/* Query device path from disk name */
+static const char *
+getspec(const char *name)
+{
+ struct dkwedge_info dkw;
+ char *drives, *dk;
+ int mib[2];
+ size_t len;
+ int fd;
+ static char devpath[MAXPATHLEN];
+ const char *match = name;
+ char *bn;
+
+ if (strncasecmp(name, "NAME=", 5) != 0)
+ return name;
+ name += 5;
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_DISKNAMES;
+ if (sysctl(mib, 2, NULL, &len, NULL, 0) < 0)
+ err(1, "sysctl hw.disknames failed");
+ drives = (char *)malloc(len);
+ if (drives == NULL)
+ err(1, "out of memory");
+ if (sysctl(mib, 2, drives, &len, NULL, 0) < 0)
+ err(1, "sysctl hw.disknames failed");
+
+ for (dk = drives; (dk = strtok(dk, " ")) != NULL; dk = NULL) {
+ if (strncmp(dk, "dk", 2) != 0)
+ continue;
+ /* must use raw device, the block device can be busy */
+ fd = opendisk(dk, O_RDONLY, devpath, sizeof(devpath), 0);
+ if (fd < 0)
+ continue;
+ if (ioctl(fd, DIOCGWEDGEINFO, &dkw) == -1)
+ err(1, "%s: getwedgeinfo", dk);
+ close(fd);
+ if (strcmp(name, (char *)dkw.dkw_wname) == 0) {
+ /* fix up raw path */
+ bn = strrchr(devpath,'/');
+ if (bn != NULL && bn[1] == 'r')
+ memmove(&bn[1],&bn[2],strlen(&bn[2])+1);
+ match = devpath;
+ break;
+ }
+ }
+
+ free(drives);
+
+ return match;
+}
+
#ifndef SMALL
static int
sacmp(const struct sockaddr *sa1, const struct sockaddr *sa2)
Index: fsck/fsck.c
===================================================================
RCS file: /cvsroot/src/sbin/fsck/fsck.c,v
retrieving revision 1.49
diff -u -r1.49 fsck.c
--- fsck/fsck.c 24 Feb 2010 13:56:07 -0000 1.49
+++ fsck/fsck.c 27 Mar 2011 22:59:06 -0000
@@ -48,6 +48,7 @@
#include <sys/disk.h>
#include <sys/disklabel.h>
#include <sys/ioctl.h>
+#include <sys/sysctl.h>
#include <err.h>
#include <errno.h>
@@ -91,6 +92,7 @@
static const char *getfslab(const char *);
static void usage(void);
static void *isok(struct fstab *);
+static const char *getspec(const char *);
int
main(int argc, char *argv[])
@@ -199,6 +201,9 @@
char device[MAXPATHLEN];
spec = *argv;
+
+ spec = getspec(spec);
+
cp = strrchr(spec, '/');
if (cp == 0) {
(void)snprintf(device, sizeof(device), "%s%s",
@@ -218,6 +223,7 @@
errx(FSCK_EXIT_CHECK_FAILED,
"%s has unknown file system type.",
spec);
+ spec = getspec(spec);
}
rval = checkfs(type, blockcheck(spec), *argv, NULL, NULL);
@@ -576,6 +582,57 @@
return vfstype;
}
+/* Query device path from disk name */
+static const char *
+getspec(const char *name)
+{
+ struct dkwedge_info dkw;
+ char *drives, *dk;
+ int mib[2];
+ size_t len;
+ int fd;
+ static char devpath[MAXPATHLEN];
+ const char *match = name;
+ char *bn;
+
+ if (strncasecmp(name, "NAME=", 5) != 0)
+ return name;
+ name += 5;
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_DISKNAMES;
+ if (sysctl(mib, 2, NULL, &len, NULL, 0) < 0)
+ err(1, "sysctl hw.disknames failed");
+ drives = (char *)malloc(len);
+ if (drives == NULL)
+ err(1, "out of memory");
+ if (sysctl(mib, 2, drives, &len, NULL, 0) < 0)
+ err(1, "sysctl hw.disknames failed");
+
+ for (dk = drives; (dk = strtok(dk, " ")) != NULL; dk = NULL) {
+ if (strncmp(dk, "dk", 2) != 0)
+ continue;
+ /* must use raw device, the block device can be busy */
+ fd = opendisk(dk, O_RDONLY, devpath, sizeof(devpath), 0);
+ if (fd < 0)
+ continue;
+ if (ioctl(fd, DIOCGWEDGEINFO, &dkw) == -1)
+ err(1, "%s: getwedgeinfo", dk);
+ close(fd);
+ if (strcmp(name, (char *)dkw.dkw_wname) == 0) {
+ /* fix up raw path */
+ bn = strrchr(devpath,'/');
+ if (bn != NULL && bn[1] == 'r')
+ memmove(&bn[1],&bn[2],strlen(&bn[2])+1);
+ match = devpath;
+ break;
+ }
+ }
+
+ free(drives);
+
+ return match;
+}
static void
usage(void)