Date: Mon, 25 May 1998 02:50:01 -0700 (PDT) From: David Malone <dwmalone@maths.tcd.ie> To: freebsd-bugs@FreeBSD.ORG Subject: Re: bin/6399: When using "-u" mount doesn't start from the fstab options. Message-ID: <199805250950.CAA04104@freefall.freebsd.org>
index | next in thread | raw e-mail
The following reply was made to PR bin/6399; it has been noted by GNATS.
From: David Malone <dwmalone@maths.tcd.ie>
To: freebsd-gnats-submit@freebsd.org, dwmalone@maths.tcd.ie
Cc: Subject: Re: bin/6399: When using "-u" mount doesn't start from the fstab options.
Date: Mon, 25 May 1998 10:52:06 +0100
I've done some diffs for current which provide exactly the same
features as the one for stable. They are really just a by hand application
of the patch for stable.
David.
==============================================================================
*** mount.c 1998/03/08 09:56:02 1.23
--- mount.c 1998/05/25 09:38:50
***************
*** 73,83 ****
--- 73,86 ----
int ismounted __P((struct fstab *, struct statfs *, int));
int isremountable __P((const char *));
void mangle __P((char *, int *, const char **));
+ char *update_options __P((char *,char *,int));
int mountfs __P((const char *, const char *, const char *,
int, const char *, const char *));
+ void remopt __P((char *,const char *));
void prmount __P((struct statfs *));
void putfsent __P((const struct statfs *));
void usage __P((void));
+ char *flags2opts __P((int));
/* Map from mount otions to printable formats. */
static struct opt {
***************
*** 227,232 ****
--- 230,236 ----
mntfromname = fs->fs_spec;
else
mntfromname = mntbuf->f_mntfromname;
+ options = update_options(options,fs->fs_mntops,mntbuf->f_flags);
rval = mountfs(mntbuf->f_fstypename, mntfromname,
mntbuf->f_mntonname, init_flags, options, 0);
break;
***************
*** 563,568 ****
--- 567,642 ----
*argcp = argc;
}
+
+ char *
+ update_options(opts, fstab, curflags)
+ char *opts;
+ char *fstab;
+ int curflags;
+ {
+ char *o,*p;
+ char *cur;
+ char *expopt, *newopt, *tmpopt;
+
+ if(opts == NULL)
+ return strdup("");
+
+ remopt(fstab,"fstab");
+ remopt(fstab,"cur");
+ cur = flags2opts(curflags);
+
+ expopt = NULL;
+ for ( p = opts; (o = strsep(&p, ",")) != NULL; ) {
+ if (strcmp("fstab",o) == 0)
+ expopt = catopt(expopt,fstab);
+ else if (strcmp("cur",o) == 0)
+ expopt = catopt(expopt,cur);
+ else
+ expopt = catopt(expopt,o);
+ }
+ free(cur);
+ free(opts);
+
+ newopt = NULL;
+ for ( p = expopt; (o = strsep(&p, ",")) != NULL; ) {
+ if ( (tmpopt = malloc( strlen(o) + 2 + 1 )) == NULL)
+ err(1,NULL);
+
+ strcpy(tmpopt,"no");
+ strcat(tmpopt,o);
+ remopt(newopt,tmpopt);
+ free(tmpopt);
+
+ if (strncmp("no",o,2) == 0) remopt(newopt,o+2);
+ newopt = catopt(newopt,o);
+ }
+ free(expopt);
+
+ return newopt;
+ }
+
+ void
+ remopt(string,opt)
+ char *string;
+ const char *opt;
+ {
+ char *o,*p,*r;
+
+ if (string == NULL || *string == '\0' || opt == NULL || *opt == '\0')
+ return;
+
+ r = string;
+
+ for ( p = string; (o = strsep(&p, ",")) != NULL; ) {
+ if ( strcmp(opt,o) != 0 ) {
+ if (*r == ',' && *o != '\0') r++;
+ while( (*r++ = *o++) != '\0' );
+ *--r = ',';
+ }
+ }
+ *r = '\0';
+ }
+
void
usage()
{
***************
*** 581,611 ****
const struct statfs *ent;
{
struct fstab *fst;
printf("%s\t%s\t%s %s", ent->f_mntfromname, ent->f_mntonname,
! ent->f_fstypename, (ent->f_flags & MNT_RDONLY) ? "ro" : "rw");
/* XXX should use optnames[] - put shorter names in it. */
- 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 (ent->f_flags & MNT_NOATIME)
- printf(",noatime");
- if (ent->f_flags & MNT_NOCLUSTERR)
- printf(",noclusterr");
- if (ent->f_flags & MNT_NOCLUSTERW)
- printf(",noclusterw");
- if (ent->f_flags & MNT_SUIDDIR)
- printf(",suiddir");
if ((fst = getfsspec(ent->f_mntfromname)))
printf("\t%u %u\n", fst->fs_freq, fst->fs_passno);
--- 655,668 ----
const struct statfs *ent;
{
struct fstab *fst;
+ char *opts;
+ opts = flags2opts(ent->f_flags);
printf("%s\t%s\t%s %s", ent->f_mntfromname, ent->f_mntonname,
! ent->f_fstypename, opts);
! free(opts);
/* XXX should use optnames[] - put shorter names in it. */
if ((fst = getfsspec(ent->f_mntfromname)))
printf("\t%u %u\n", fst->fs_freq, fst->fs_passno);
***************
*** 615,618 ****
--- 672,698 ----
printf("\t1 1\n");
else
printf("\t0 0\n");
+ }
+
+
+ char *
+ flags2opts(flags)
+ int flags;
+ {
+ char *res;
+
+ res = NULL;
+
+ res = catopt(res,(flags & MNT_RDONLY) ? "ro" : "rw");
+
+ if (flags & MNT_SYNCHRONOUS) res = catopt(res, "sync");
+ if (flags & MNT_NOEXEC) res = catopt(res, "noexec");
+ if (flags & MNT_NOSUID) res = catopt(res, "nosuid");
+ if (flags & MNT_NODEV) res = catopt(res, "nodev");
+ if (flags & MNT_UNION) res = catopt(res, "union");
+ if (flags & MNT_ASYNC) res = catopt(res, "async");
+ if (flags & MNT_NOATIME) res = catopt(res, "noatime");
+ if (flags & MNT_NOCLUSTERR) res = catopt(res, "noclusterr");
+ if (flags & MNT_NOCLUSTERW) res = catopt(res, "noclusterw");
+ if (flags & MNT_SUIDDIR) res = catopt(res, "suiddir");
}
*** mount.8 1997/12/01 00:44:16 1.21
--- mount.8 1998/05/25 09:45:31
***************
*** 112,123 ****
--- 112,136 ----
flag to set,
and should not be used unless you are prepared to recreate the file
system should your system crash.
+ .It cur
+ When using the
+ .Fl u
+ flag this is the same as giving the options currently in effect. To
+ see what these options are you can use the
+ .Fl p
+ flag.
.It force
The same as
.Fl f ;
forces the revocation of write access when trying to downgrade
a filesystem mount status from read-write to read-only. Also
forces the R/W mount of an unclean filesystem (dangerous; use with caution).
+ .It fstab
+ When using the
+ .Fl u
+ this is the same as giving all the options listed in the
+ .Xr fstab 5
+ file for the filesystem.
.It noatime
Do not update the file access time when reading from a file. This option
is useful on filesystems where there are large numbers of files and
***************
*** 284,296 ****
files on the filesystem are currently open for writing unless the
.Fl f
flag is also specified.
! The set of options is determined by first extracting the options
! for the file system from the
! .Xr fstab 5
! table,
! then applying any options specified by the
! .Fl o
argument,
and finally applying the
.Fl r
or
--- 297,306 ----
files on the filesystem are currently open for writing unless the
.Fl f
flag is also specified.
! The set of options is determined by
! applying any options specified by the
argument,
+ .Fl o
and finally applying the
.Fl r
or
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199805250950.CAA04104>
