summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortedu <tedu@openbsd.org>2003-04-18 22:12:25 +0000
committertedu <tedu@openbsd.org>2003-04-18 22:12:25 +0000
commite8b9805c5efd4274c44e7ff0d253bc0ead1936e1 (patch)
treefe48e9da0fabde1cad8b137db0b6758d693a06bd
parentregression test for mquery syscall. (diff)
downloadwireguard-openbsd-e8b9805c5efd4274c44e7ff0d253bc0ead1936e1.tar.xz
wireguard-openbsd-e8b9805c5efd4274c44e7ff0d253bc0ead1936e1.zip
support for making directories +x without affecting normal files
ok millert@
-rw-r--r--sys/msdosfs/msdosfs_vnops.c18
-rw-r--r--sys/msdosfs/msdosfsmount.h13
-rw-r--r--sys/sys/mount.h11
3 files changed, 28 insertions, 14 deletions
diff --git a/sys/msdosfs/msdosfs_vnops.c b/sys/msdosfs/msdosfs_vnops.c
index 6058f707133..c71ae50a164 100644
--- a/sys/msdosfs/msdosfs_vnops.c
+++ b/sys/msdosfs/msdosfs_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: msdosfs_vnops.c,v 1.37 2002/05/24 08:54:24 art Exp $ */
+/* $OpenBSD: msdosfs_vnops.c,v 1.38 2003/04/18 22:12:25 tedu Exp $ */
/* $NetBSD: msdosfs_vnops.c,v 1.63 1997/10/17 11:24:19 ws Exp $ */
/*-
@@ -238,6 +238,12 @@ msdosfs_access(v)
if ((dep->de_Attributes & ATTR_READONLY) == 0)
dosmode |= (S_IWUSR|S_IWGRP|S_IWOTH);
dosmode &= pmp->pm_mask;
+ if (dep->de_Attributes & ATTR_DIRECTORY
+ && pmp->pm_flags & MSDOSFSMNT_ALLOWDIRX) {
+ dosmode |= (dosmode & S_IRUSR) ? S_IXUSR : 0;
+ dosmode |= (dosmode & S_IRGRP) ? S_IXGRP : 0;
+ dosmode |= (dosmode & S_IROTH) ? S_IXOTH : 0;
+ }
return (vaccess(dosmode, pmp->pm_uid, pmp->pm_gid, ap->a_mode,
ap->a_cred));
@@ -280,10 +286,16 @@ msdosfs_getattr(v)
}
vap->va_fileid = fileid;
vap->va_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));
+ ((dep->de_Attributes & ATTR_READONLY) ? 0 : (S_IWUSR|S_IWGRP|S_IWOTH));
vap->va_mode &= dep->de_pmp->pm_mask;
- if (dep->de_Attributes & ATTR_DIRECTORY)
+ if (dep->de_Attributes & ATTR_DIRECTORY) {
vap->va_mode |= S_IFDIR;
+ if (pmp->pm_flags & MSDOSFSMNT_ALLOWDIRX) {
+ vap->va_mode |= (vap->va_mode & S_IRUSR) ? S_IXUSR : 0;
+ vap->va_mode |= (vap->va_mode & S_IRGRP) ? S_IXGRP : 0;
+ vap->va_mode |= (vap->va_mode & S_IROTH) ? S_IXOTH : 0;
+ }
+ }
vap->va_nlink = 1;
vap->va_gid = dep->de_pmp->pm_gid;
vap->va_uid = dep->de_pmp->pm_uid;
diff --git a/sys/msdosfs/msdosfsmount.h b/sys/msdosfs/msdosfsmount.h
index 8a0020c2731..1008bf2bd0f 100644
--- a/sys/msdosfs/msdosfsmount.h
+++ b/sys/msdosfs/msdosfsmount.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: msdosfsmount.h,v 1.13 2002/03/14 01:27:09 millert Exp $ */
+/* $OpenBSD: msdosfsmount.h,v 1.14 2003/04/18 22:12:25 tedu Exp $ */
/* $NetBSD: msdosfsmount.h,v 1.16 1997/10/17 11:24:24 ws Exp $ */
/*-
@@ -93,16 +93,17 @@ struct msdosfsmount {
*/
#if 0
/* Defined in <sys/mount.h> */
-#define MSDOSFSMNT_SHORTNAME 1
-#define MSDOSFSMNT_LONGNAME 2
-#define MSDOSFSMNT_NOWIN95 4
-#define MSDOSFSMNT_GEMDOSFS 8
+#define MSDOSFSMNT_SHORTNAME 0x01
+#define MSDOSFSMNT_LONGNAME 0x02
+#define MSDOSFSMNT_NOWIN95 0x04
+#define MSDOSFSMNT_GEMDOSFS 0x08
+#define MSDOSFSMNT_ALLOWDIRX 0x10
#endif
/* All flags above: */
#define MSDOSFSMNT_MNTOPT \
(MSDOSFSMNT_SHORTNAME|MSDOSFSMNT_LONGNAME|MSDOSFSMNT_NOWIN95 \
- |MSDOSFSMNT_GEMDOSFS)
+ |MSDOSFSMNT_GEMDOSFS|MSDOSFSMNT_ALLOWDIRX)
#define MSDOSFSMNT_RONLY 0x80000000 /* mounted read-only */
#define MSDOSFSMNT_WAITONFAT 0x40000000 /* mounted synchronous */
#define MSDOSFS_FATMIRROR 0x20000000 /* FAT is mirrored */
diff --git a/sys/sys/mount.h b/sys/sys/mount.h
index be6632b1935..6741a53bee7 100644
--- a/sys/sys/mount.h
+++ b/sys/sys/mount.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: mount.h,v 1.49 2003/02/24 02:17:22 deraadt Exp $ */
+/* $OpenBSD: mount.h,v 1.50 2003/04/18 22:12:25 tedu Exp $ */
/* $NetBSD: mount.h,v 1.48 1996/02/18 11:55:47 fvdl Exp $ */
/*
@@ -219,10 +219,11 @@ struct msdosfs_args {
/*
* Msdosfs mount options:
*/
-#define MSDOSFSMNT_SHORTNAME 1 /* Force old DOS short names only */
-#define MSDOSFSMNT_LONGNAME 2 /* Force Win'95 long names */
-#define MSDOSFSMNT_NOWIN95 4 /* Completely ignore Win95 entries */
-#define MSDOSFSMNT_GEMDOSFS 8 /* This is a gemdos-flavour */
+#define MSDOSFSMNT_SHORTNAME 0x01 /* Force old DOS short names only */
+#define MSDOSFSMNT_LONGNAME 0x02 /* Force Win'95 long names */
+#define MSDOSFSMNT_NOWIN95 0x04 /* Completely ignore Win95 entries */
+#define MSDOSFSMNT_GEMDOSFS 0x08 /* This is a gemdos-flavour */
+#define MSDOSFSMNT_ALLOWDIRX 0x10 /* dir is mode +x if r */
/*
* Arguments to mount amigados filesystems.