- extern int errno;
- register struct mtab *mp, *space;
- register int cnt;
- register char *p;
- int fd;
- char *index(), *rindex(), *strcpy();
-
- if (!fake) {
- if (mount(spec, name, type)) {
- fprintf(stderr, "%s on %s: ", spec, name);
- switch (errno) {
- case EMFILE:
- fprintf(stderr, "Mount table full\n");
- break;
- case EINVAL:
- fprintf(stderr, "Bogus super block\n");
- break;
- default:
- perror((char *)NULL);
- break;
+ struct ufs_args args;
+ pid_t pid;
+ int argc, i, status;
+ char *argp, *argv[50];
+ char execname[MAXPATHLEN + 1], flagval[12], mntpath[MAXPATHLEN];
+
+ if (mntopts)
+ getstdopts(mntopts, &flags);
+ if (options)
+ getstdopts(options, &flags);
+ if (type)
+ getstdopts(type, &flags);
+ if (force)
+ flags |= MNT_FORCE;
+
+ if (realpath(name, mntpath) == 0) {
+ warn("%s", mntpath);
+ return (1);
+ }
+
+ name = mntpath;
+
+ if (strcmp(name, "/") == 0)
+ flags |= MNT_UPDATE;
+
+ switch (mnttype) {
+ case MOUNT_UFS:
+ if (mntopts)
+ getufsopts(mntopts, &flags);
+ if (options)
+ getufsopts(options, &flags);
+ args.fspec = spec;
+#define DEFAULT_ROOTUID -2
+ args.export.ex_root = DEFAULT_ROOTUID;
+ if (flags & MNT_RDONLY)
+ args.export.ex_flags = MNT_EXRDONLY;
+ else
+ args.export.ex_flags = 0;
+ argp = (caddr_t)&args;
+ break;
+ case MOUNT_MFS:
+ case MOUNT_NFS:
+ default:
+ argv[0] = mntname;
+ argc = 1;
+ if (flags) {
+ argv[argc++] = "-F";
+ (void)snprintf(flagval, sizeof(flagval), "%d", flags);
+ argv[argc++] = flagval;
+ }
+ if (mntopts)
+ argc += getexecopts(mntopts, &argv[argc]);
+ if (options)
+ argc += getexecopts(options, &argv[argc]);
+ argv[argc++] = spec;
+ argv[argc++] = name;
+ argv[argc++] = NULL;
+ snprintf(execname, sizeof(execname),
+ "%s/mount_%s", _PATH_EXECDIR, mntname);
+ if (verbose) {
+ (void)printf("exec: %s", execname);
+ for (i = 1; i < argc - 1; i++)
+ (void)printf(" %s", argv[i]);
+ (void)printf("\n");
+ }
+ if (debug)
+ break;
+ if (pid = vfork()) {
+ if (pid == -1) {
+ warn("vfork starting file system");
+ return (1);