msdosfs: refactor vop_access to use vop_helper_access
authorNicolas Thery <nthery@gmail.com>
Wed, 19 Aug 2009 05:27:40 +0000 (07:27 +0200)
committerNicolas Thery <nthery@gmail.com>
Sun, 23 Aug 2009 06:59:48 +0000 (08:59 +0200)
sys/vfs/msdosfs/msdosfs_vnops.c

index 14e54db..7b7f76c 100644 (file)
@@ -242,73 +242,16 @@ msdosfs_close(struct vop_close_args *ap)
 static int
 msdosfs_access(struct vop_access_args *ap)
 {
-       struct vnode *vp = ap->a_vp;
        struct denode *dep = VTODE(ap->a_vp);
        struct msdosfsmount *pmp = dep->de_pmp;
-       struct ucred *cred = ap->a_cred;
-       mode_t mask, file_mode, mode = ap->a_mode;
-       gid_t *gp;
-       int i;
+       mode_t file_mode;
 
        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));
+           ((dep->de_Attributes & ATTR_READONLY) ? 
+               0 : (S_IWUSR|S_IWGRP|S_IWOTH));
        file_mode &= pmp->pm_mask;
 
-       /*
-        * Disallow write attempts on read-only file systems;
-        * unless the file is a socket, fifo, or a block or
-        * character device resident on the file system.
-        */
-       if (mode & VWRITE) {
-               switch (vp->v_type) {
-               case VDIR:
-               case VLNK:
-               case VREG:
-                       if (vp->v_mount->mnt_flag & MNT_RDONLY)
-                               return (EROFS);
-                       break;
-               default:
-                       break;
-               }
-       }
-
-       /* User id 0 always gets access. */
-       if (cred->cr_uid == 0)
-               return 0;
-
-       mask = 0;
-
-       /* Otherwise, check the owner. */
-       if (cred->cr_uid == pmp->pm_uid) {
-               if (mode & VEXEC)
-                       mask |= S_IXUSR;
-               if (mode & VREAD)
-                       mask |= S_IRUSR;
-               if (mode & VWRITE)
-                       mask |= S_IWUSR;
-               return (file_mode & mask) == mask ? 0 : EACCES;
-       }
-
-       /* Otherwise, check the groups. */
-       for (i = 0, gp = cred->cr_groups; i < cred->cr_ngroups; i++, gp++)
-               if (pmp->pm_gid == *gp) {
-                       if (mode & VEXEC)
-                               mask |= S_IXGRP;
-                       if (mode & VREAD)
-                               mask |= S_IRGRP;
-                       if (mode & VWRITE)
-                               mask |= S_IWGRP;
-                       return (file_mode & mask) == mask ? 0 : EACCES;
-               }
-
-       /* Otherwise, check everyone else. */
-       if (mode & VEXEC)
-               mask |= S_IXOTH;
-       if (mode & VREAD)
-               mask |= S_IROTH;
-       if (mode & VWRITE)
-               mask |= S_IWOTH;
-       return (file_mode & mask) == mask ? 0 : EACCES;
+       return (vop_helper_access(ap, pmp->pm_uid, pmp->pm_gid, file_mode, 0));
 }
 
 /*