sbin/mount_msdos: Bring in FreeBSD/Git 0c5ae3a9 (add -M option)
authorTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Tue, 10 Sep 2019 15:06:26 +0000 (00:06 +0900)
committerTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Tue, 10 Sep 2019 16:38:07 +0000 (01:38 +0900)
sbin/mount_msdos/Makefile
sbin/mount_msdos/mount_msdos.8
sbin/mount_msdos/mount_msdos.c
sys/vfs/msdosfs/msdosfs_vfsops.c
sys/vfs/msdosfs/msdosfs_vnops.c
sys/vfs/msdosfs/msdosfsmount.h

index ee746e8..f4ce242 100644 (file)
@@ -4,6 +4,7 @@
 
 PROG=  mount_msdos
 MAN=   mount_msdos.8
+CFLAGS+= -I${.CURDIR}/../../sys
 DPADD= ${LIBUTIL} ${LIBKICONV}
 LDADD= -lutil -lkiconv
 
index 0103381..024abcf 100644 (file)
@@ -30,7 +30,7 @@
 .\"
 .\" $FreeBSD: src/sbin/mount_msdos/mount_msdos.8,v 1.19.2.1 2000/12/08 14:03:59 ru Exp $
 .\"
-.Dd September 29, 2016
+.Dd September 10, 2019
 .Dt MOUNT_MSDOS 8
 .Os
 .Sh NAME
@@ -43,6 +43,7 @@
 .Op Fl g Ar gid
 .Op Fl L Ar locale
 .Op Fl m Ar mask
+.Op Fl M Ar mask
 .Op Fl o Ar options
 .Op Fl u Ar uid
 .\".Op Fl G
@@ -104,10 +105,24 @@ for more information about octal file modes.)
 Only the nine low-order bits of
 .Ar mask
 are used.
+The value of
+.Ar -M
+is used if it is supplied and
+.Ar -m
+is omitted.
 The default
 .Ar mask
 is taken from the
 directory on which the file system is being mounted.
+.It Fl M Ar mask
+Specify the maximum file permissions for directories
+in the file system.
+The value of
+.Ar -m
+is used if it is supplied and
+.Ar -M
+is omitted.
+See the previous option's description for details.
 .It Fl s
 Force behaviour to
 ignore and not generate Win'95 long filenames.
