From a257a45ecda24aa005137216eebc9d64a6bab335 Mon Sep 17 00:00:00 2001 From: "Jordan K. Hubbard" Date: Sun, 21 Jul 1996 23:34:04 +0000 Subject: [PATCH] I have added a new option -p to the mount command. This was inspired by SunOS version of mount which uses option -p to indicate that the mount information should be printed in fstab format. This is a neat way to create a new fstab file to use later when one has modified the mount points or mount options or added or removed mount some mount points. You just type mount -p > /etc/fstab.new and there is your new fstab file ready to be used though you will of course have to add any necessary noauto flags manually. [Committers note: This also seems to do the wrong thing for AMD mounts, but in the more average case this is a nifty feature nonetheless and one can always edit the bogus entries out] Submitted-By: Jukka Ukkonen --- sbin/mount/mount.8 | 10 ++++-- sbin/mount/mount.c | 71 +++++++++++++++++++++++++++++++++++++++--- sbin/mount_ifs/mount.8 | 10 ++++-- sbin/mount_ifs/mount.c | 71 +++++++++++++++++++++++++++++++++++++++--- 4 files changed, 146 insertions(+), 16 deletions(-) diff --git a/sbin/mount/mount.8 b/sbin/mount/mount.8 index b141b751836c..365407546020 100644 --- a/sbin/mount/mount.8 +++ b/sbin/mount/mount.8 @@ -39,13 +39,13 @@ .Nd mount file systems .Sh SYNOPSIS .Nm mount -.Op Fl adfruvw +.Op Fl adfpruvw .Op Fl t Ar ufs | lfs | external_type .Nm mount -.Op Fl dfruvw +.Op Fl dfpruvw .Ar special | node .Nm mount -.Op Fl dfruvw +.Op Fl dfpruvw .Op Fl o Ar options .Op Fl t Ar ufs | lfs | external_type .Ar special node @@ -167,6 +167,10 @@ to execute the equivalent of: .Bd -literal -offset indent /sbin/mount_mfs -o nosuid -N -s 4000 /dev/dk0b /tmp .Ed +.It Fl p +Print mount information in fstab format. Implies also the +.Fl v +option. .It Fl r The file system is to be mounted read-only. Mount the file system read-only (even the super-user may not write it). diff --git a/sbin/mount/mount.c b/sbin/mount/mount.c index 5dbe573bbde0..286c2a0918c0 100644 --- a/sbin/mount/mount.c +++ b/sbin/mount/mount.c @@ -59,6 +59,9 @@ static char sccsid[] = "@(#)mount.c 8.19 (Berkeley) 4/19/94"; #include "pathnames.h" int debug, verbose, skipvfs; +int fstab_style = 0; + +static char *mnttype[] = INITMOUNTNAMES; int badvfsname __P((const char *, const char **)); int badvfstype __P((int, const char **)); @@ -72,6 +75,7 @@ int mountfs __P((const char *, const char *, const char *, int, const char *, const char *)); void prmount __P((const char *, const char *, int)); void usage __P((void)); +void putfsent __P((const struct statfs *)); /* From mount_ufs.c. */ int mount_ufs __P((int, char * const *)); @@ -112,8 +116,12 @@ main(argc, argv) options = NULL; vfslist = NULL; vfstype = "ufs"; - while ((ch = getopt(argc, argv, "adfo:rwt:uv")) != EOF) + while ((ch = getopt(argc, argv, "padfo:rwt:uv")) != EOF) switch (ch) { + case 'p': + fstab_style = 1; + verbose = 1; + break; case 'a': all = 1; break; @@ -173,6 +181,15 @@ main(argc, argv) fs->fs_mntops)) rval = 1; } + else if (fstab_style) { + if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)) == 0) + err(1, "getmntinfo"); + for (i = 0; i < mntsize; i++) { + if (badvfstype(mntbuf[i].f_type, vfslist)) + continue; + putfsent (&mntbuf[i]); + } + } else { if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)) == 0) err(1, "getmntinfo"); @@ -372,7 +389,12 @@ mountfs(vfstype, spec, name, flags, options, mntopts) warn("%s", name); return (1); } - prmount(sf.f_mntfromname, sf.f_mntonname, sf.f_flags); + + if (fstab_style) + putfsent (&sf); + else + prmount (sf.f_mntfromname, + sf.f_mntonname, sf.f_flags); } break; } @@ -530,9 +552,48 @@ usage() (void)fprintf(stderr, "usage: mount %s %s\n mount %s\n mount %s\n", - "[-dfruvw] [-o options] [-t ufs | external_type]", + "[-dfpruvw] [-o options] [-t ufs | external_type]", "special node", - "[-adfruvw] [-t ufs | external_type]", - "[-dfruvw] special | node"); + "[-adfpruvw] [-t ufs | external_type]", + "[-dfpruvw] special | node"); exit(1); } + +void +putfsent (ent) + const struct statfs *ent; +{ + struct fstab *fst; + + printf ("%s\t%s\t%s %s", + ent->f_mntfromname, ent->f_mntonname, + mnttype[ent->f_type], + (ent->f_flags & MNT_RDONLY) ? "ro" : "rw"); + + if (ent->f_flags & MNT_SYNCHRONOUS) + printf (",sync"); + + if (ent->f_flags & MNT_NOEXEC) + printf (",noexec"); + + if (ent->f_flags & MNT_NOSUID) + printf (",nosuid"); + + if (ent->f_flags & MNT_NODEV) + printf (",nodev"); + + if (ent->f_flags & MNT_UNION) + printf (",union"); + + if (ent->f_flags & MNT_ASYNC) + printf (",async"); + + if (fst = getfsspec (ent->f_mntfromname)) + printf ("\t%u %u\n", fst->fs_freq, fst->fs_passno); + else if (fst = getfsfile (ent->f_mntonname)) + printf ("\t%u %u\n", fst->fs_freq, fst->fs_passno); + else if (ent->f_type == MOUNT_UFS) + printf ("\t1 1\n"); + else + printf ("\t0 0\n"); +} diff --git a/sbin/mount_ifs/mount.8 b/sbin/mount_ifs/mount.8 index b141b751836c..365407546020 100644 --- a/sbin/mount_ifs/mount.8 +++ b/sbin/mount_ifs/mount.8 @@ -39,13 +39,13 @@ .Nd mount file systems .Sh SYNOPSIS .Nm mount -.Op Fl adfruvw +.Op Fl adfpruvw .Op Fl t Ar ufs | lfs | external_type .Nm mount -.Op Fl dfruvw +.Op Fl dfpruvw .Ar special | node .Nm mount -.Op Fl dfruvw +.Op Fl dfpruvw .Op Fl o Ar options .Op Fl t Ar ufs | lfs | external_type .Ar special node @@ -167,6 +167,10 @@ to execute the equivalent of: .Bd -literal -offset indent /sbin/mount_mfs -o nosuid -N -s 4000 /dev/dk0b /tmp .Ed +.It Fl p +Print mount information in fstab format. Implies also the +.Fl v +option. .It Fl r The file system is to be mounted read-only. Mount the file system read-only (even the super-user may not write it). diff --git a/sbin/mount_ifs/mount.c b/sbin/mount_ifs/mount.c index 5dbe573bbde0..286c2a0918c0 100644 --- a/sbin/mount_ifs/mount.c +++ b/sbin/mount_ifs/mount.c @@ -59,6 +59,9 @@ static char sccsid[] = "@(#)mount.c 8.19 (Berkeley) 4/19/94"; #include "pathnames.h" int debug, verbose, skipvfs; +int fstab_style = 0; + +static char *mnttype[] = INITMOUNTNAMES; int badvfsname __P((const char *, const char **)); int badvfstype __P((int, const char **)); @@ -72,6 +75,7 @@ int mountfs __P((const char *, const char *, const char *, int, const char *, const char *)); void prmount __P((const char *, const char *, int)); void usage __P((void)); +void putfsent __P((const struct statfs *)); /* From mount_ufs.c. */ int mount_ufs __P((int, char * const *)); @@ -112,8 +116,12 @@ main(argc, argv) options = NULL; vfslist = NULL; vfstype = "ufs"; - while ((ch = getopt(argc, argv, "adfo:rwt:uv")) != EOF) + while ((ch = getopt(argc, argv, "padfo:rwt:uv")) != EOF) switch (ch) { + case 'p': + fstab_style = 1; + verbose = 1; + break; case 'a': all = 1; break; @@ -173,6 +181,15 @@ main(argc, argv) fs->fs_mntops)) rval = 1; } + else if (fstab_style) { + if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)) == 0) + err(1, "getmntinfo"); + for (i = 0; i < mntsize; i++) { + if (badvfstype(mntbuf[i].f_type, vfslist)) + continue; + putfsent (&mntbuf[i]); + } + } else { if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)) == 0) err(1, "getmntinfo"); @@ -372,7 +389,12 @@ mountfs(vfstype, spec, name, flags, options, mntopts) warn("%s", name); return (1); } - prmount(sf.f_mntfromname, sf.f_mntonname, sf.f_flags); + + if (fstab_style) + putfsent (&sf); + else + prmount (sf.f_mntfromname, + sf.f_mntonname, sf.f_flags); } break; } @@ -530,9 +552,48 @@ usage() (void)fprintf(stderr, "usage: mount %s %s\n mount %s\n mount %s\n", - "[-dfruvw] [-o options] [-t ufs | external_type]", + "[-dfpruvw] [-o options] [-t ufs | external_type]", "special node", - "[-adfruvw] [-t ufs | external_type]", - "[-dfruvw] special | node"); + "[-adfpruvw] [-t ufs | external_type]", + "[-dfpruvw] special | node"); exit(1); } + +void +putfsent (ent) + const struct statfs *ent; +{ + struct fstab *fst; + + printf ("%s\t%s\t%s %s", + ent->f_mntfromname, ent->f_mntonname, + mnttype[ent->f_type], + (ent->f_flags & MNT_RDONLY) ? "ro" : "rw"); + + if (ent->f_flags & MNT_SYNCHRONOUS) + printf (",sync"); + + if (ent->f_flags & MNT_NOEXEC) + printf (",noexec"); + + if (ent->f_flags & MNT_NOSUID) + printf (",nosuid"); + + if (ent->f_flags & MNT_NODEV) + printf (",nodev"); + + if (ent->f_flags & MNT_UNION) + printf (",union"); + + if (ent->f_flags & MNT_ASYNC) + printf (",async"); + + if (fst = getfsspec (ent->f_mntfromname)) + printf ("\t%u %u\n", fst->fs_freq, fst->fs_passno); + else if (fst = getfsfile (ent->f_mntonname)) + printf ("\t%u %u\n", fst->fs_freq, fst->fs_passno); + else if (ent->f_type == MOUNT_UFS) + printf ("\t1 1\n"); + else + printf ("\t0 0\n"); +}