Skip site navigation (1)Skip section navigation (2)
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>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199805250950.CAA04104>