index d02fd4f..d6c7502 100644 (file)
@@ -56,7 +56,7 @@
 
 /*
  * XXX - no way to specify "foo=<bar>"-type options; that's what we'd
- * want for "-u", "-g", "-m", "-L", and "-D".
+ * want for "-u", "-g", "-m", "-M", "-L", and "-D".
  */
 static struct mntopt mopts[] = {
        MOPT_STDOPTS,
@@ -80,17 +80,17 @@ main(int argc, char **argv)
 {
        struct msdosfs_args args;
        struct stat sb;
-       int c, error, mntflags, set_gid, set_uid, set_mask;
+       int c, error, mntflags, set_gid, set_uid, set_mask, set_dirmask;
        char *dev, *dir, mntpath[MAXPATHLEN], *csp;
        const char *quirk = NULL;
        char *cs_local = NULL;
        char *cs_dos = NULL;
        struct vfsconf vfc;
-       mntflags = set_gid = set_uid = set_mask = 0;
+       mntflags = set_gid = set_uid = set_mask = set_dirmask = 0;
        memset(&args, '\0', sizeof(args));
        args.magic = MSDOSFS_ARGSMAGIC;
 
-       while ((c = getopt(argc, argv, "sl9u:g:m:o:L:D:")) != -1) {
+       while ((c = getopt(argc, argv, "sl9u:g:m:M:o:L:D:")) != -1) {
                switch (c) {
                case 's':
                        args.flags |= MSDOSFSMNT_SHORTNAME;
@@ -113,6 +113,10 @@ main(int argc, char **argv)
                        args.mask = a_mask(optarg);
                        set_mask = 1;
                        break;
+               case 'M':
+                       args.dirmask = a_mask(optarg);
+                       set_dirmask = 1;
+                       break;
                case 'L':
                        if (setlocale(LC_CTYPE, optarg) == NULL)
                                err(EX_CONFIG, "%s", optarg);
@@ -141,6 +145,15 @@ main(int argc, char **argv)
        if (optind + 2 != argc)
                usage();
 
+       if (set_mask && !set_dirmask) {
+               args.dirmask = args.mask;
+               set_dirmask = 1;
+       }
+       else if (set_dirmask && !set_mask) {
+               args.mask = args.dirmask;
+               set_mask = 1;
+       }
+
        dev = argv[optind];
        dir = argv[optind + 1];
 
@@ -175,7 +188,8 @@ main(int argc, char **argv)
                if (!set_gid)
                        args.gid = sb.st_gid;
                if (!set_mask)
-                       args.mask = sb.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO);
+                       args.mask = args.dirmask =
+                               sb.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO);
        }
 
        error = getvfsbyname("msdos", &vfc);
@@ -252,9 +266,10 @@ a_mask(char *s)
 static void
 usage(void)
 {
-       fprintf(stderr, "%s\n%s\n",
+       fprintf(stderr, "%s\n%s\n%s\n",
            "usage: mount_msdos [-9ls] [-D DOS_codepage] [-g gid] [-L locale]",
-           "                   [-m mask] [-o options] [-u uid] special node");
+           "                   [-M mask] [-m mask] [-o options] [-u uid]",
+           "                   special node");
        exit(EX_USAGE);
 }
 
index 07edb55..d218574 100644 (file)
@@ -110,6 +110,7 @@ update_mp(struct mount *mp, struct msdosfs_args *argp)
        pmp->pm_gid = argp->gid;
        pmp->pm_uid = argp->uid;
        pmp->pm_mask = argp->mask & ALLPERMS;
+       pmp->pm_dirmask = argp->dirmask & ALLPERMS;
        pmp->pm_flags |= argp->flags & MSDOSFSMNT_MNTOPT;
 
        if (pmp->pm_flags & MSDOSFSMNT_KICONV && msdos_iconv) {
index 9b1e2b6..e43e38f 100644 (file)
@@ -208,7 +208,7 @@ msdosfs_access(struct vop_access_args *ap)
        file_mode = (S_IXUSR|S_IXGRP|S_IXOTH) | (S_IRUSR|S_IRGRP|S_IROTH) |
            ((dep->de_Attributes & ATTR_READONLY) ?
            0 : (S_IWUSR|S_IWGRP|S_IWOTH));
-       file_mode &= pmp->pm_mask;
+       file_mode &= (ap->a_vp->v_type == VDIR ? pmp->pm_dirmask : pmp->pm_mask);
 
        return (vop_helper_access(ap, pmp->pm_uid, pmp->pm_gid, file_mode, 0));
 }
@@ -247,7 +247,8 @@ msdosfs_getattr(struct vop_getattr_args *ap)
                mode = S_IRWXU|S_IRWXG|S_IRWXO;
        else
                mode = S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
-       vap->va_mode = mode & pmp->pm_mask;
+       vap->va_mode = mode &
+               (ap->a_vp->v_type == VDIR ? pmp->pm_dirmask : pmp->pm_mask);
        vap->va_uid = pmp->pm_uid;
        vap->va_gid = pmp->pm_gid;
        vap->va_nlink = 1;
index 849cb87..83bd8f0 100644 (file)
@@ -71,6 +71,8 @@ struct msdosfsmount {
        gid_t pm_gid;           /* gid to set as owner of the files */
        mode_t pm_mask;         /* mask to and with file protection bits
                                   for files */
+       mode_t pm_dirmask;      /* mask to and with file protection bits
+                                  for directories */
        struct vnode *pm_devvp; /* vnode for character device mounted */
        cdev_t pm_dev;          /* character device mounted */
        struct bpb50 pm_bpb;    /* BIOS parameter blk for this fs */
@@ -245,6 +247,7 @@ struct msdosfs_args {
        uid_t   uid;            /* uid that owns msdosfs files */
        gid_t   gid;            /* gid that owns msdosfs files */
        mode_t  mask;           /* file mask to be applied for msdosfs perms */
+       mode_t  dirmask;        /* dir  mask to be applied for msdosfs perms */
        int     flags;          /* see below */
        int magic;              /* version number */
         char cs_local[ICONV_CSNMAXLEN];