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>