From c06fe0a05e6348d700e4941d30aadcdacef5d829 Mon Sep 17 00:00:00 2001 From: Peter Wemm Date: Tue, 11 Mar 1997 12:28:00 +0000 Subject: Merge from Lite2 - use new getvfsbyname() interface and mount(2) interface **DANGER WILL ROBINSON!!** You must be running a -current kernel from within a week or so in order for this to work! --- sbin/mount/Makefile | 5 +- sbin/mount/getmntopts.3 | 17 ++-- sbin/mount/getmntopts.c | 14 +++- sbin/mount/mntopts.h | 22 +++--- sbin/mount/mount.8 | 20 +++-- sbin/mount/mount.c | 189 +++++++++++++++++++------------------------- sbin/mount/mount_ufs.c | 34 ++++---- sbin/mount_ifs/Makefile | 5 +- sbin/mount_ifs/getmntopts.3 | 17 ++-- sbin/mount_ifs/getmntopts.c | 14 +++- sbin/mount_ifs/mntopts.h | 22 +++--- sbin/mount_ifs/mount.8 | 20 +++-- sbin/mount_ifs/mount.c | 189 +++++++++++++++++++------------------------- sbin/mount_ifs/mount_ufs.c | 34 ++++---- 14 files changed, 294 insertions(+), 308 deletions(-) diff --git a/sbin/mount/Makefile b/sbin/mount/Makefile index 6d87935d5f2c..a06b102ee7c4 100644 --- a/sbin/mount/Makefile +++ b/sbin/mount/Makefile @@ -1,8 +1,9 @@ -# @(#)Makefile 8.5 (Berkeley) 3/27/94 +# @(#)Makefile 8.6 (Berkeley) 5/8/95 PROG= mount -SRCS= mount.c mount_ufs.c getmntopts.c +SRCS= mount.c mount_ufs.c getmntopts.c vfslist.c MAN8= mount.8 # We do NOT install the getmntopts.3 man page. +CFLAGS+= -D_NEW_VFSCONF .include diff --git a/sbin/mount/getmntopts.3 b/sbin/mount/getmntopts.3 index c1bd25a227da..8424104620b6 100644 --- a/sbin/mount/getmntopts.3 +++ b/sbin/mount/getmntopts.3 @@ -29,9 +29,9 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" @(#)getmntopts.3 8.1 (Berkeley) 3/27/94 +.\" @(#)getmntopts.3 8.3 (Berkeley) 3/30/95 .\" -.Dd March 27, 1994 +.Dd March 30, 1995 .Dt GETMNTOPTS 3 .Os BSD 4.4 .Sh NAME @@ -62,7 +62,7 @@ or .Dv m_altloc field of the option's table entry) are updated. -The flag word is not initialized by +The flag words are not initialized by .Nm getmntopt . The table, .Dv mopts , @@ -154,16 +154,21 @@ struct mntopt mopts[] = { }; ... - mntflags = 0; + mntflags = mntaltflags = 0; ... - getmntopts(options, mopts, &mntflags) + getmntopts(options, mopts, &mntflags, &mntaltflags); ... .Ed .Sh DIAGNOSTICS -The +If the external integer variable +.Dv getmnt_silent +is non-zero then the .Nm getmntopts function displays an error message and exits if an unrecognized option is encountered. +By default +.Dv getmnt_silent +is zero. .Sh SEE ALSO .Xr err 3 , .Xr mount 8 diff --git a/sbin/mount/getmntopts.c b/sbin/mount/getmntopts.c index 75c75b202416..583d154f4793 100644 --- a/sbin/mount/getmntopts.c +++ b/sbin/mount/getmntopts.c @@ -32,7 +32,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)getmntopts.c 8.1 (Berkeley) 3/27/94"; +static char sccsid[] = "@(#)getmntopts.c 8.3 (Berkeley) 3/29/95"; #endif /* not lint */ #include @@ -57,7 +57,7 @@ getmntopts(options, m0, flagp, altflagp) { const struct mntopt *m; int negative, len; - char *opt, *optbuf; + char *opt, *optbuf, *p; int *thisflagp; /* Copy option string, since it is about to be torn asunder... */ @@ -72,6 +72,14 @@ getmntopts(options, m0, flagp, altflagp) } else negative = 0; + /* + * for options with assignments in them (ie. quotas) + * ignore the assignment as it's handled elsewhere + */ + p = strchr(opt, '='); + if (p) + *p = '\0'; + /* Scan option table. */ for (m = m0; m->m_option != NULL; ++m) { len = strlen(m->m_option); @@ -89,7 +97,7 @@ getmntopts(options, m0, flagp, altflagp) *thisflagp |= m->m_flag; else *thisflagp &= ~m->m_flag; - } else if(!getmnt_silent) { + } else if (!getmnt_silent) { errx(1, "-o %s: option not supported", opt); } } diff --git a/sbin/mount/mntopts.h b/sbin/mount/mntopts.h index 032d70ed5316..8ca12603d771 100644 --- a/sbin/mount/mntopts.h +++ b/sbin/mount/mntopts.h @@ -30,48 +30,48 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)mntopts.h 8.3 (Berkeley) 3/27/94 + * @(#)mntopts.h 8.7 (Berkeley) 3/29/95 */ struct mntopt { const char *m_option; /* option name */ int m_inverse; /* if a negative option, eg "dev" */ int m_flag; /* bit to set, eg. MNT_RDONLY */ - int m_altloc; /* zero if this is a real mount flag */ + int m_altloc; /* 1 => set bit in altflags */ }; /* User-visible MNT_ flags. */ #define MOPT_ASYNC { "async", 0, MNT_ASYNC, 0 } #define MOPT_NOATIME { "atime", 1, MNT_NOATIME, 0 } -#define MOPT_NOAUTO { "auto", 1, 0, 0 } #define MOPT_NODEV { "dev", 1, MNT_NODEV, 0 } #define MOPT_NOEXEC { "exec", 1, MNT_NOEXEC, 0 } #define MOPT_NOSUID { "suid", 1, MNT_NOSUID, 0 } #define MOPT_RDONLY { "rdonly", 0, MNT_RDONLY, 0 } #define MOPT_SYNC { "sync", 0, MNT_SYNCHRONOUS, 0 } #define MOPT_UNION { "union", 0, MNT_UNION, 0 } - -/* Skip this options without any action (needed for checkquota/quotaon) */ -#define MOPT_UQUOTA { "userquota", 0, 0, 0 } -#define MOPT_GQUOTA { "groupquota", 0, 0, 0 } +#define MOPT_USERQUOTA { "userquota", 0, 0, 0 } +#define MOPT_GROUPQUOTA { "groupquota", 0, 0, 0 } /* Control flags. */ #define MOPT_FORCE { "force", 0, MNT_FORCE, 0 } #define MOPT_UPDATE { "update", 0, MNT_UPDATE, 0 } - -/* Support for old-style "ro", "rw" flags. */ #define MOPT_RO { "ro", 0, MNT_RDONLY, 0 } #define MOPT_RW { "rw", 1, MNT_RDONLY, 0 } +/* This is parsed by mount(8), but is ignored by specific mount_*(8)s. */ +#define MOPT_AUTO { "auto", 0, 0, 0 } + #define MOPT_FSTAB_COMPAT \ MOPT_RO, \ - MOPT_RW + MOPT_RW, \ + MOPT_AUTO /* Standard options which all mounts can understand. */ #define MOPT_STDOPTS \ + MOPT_USERQUOTA, \ + MOPT_GROUPQUOTA, \ MOPT_FSTAB_COMPAT, \ MOPT_NOATIME, \ - MOPT_NOAUTO, \ MOPT_NODEV, \ MOPT_NOEXEC, \ MOPT_NOSUID, \ diff --git a/sbin/mount/mount.8 b/sbin/mount/mount.8 index 2961cc1b3a40..f0fd0ac64b33 100644 --- a/sbin/mount/mount.8 +++ b/sbin/mount/mount.8 @@ -29,10 +29,10 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" @(#)mount.8 8.7 (Berkeley) 3/27/94 -.\" $Id$ +.\" @(#)mount.8 8.8 (Berkeley) 6/16/94 +.\" $Id: mount.8,v 1.14 1997/02/22 14:32:43 peter Exp $ .\" -.Dd March 27, 1994 +.Dd June 16, 1994 .Dt MOUNT 8 .Os BSD 4 .Sh NAME @@ -76,10 +76,12 @@ this list is printed. The options are as follows: .Bl -tag -width indent .It Fl a -Causes all filesystems listed in -.Pa /etc/fstab -(except those with the ``noauto'' option) to be mounted. This is normally -done during system startup. +All the filesystems described in +.Xr fstab 5 +are mounted. +Exceptions are those marked as ``noauto'' or are excluded by the +.Fl t +flag (see below). .It Fl d Causes everything to be done except for the actual system call. This option is useful in conjunction with the @@ -120,6 +122,10 @@ is useful on filesystems where there are large numbers of files and performance is more critical than updating the file access time (which is rarely ever important). This option is currently only supported on local filesystems. +.It noauto +This filesystem should be skipped when mount is run with the +.Fl a +flag. .It nodev Do not interpret character or block special devices on the file system. This option is useful for a server that has file systems containing diff --git a/sbin/mount/mount.c b/sbin/mount/mount.c index 5592a632ce42..99173ea264d4 100644 --- a/sbin/mount/mount.c +++ b/sbin/mount/mount.c @@ -38,7 +38,7 @@ static char copyright[] = #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)mount.c 8.19 (Berkeley) 4/19/94"; +static char sccsid[] = "@(#)mount.c 8.25 (Berkeley) 5/8/95"; #endif /* not lint */ #include @@ -50,6 +50,7 @@ static char sccsid[] = "@(#)mount.c 8.19 (Berkeley) 4/19/94"; #include #include #include +#include #include #include #include @@ -58,22 +59,20 @@ static char sccsid[] = "@(#)mount.c 8.19 (Berkeley) 4/19/94"; #include "pathnames.h" -int debug, verbose, skipvfs; +int debug, verbose; int fstab_style = 0; -static char *mnttype[] = INITMOUNTNAMES; - -int badvfsname __P((const char *, const char **)); -int badvfstype __P((int, const char **)); +int checkvfsname __P((const char *, const char **)); char *catopt __P((char *, const char *)); struct statfs *getmntpt __P((const char *)); +int hasopt __P((const char *, const char *)); const char **makevfslist __P((char *)); void mangle __P((char *, int *, const char **)); int mountfs __P((const char *, const char *, const char *, int, const char *, const char *)); -void prmount __P((const char *, const char *, int)); +void prmount __P((struct statfs *)); void usage __P((void)); void putfsent __P((const struct statfs *)); @@ -96,7 +95,7 @@ static struct opt { { MNT_RDONLY, "read-only" }, { MNT_SYNCHRONOUS, "synchronous" }, { MNT_UNION, "union" }, - { MNT_USER, "user mount" }, + { MNT_NOATIME, "noatime" }, { NULL } }; @@ -105,7 +104,7 @@ main(argc, argv) int argc; char * const argv[]; { - const char *mntonname, **vfslist, *vfstype; + const char *mntfromname, **vfslist, *vfstype; struct fstab *fs; struct statfs *mntbuf; FILE *mountdfp; @@ -173,9 +172,9 @@ main(argc, argv) while ((fs = getfsent()) != NULL) { if (BADTYPE(fs->fs_type)) continue; - if (badvfsname(fs->fs_vfstype, vfslist)) + if (checkvfsname(fs->fs_vfstype, vfslist)) continue; - if (strstr(fs->fs_mntops, "noauto")) + if (hasopt(fs->fs_mntops, "noauto")) continue; if (mountfs(fs->fs_vfstype, fs->fs_spec, fs->fs_file, init_flags, options, @@ -186,7 +185,7 @@ main(argc, argv) if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)) == 0) err(1, "getmntinfo"); for (i = 0; i < mntsize; i++) { - if (badvfstype(mntbuf[i].f_type, vfslist)) + if (checkvfsname(mntbuf[i].f_fstypename, vfslist)) continue; putfsent (&mntbuf[i]); } @@ -195,10 +194,9 @@ main(argc, argv) if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)) == 0) err(1, "getmntinfo"); for (i = 0; i < mntsize; i++) { - if (badvfstype(mntbuf[i].f_type, vfslist)) + if (checkvfsname(mntbuf[i].f_fstypename, vfslist)) continue; - prmount(mntbuf[i].f_mntfromname, - mntbuf[i].f_mntonname, mntbuf[i].f_flags); + prmount(&mntbuf[i]); } } exit(rval); @@ -211,25 +209,23 @@ main(argc, argv) errx(1, "unknown special file or file system %s.", *argv); - if ((fs = getfsfile(mntbuf->f_mntonname)) == NULL) - errx(1, "can't find fstab entry for %s.", - *argv); - /* If it's an update, ignore the fstab file options. */ - fs->fs_mntops = NULL; - mntonname = mntbuf->f_mntonname; - } else { - if ((fs = getfsfile(*argv)) == NULL && - (fs = getfsspec(*argv)) == NULL) - errx(1, - "%s: unknown special file or file system.", - *argv); - if (BADTYPE(fs->fs_type)) - errx(1, "%s has unknown file system type.", - *argv); - mntonname = fs->fs_file; + if ((fs = getfsfile(mntbuf->f_mntonname)) != NULL) + mntfromname = fs->fs_spec; + else + mntfromname = mntbuf->f_mntfromname; + rval = mountfs(mntbuf->f_fstypename, mntfromname, + mntbuf->f_mntonname, init_flags, options, 0); + break; } - rval = mountfs(fs->fs_vfstype, fs->fs_spec, - mntonname, init_flags, options, fs->fs_mntops); + if ((fs = getfsfile(*argv)) == NULL && + (fs = getfsspec(*argv)) == NULL) + errx(1, "%s: unknown special file or file system.", + *argv); + if (BADTYPE(fs->fs_type)) + errx(1, "%s has unknown file system type.", + *argv); + rval = mountfs(fs->fs_vfstype, fs->fs_spec, fs->fs_file, + init_flags, options, fs->fs_mntops); break; case 2: /* @@ -262,6 +258,31 @@ main(argc, argv) exit(rval); } +int +hasopt(mntopts, option) + const char *mntopts, *option; +{ + int negative, found; + char *opt, *optbuf; + + if (option[0] == 'n' && option[1] == 'o') { + negative = 1; + option += 2; + } else + negative = 0; + optbuf = strdup(mntopts); + found = 0; + for (opt = optbuf; (opt = strtok(opt, ",")) != NULL; opt = NULL) { + if (opt[0] == 'n' && opt[1] == 'o') { + if (!strcasecmp(opt + 2, option)) + found = negative; + } else if (!strcasecmp(opt, option)) + found = !negative; + } + free(optbuf); + return (found); +} + int mountfs(vfstype, spec, name, flags, options, mntopts) const char *vfstype, *spec, *name, *options, *mntopts; @@ -296,12 +317,15 @@ mountfs(vfstype, spec, name, flags, options, mntopts) name = mntpath; + if (mntopts == NULL) + mntopts = ""; if (options == NULL) { - if (*mntopts == '\0') + if (*mntopts == '\0') { options = "rw"; - else + } else { options = mntopts; - mntopts = ""; + mntopts = ""; + } } optbuf = catopt(strdup(mntopts), options); @@ -387,15 +411,13 @@ mountfs(vfstype, spec, name, flags, options, mntopts) if (verbose) { if (statfs(name, &sf) < 0) { - warn("%s", name); + warn("statfs %s", name); return (1); } - if (fstab_style) - putfsent (&sf); + putfsent (&sf); else - prmount (sf.f_mntfromname, - sf.f_mntonname, sf.f_flags); + prmount(&sf); } break; } @@ -404,21 +426,29 @@ mountfs(vfstype, spec, name, flags, options, mntopts) } void -prmount(spec, name, flags) - const char *spec, *name; - int flags; +prmount(sfp) + struct statfs *sfp; { + int flags; struct opt *o; + struct passwd *pw; int f; - (void)printf("%s on %s", spec, name); + (void)printf("%s on %s", sfp->f_mntfromname, sfp->f_mntonname); - flags &= MNT_VISFLAGMASK; + flags = sfp->f_flags & MNT_VISFLAGMASK; for (f = 0, o = optnames; flags && o->o_opt; o++) if (flags & o->o_opt) { (void)printf("%s%s", !f++ ? " (" : ", ", o->o_name); flags &= ~o->o_opt; } + if (sfp->f_owner) { + (void)printf("%smounted by ", !f++ ? " (" : ", "); + if ((pw = getpwuid(sfp->f_owner)) != NULL) + (void)printf("%s", pw->pw_name); + else + (void)printf("%d", sfp->f_owner); + } (void)printf(f ? ")\n" : "\n"); } @@ -437,68 +467,6 @@ getmntpt(name) return (NULL); } -int -badvfsname(vfsname, vfslist) - const char *vfsname; - const char **vfslist; -{ - - if (vfslist == NULL) - return (0); - while (*vfslist != NULL) { - if (strcmp(vfsname, *vfslist) == 0) - return (skipvfs); - ++vfslist; - } - return (!skipvfs); -} - -int -badvfstype(vfstype, vfslist) - int vfstype; - const char **vfslist; -{ - struct vfsconf *vfc; - vfc = getvfsbytype(vfstype); - - if ( ! vfc ) - return (0); - - return (badvfsname(vfc->vfc_name, vfslist)); -} - -const char ** -makevfslist(fslist) - char *fslist; -{ - const char **av; - int i; - char *nextcp; - - if (fslist == NULL) - return (NULL); - if (fslist[0] == 'n' && fslist[1] == 'o') { - fslist += 2; - skipvfs = 1; - } - for (i = 0, nextcp = fslist; *nextcp; nextcp++) - if (*nextcp == ',') - i++; - if ((av = malloc((size_t)(i + 2) * sizeof(char *))) == NULL) { - warn(NULL); - return (NULL); - } - nextcp = fslist; - i = 0; - av[i++] = nextcp; - while ((nextcp = strchr(nextcp, ',')) != NULL) { - *nextcp++ = '\0'; - av[i++] = nextcp; - } - av[i++] = NULL; - return (av); -} - char * catopt(s0, s1) char *s0; @@ -568,7 +536,7 @@ putfsent (ent) printf ("%s\t%s\t%s %s", ent->f_mntfromname, ent->f_mntonname, - mnttype[ent->f_type], + ent->f_fstypename, (ent->f_flags & MNT_RDONLY) ? "ro" : "rw"); if (ent->f_flags & MNT_SYNCHRONOUS) @@ -589,6 +557,9 @@ putfsent (ent) if (ent->f_flags & MNT_ASYNC) printf (",async"); + if (ent->f_flags & MNT_NOATIME) + printf (",noatime"); + if (fst = getfsspec (ent->f_mntfromname)) printf ("\t%u %u\n", fst->fs_freq, fst->fs_passno); else if (fst = getfsfile (ent->f_mntonname)) diff --git a/sbin/mount/mount_ufs.c b/sbin/mount/mount_ufs.c index fac14172ba4a..c12cccf1840d 100644 --- a/sbin/mount/mount_ufs.c +++ b/sbin/mount/mount_ufs.c @@ -38,7 +38,7 @@ static char copyright[] = #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)mount_ufs.c 8.2 (Berkeley) 3/27/94"; +static char sccsid[] = "@(#)mount_ufs.c 8.4 (Berkeley) 4/26/95"; #endif /* not lint */ #include @@ -51,6 +51,8 @@ static char sccsid[] = "@(#)mount_ufs.c 8.2 (Berkeley) 3/27/94"; #include #include +#include + #include "mntopts.h" void ufs_usage __P((void)); @@ -61,8 +63,7 @@ static struct mntopt mopts[] = { MOPT_SYNC, MOPT_FORCE, MOPT_UPDATE, - MOPT_UQUOTA, - MOPT_GQUOTA, + MOPT_FORCE, { NULL } }; @@ -75,7 +76,8 @@ mount_ufs(argc, argv) struct ufs_args args; int ch, mntflags; char *fs_name; - struct vfsconf *vfc; + struct vfsconf vfc; + int error = 0; mntflags = 0; optind = optreset = 1; /* Reset for parse of new argv. */ @@ -104,21 +106,21 @@ mount_ufs(argc, argv) else args.export.ex_flags = 0; - setvfsent(0); - if(!(vfc = getvfsbyname("ufs"))) { - if(vfsisloadable("ufs")) { - if(vfsload("ufs")) { - warn("vfsload(\"ufs\")"); - return 1; - } - endvfsent(); /* flush old table */ - vfc = getvfsbyname("ufs"); - } else { - /*warnx("ufs: filesystem not found");*/ + error = getvfsbyname("ufs", &vfc); + if (error && vfsisloadable("ufs")) { + if (vfsload("ufs")) { + warn("vfsload(ufs)"); + return (1); } + endvfsent(); /* flush old table */ + error = getvfsbyname("ufs", &vfc); + } + if (error) { + warnx("ufs filesystem is not available"); + return (1); } - if (mount(vfc ? vfc->vfc_index : MOUNT_UFS, fs_name, mntflags, &args) < 0) { + if (mount(vfc.vfc_name, fs_name, mntflags, &args) < 0) { (void)fprintf(stderr, "%s on %s: ", args.fspec, fs_name); switch (errno) { case EMFILE: diff --git a/sbin/mount_ifs/Makefile b/sbin/mount_ifs/Makefile index 6d87935d5f2c..a06b102ee7c4 100644 --- a/sbin/mount_ifs/Makefile +++ b/sbin/mount_ifs/Makefile @@ -1,8 +1,9 @@ -# @(#)Makefile 8.5 (Berkeley) 3/27/94 +# @(#)Makefile 8.6 (Berkeley) 5/8/95 PROG= mount -SRCS= mount.c mount_ufs.c getmntopts.c +SRCS= mount.c mount_ufs.c getmntopts.c vfslist.c MAN8= mount.8 # We do NOT install the getmntopts.3 man page. +CFLAGS+= -D_NEW_VFSCONF .include diff --git a/sbin/mount_ifs/getmntopts.3 b/sbin/mount_ifs/getmntopts.3 index c1bd25a227da..8424104620b6 100644 --- a/sbin/mount_ifs/getmntopts.3 +++ b/sbin/mount_ifs/getmntopts.3 @@ -29,9 +29,9 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" @(#)getmntopts.3 8.1 (Berkeley) 3/27/94 +.\" @(#)getmntopts.3 8.3 (Berkeley) 3/30/95 .\" -.Dd March 27, 1994 +.Dd March 30, 1995 .Dt GETMNTOPTS 3 .Os BSD 4.4 .Sh NAME @@ -62,7 +62,7 @@ or .Dv m_altloc field of the option's table entry) are updated. -The flag word is not initialized by +The flag words are not initialized by .Nm getmntopt . The table, .Dv mopts , @@ -154,16 +154,21 @@ struct mntopt mopts[] = { }; ... - mntflags = 0; + mntflags = mntaltflags = 0; ... - getmntopts(options, mopts, &mntflags) + getmntopts(options, mopts, &mntflags, &mntaltflags); ... .Ed .Sh DIAGNOSTICS -The +If the external integer variable +.Dv getmnt_silent +is non-zero then the .Nm getmntopts function displays an error message and exits if an unrecognized option is encountered. +By default +.Dv getmnt_silent +is zero. .Sh SEE ALSO .Xr err 3 , .Xr mount 8 diff --git a/sbin/mount_ifs/getmntopts.c b/sbin/mount_ifs/getmntopts.c index 75c75b202416..583d154f4793 100644 --- a/sbin/mount_ifs/getmntopts.c +++ b/sbin/mount_ifs/getmntopts.c @@ -32,7 +32,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)getmntopts.c 8.1 (Berkeley) 3/27/94"; +static char sccsid[] = "@(#)getmntopts.c 8.3 (Berkeley) 3/29/95"; #endif /* not lint */ #include @@ -57,7 +57,7 @@ getmntopts(options, m0, flagp, altflagp) { const struct mntopt *m; int negative, len; - char *opt, *optbuf; + char *opt, *optbuf, *p; int *thisflagp; /* Copy option string, since it is about to be torn asunder... */ @@ -72,6 +72,14 @@ getmntopts(options, m0, flagp, altflagp) } else negative = 0; + /* + * for options with assignments in them (ie. quotas) + * ignore the assignment as it's handled elsewhere + */ + p = strchr(opt, '='); + if (p) + *p = '\0'; + /* Scan option table. */ for (m = m0; m->m_option != NULL; ++m) { len = strlen(m->m_option); @@ -89,7 +97,7 @@ getmntopts(options, m0, flagp, altflagp) *thisflagp |= m->m_flag; else *thisflagp &= ~m->m_flag; - } else if(!getmnt_silent) { + } else if (!getmnt_silent) { errx(1, "-o %s: option not supported", opt); } } diff --git a/sbin/mount_ifs/mntopts.h b/sbin/mount_ifs/mntopts.h index 032d70ed5316..8ca12603d771 100644 --- a/sbin/mount_ifs/mntopts.h +++ b/sbin/mount_ifs/mntopts.h @@ -30,48 +30,48 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)mntopts.h 8.3 (Berkeley) 3/27/94 + * @(#)mntopts.h 8.7 (Berkeley) 3/29/95 */ struct mntopt { const char *m_option; /* option name */ int m_inverse; /* if a negative option, eg "dev" */ int m_flag; /* bit to set, eg. MNT_RDONLY */ - int m_altloc; /* zero if this is a real mount flag */ + int m_altloc; /* 1 => set bit in altflags */ }; /* User-visible MNT_ flags. */ #define MOPT_ASYNC { "async", 0, MNT_ASYNC, 0 } #define MOPT_NOATIME { "atime", 1, MNT_NOATIME, 0 } -#define MOPT_NOAUTO { "auto", 1, 0, 0 } #define MOPT_NODEV { "dev", 1, MNT_NODEV, 0 } #define MOPT_NOEXEC { "exec", 1, MNT_NOEXEC, 0 } #define MOPT_NOSUID { "suid", 1, MNT_NOSUID, 0 } #define MOPT_RDONLY { "rdonly", 0, MNT_RDONLY, 0 } #define MOPT_SYNC { "sync", 0, MNT_SYNCHRONOUS, 0 } #define MOPT_UNION { "union", 0, MNT_UNION, 0 } - -/* Skip this options without any action (needed for checkquota/quotaon) */ -#define MOPT_UQUOTA { "userquota", 0, 0, 0 } -#define MOPT_GQUOTA { "groupquota", 0, 0, 0 } +#define MOPT_USERQUOTA { "userquota", 0, 0, 0 } +#define MOPT_GROUPQUOTA { "groupquota", 0, 0, 0 } /* Control flags. */ #define MOPT_FORCE { "force", 0, MNT_FORCE, 0 } #define MOPT_UPDATE { "update", 0, MNT_UPDATE, 0 } - -/* Support for old-style "ro", "rw" flags. */ #define MOPT_RO { "ro", 0, MNT_RDONLY, 0 } #define MOPT_RW { "rw", 1, MNT_RDONLY, 0 } +/* This is parsed by mount(8), but is ignored by specific mount_*(8)s. */ +#define MOPT_AUTO { "auto", 0, 0, 0 } + #define MOPT_FSTAB_COMPAT \ MOPT_RO, \ - MOPT_RW + MOPT_RW, \ + MOPT_AUTO /* Standard options which all mounts can understand. */ #define MOPT_STDOPTS \ + MOPT_USERQUOTA, \ + MOPT_GROUPQUOTA, \ MOPT_FSTAB_COMPAT, \ MOPT_NOATIME, \ - MOPT_NOAUTO, \ MOPT_NODEV, \ MOPT_NOEXEC, \ MOPT_NOSUID, \ diff --git a/sbin/mount_ifs/mount.8 b/sbin/mount_ifs/mount.8 index 2961cc1b3a40..f0fd0ac64b33 100644 --- a/sbin/mount_ifs/mount.8 +++ b/sbin/mount_ifs/mount.8 @@ -29,10 +29,10 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" @(#)mount.8 8.7 (Berkeley) 3/27/94 -.\" $Id$ +.\" @(#)mount.8 8.8 (Berkeley) 6/16/94 +.\" $Id: mount.8,v 1.14 1997/02/22 14:32:43 peter Exp $ .\" -.Dd March 27, 1994 +.Dd June 16, 1994 .Dt MOUNT 8 .Os BSD 4 .Sh NAME @@ -76,10 +76,12 @@ this list is printed. The options are as follows: .Bl -tag -width indent .It Fl a -Causes all filesystems listed in -.Pa /etc/fstab -(except those with the ``noauto'' option) to be mounted. This is normally -done during system startup. +All the filesystems described in +.Xr fstab 5 +are mounted. +Exceptions are those marked as ``noauto'' or are excluded by the +.Fl t +flag (see below). .It Fl d Causes everything to be done except for the actual system call. This option is useful in conjunction with the @@ -120,6 +122,10 @@ is useful on filesystems where there are large numbers of files and performance is more critical than updating the file access time (which is rarely ever important). This option is currently only supported on local filesystems. +.It noauto +This filesystem should be skipped when mount is run with the +.Fl a +flag. .It nodev Do not interpret character or block special devices on the file system. This option is useful for a server that has file systems containing diff --git a/sbin/mount_ifs/mount.c b/sbin/mount_ifs/mount.c index 5592a632ce42..99173ea264d4 100644 --- a/sbin/mount_ifs/mount.c +++ b/sbin/mount_ifs/mount.c @@ -38,7 +38,7 @@ static char copyright[] = #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)mount.c 8.19 (Berkeley) 4/19/94"; +static char sccsid[] = "@(#)mount.c 8.25 (Berkeley) 5/8/95"; #endif /* not lint */ #include @@ -50,6 +50,7 @@ static char sccsid[] = "@(#)mount.c 8.19 (Berkeley) 4/19/94"; #include #include #include +#include #include #include #include @@ -58,22 +59,20 @@ static char sccsid[] = "@(#)mount.c 8.19 (Berkeley) 4/19/94"; #include "pathnames.h" -int debug, verbose, skipvfs; +int debug, verbose; int fstab_style = 0; -static char *mnttype[] = INITMOUNTNAMES; - -int badvfsname __P((const char *, const char **)); -int badvfstype __P((int, const char **)); +int checkvfsname __P((const char *, const char **)); char *catopt __P((char *, const char *)); struct statfs *getmntpt __P((const char *)); +int hasopt __P((const char *, const char *)); const char **makevfslist __P((char *)); void mangle __P((char *, int *, const char **)); int mountfs __P((const char *, const char *, const char *, int, const char *, const char *)); -void prmount __P((const char *, const char *, int)); +void prmount __P((struct statfs *)); void usage __P((void)); void putfsent __P((const struct statfs *)); @@ -96,7 +95,7 @@ static struct opt { { MNT_RDONLY, "read-only" }, { MNT_SYNCHRONOUS, "synchronous" }, { MNT_UNION, "union" }, - { MNT_USER, "user mount" }, + { MNT_NOATIME, "noatime" }, { NULL } }; @@ -105,7 +104,7 @@ main(argc, argv) int argc; char * const argv[]; { - const char *mntonname, **vfslist, *vfstype; + const char *mntfromname, **vfslist, *vfstype; struct fstab *fs; struct statfs *mntbuf; FILE *mountdfp; @@ -173,9 +172,9 @@ main(argc, argv) while ((fs = getfsent()) != NULL) { if (BADTYPE(fs->fs_type)) continue; - if (badvfsname(fs->fs_vfstype, vfslist)) + if (checkvfsname(fs->fs_vfstype, vfslist)) continue; - if (strstr(fs->fs_mntops, "noauto")) + if (hasopt(fs->fs_mntops, "noauto")) continue; if (mountfs(fs->fs_vfstype, fs->fs_spec, fs->fs_file, init_flags, options, @@ -186,7 +185,7 @@ main(argc, argv) if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)) == 0) err(1, "getmntinfo"); for (i = 0; i < mntsize; i++) { - if (badvfstype(mntbuf[i].f_type, vfslist)) + if (checkvfsname(mntbuf[i].f_fstypename, vfslist)) continue; putfsent (&mntbuf[i]); } @@ -195,10 +194,9 @@ main(argc, argv) if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)) == 0) err(1, "getmntinfo"); for (i = 0; i < mntsize; i++) { - if (badvfstype(mntbuf[i].f_type, vfslist)) + if (checkvfsname(mntbuf[i].f_fstypename, vfslist)) continue; - prmount(mntbuf[i].f_mntfromname, - mntbuf[i].f_mntonname, mntbuf[i].f_flags); + prmount(&mntbuf[i]); } } exit(rval); @@ -211,25 +209,23 @@ main(argc, argv) errx(1, "unknown special file or file system %s.", *argv); - if ((fs = getfsfile(mntbuf->f_mntonname)) == NULL) - errx(1, "can't find fstab entry for %s.", - *argv); - /* If it's an update, ignore the fstab file options. */ - fs->fs_mntops = NULL; - mntonname = mntbuf->f_mntonname; - } else { - if ((fs = getfsfile(*argv)) == NULL && - (fs = getfsspec(*argv)) == NULL) - errx(1, - "%s: unknown special file or file system.", - *argv); - if (BADTYPE(fs->fs_type)) - errx(1, "%s has unknown file system type.", - *argv); - mntonname = fs->fs_file; + if ((fs = getfsfile(mntbuf->f_mntonname)) != NULL) + mntfromname = fs->fs_spec; + else + mntfromname = mntbuf->f_mntfromname; + rval = mountfs(mntbuf->f_fstypename, mntfromname, + mntbuf->f_mntonname, init_flags, options, 0); + break; } - rval = mountfs(fs->fs_vfstype, fs->fs_spec, - mntonname, init_flags, options, fs->fs_mntops); + if ((fs = getfsfile(*argv)) == NULL && + (fs = getfsspec(*argv)) == NULL) + errx(1, "%s: unknown special file or file system.", + *argv); + if (BADTYPE(fs->fs_type)) + errx(1, "%s has unknown file system type.", + *argv); + rval = mountfs(fs->fs_vfstype, fs->fs_spec, fs->fs_file, + init_flags, options, fs->fs_mntops); break; case 2: /* @@ -262,6 +258,31 @@ main(argc, argv) exit(rval); } +int +hasopt(mntopts, option) + const char *mntopts, *option; +{ + int negative, found; + char *opt, *optbuf; + + if (option[0] == 'n' && option[1] == 'o') { + negative = 1; + option += 2; + } else + negative = 0; + optbuf = strdup(mntopts); + found = 0; + for (opt = optbuf; (opt = strtok(opt, ",")) != NULL; opt = NULL) { + if (opt[0] == 'n' && opt[1] == 'o') { + if (!strcasecmp(opt + 2, option)) + found = negative; + } else if (!strcasecmp(opt, option)) + found = !negative; + } + free(optbuf); + return (found); +} + int mountfs(vfstype, spec, name, flags, options, mntopts) const char *vfstype, *spec, *name, *options, *mntopts; @@ -296,12 +317,15 @@ mountfs(vfstype, spec, name, flags, options, mntopts) name = mntpath; + if (mntopts == NULL) + mntopts = ""; if (options == NULL) { - if (*mntopts == '\0') + if (*mntopts == '\0') { options = "rw"; - else + } else { options = mntopts; - mntopts = ""; + mntopts = ""; + } } optbuf = catopt(strdup(mntopts), options); @@ -387,15 +411,13 @@ mountfs(vfstype, spec, name, flags, options, mntopts) if (verbose) { if (statfs(name, &sf) < 0) { - warn("%s", name); + warn("statfs %s", name); return (1); } - if (fstab_style) - putfsent (&sf); + putfsent (&sf); else - prmount (sf.f_mntfromname, - sf.f_mntonname, sf.f_flags); + prmount(&sf); } break; } @@ -404,21 +426,29 @@ mountfs(vfstype, spec, name, flags, options, mntopts) } void -prmount(spec, name, flags) - const char *spec, *name; - int flags; +prmount(sfp) + struct statfs *sfp; { + int flags; struct opt *o; + struct passwd *pw; int f; - (void)printf("%s on %s", spec, name); + (void)printf("%s on %s", sfp->f_mntfromname, sfp->f_mntonname); - flags &= MNT_VISFLAGMASK; + flags = sfp->f_flags & MNT_VISFLAGMASK; for (f = 0, o = optnames; flags && o->o_opt; o++) if (flags & o->o_opt) { (void)printf("%s%s", !f++ ? " (" : ", ", o->o_name); flags &= ~o->o_opt; } + if (sfp->f_owner) { + (void)printf("%smounted by ", !f++ ? " (" : ", "); + if ((pw = getpwuid(sfp->f_owner)) != NULL) + (void)printf("%s", pw->pw_name); + else + (void)printf("%d", sfp->f_owner); + } (void)printf(f ? ")\n" : "\n"); } @@ -437,68 +467,6 @@ getmntpt(name) return (NULL); } -int -badvfsname(vfsname, vfslist) - const char *vfsname; - const char **vfslist; -{ - - if (vfslist == NULL) - return (0); - while (*vfslist != NULL) { - if (strcmp(vfsname, *vfslist) == 0) - return (skipvfs); - ++vfslist; - } - return (!skipvfs); -} - -int -badvfstype(vfstype, vfslist) - int vfstype; - const char **vfslist; -{ - struct vfsconf *vfc; - vfc = getvfsbytype(vfstype); - - if ( ! vfc ) - return (0); - - return (badvfsname(vfc->vfc_name, vfslist)); -} - -const char ** -makevfslist(fslist) - char *fslist; -{ - const char **av; - int i; - char *nextcp; - - if (fslist == NULL) - return (NULL); - if (fslist[0] == 'n' && fslist[1] == 'o') { - fslist += 2; - skipvfs = 1; - } - for (i = 0, nextcp = fslist; *nextcp; nextcp++) - if (*nextcp == ',') - i++; - if ((av = malloc((size_t)(i + 2) * sizeof(char *))) == NULL) { - warn(NULL); - return (NULL); - } - nextcp = fslist; - i = 0; - av[i++] = nextcp; - while ((nextcp = strchr(nextcp, ',')) != NULL) { - *nextcp++ = '\0'; - av[i++] = nextcp; - } - av[i++] = NULL; - return (av); -} - char * catopt(s0, s1) char *s0; @@ -568,7 +536,7 @@ putfsent (ent) printf ("%s\t%s\t%s %s", ent->f_mntfromname, ent->f_mntonname, - mnttype[ent->f_type], + ent->f_fstypename, (ent->f_flags & MNT_RDONLY) ? "ro" : "rw"); if (ent->f_flags & MNT_SYNCHRONOUS) @@ -589,6 +557,9 @@ putfsent (ent) if (ent->f_flags & MNT_ASYNC) printf (",async"); + if (ent->f_flags & MNT_NOATIME) + printf (",noatime"); + if (fst = getfsspec (ent->f_mntfromname)) printf ("\t%u %u\n", fst->fs_freq, fst->fs_passno); else if (fst = getfsfile (ent->f_mntonname)) diff --git a/sbin/mount_ifs/mount_ufs.c b/sbin/mount_ifs/mount_ufs.c index fac14172ba4a..c12cccf1840d 100644 --- a/sbin/mount_ifs/mount_ufs.c +++ b/sbin/mount_ifs/mount_ufs.c @@ -38,7 +38,7 @@ static char copyright[] = #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)mount_ufs.c 8.2 (Berkeley) 3/27/94"; +static char sccsid[] = "@(#)mount_ufs.c 8.4 (Berkeley) 4/26/95"; #endif /* not lint */ #include @@ -51,6 +51,8 @@ static char sccsid[] = "@(#)mount_ufs.c 8.2 (Berkeley) 3/27/94"; #include #include +#include + #include "mntopts.h" void ufs_usage __P((void)); @@ -61,8 +63,7 @@ static struct mntopt mopts[] = { MOPT_SYNC, MOPT_FORCE, MOPT_UPDATE, - MOPT_UQUOTA, - MOPT_GQUOTA, + MOPT_FORCE, { NULL } }; @@ -75,7 +76,8 @@ mount_ufs(argc, argv) struct ufs_args args; int ch, mntflags; char *fs_name; - struct vfsconf *vfc; + struct vfsconf vfc; + int error = 0; mntflags = 0; optind = optreset = 1; /* Reset for parse of new argv. */ @@ -104,21 +106,21 @@ mount_ufs(argc, argv) else args.export.ex_flags = 0; - setvfsent(0); - if(!(vfc = getvfsbyname("ufs"))) { - if(vfsisloadable("ufs")) { - if(vfsload("ufs")) { - warn("vfsload(\"ufs\")"); - return 1; - } - endvfsent(); /* flush old table */ - vfc = getvfsbyname("ufs"); - } else { - /*warnx("ufs: filesystem not found");*/ + error = getvfsbyname("ufs", &vfc); + if (error && vfsisloadable("ufs")) { + if (vfsload("ufs")) { + warn("vfsload(ufs)"); + return (1); } + endvfsent(); /* flush old table */ + error = getvfsbyname("ufs", &vfc); + } + if (error) { + warnx("ufs filesystem is not available"); + return (1); } - if (mount(vfc ? vfc->vfc_index : MOUNT_UFS, fs_name, mntflags, &args) < 0) { + if (mount(vfc.vfc_name, fs_name, mntflags, &args) < 0) { (void)fprintf(stderr, "%s on %s: ", args.fspec, fs_name); switch (errno) { case EMFILE: -- cgit v1.2.3