lint
[unix-history] / usr / src / sys / ufs / ffs / ufs_vnops.c
index 14f730d..3a68963 100644 (file)
@@ -4,7 +4,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)ufs_vnops.c 8.4 (Berkeley) %G%
+ *     @(#)ufs_vnops.c 8.8 (Berkeley) %G%
  */
 
 #include <sys/param.h>
  */
 
 #include <sys/param.h>
@@ -178,7 +178,7 @@ ufs_access(ap)
        register struct vnode *vp = ap->a_vp;
        register struct inode *ip = VTOI(vp);
        register struct ucred *cred = ap->a_cred;
        register struct vnode *vp = ap->a_vp;
        register struct inode *ip = VTOI(vp);
        register struct ucred *cred = ap->a_cred;
-       mode_t mode = ap->a_mode;
+       mode_t mask, mode = ap->a_mode;
        register gid_t *gp;
        int i, error;
 
        register gid_t *gp;
        int i, error;
 
@@ -208,41 +208,39 @@ ufs_access(ap)
        if (cred->cr_uid == 0)
                return (0);
 
        if (cred->cr_uid == 0)
                return (0);
 
+       mask = 0;
+
        /* Otherwise, check the owner. */
        /* Otherwise, check the owner. */
-       if (cred->cr_uid == ip->i_uid)
-               switch (mode) {
-               case VEXEC:
-                       return (ip->i_mode & S_IXUSR ? 0 : EACCES);
-               case VREAD:
-                       return (ip->i_mode & S_IRUSR ? 0 : EACCES);
-               case VWRITE:
-                       return (ip->i_mode & S_IWUSR ? 0 : EACCES);
-               }
+       if (cred->cr_uid == ip->i_uid) {
+               if (mode & VEXEC)
+                       mask |= S_IXUSR;
+               if (mode & VREAD)
+                       mask |= S_IRUSR;
+               if (mode & VWRITE)
+                       mask |= S_IWUSR;
+               return ((ip->i_mode & mask) == mask ? 0 : EACCES);
+       }
 
        /* Otherwise, check the groups. */
        for (i = 0, gp = cred->cr_groups; i < cred->cr_ngroups; i++, gp++)
 
        /* Otherwise, check the groups. */
        for (i = 0, gp = cred->cr_groups; i < cred->cr_ngroups; i++, gp++)
-               if (ip->i_gid == *gp)
-                       switch (mode) {
-                       case VEXEC:
-                               return (ip->i_mode & S_IXGRP ? 0 : EACCES);
-                       case VREAD:
-                               return (ip->i_mode & S_IRGRP ? 0 : EACCES);
-                       case VWRITE:
-                               return (ip->i_mode & S_IWGRP ? 0 : EACCES);
-                       }
+               if (ip->i_gid == *gp) {
+                       if (mode & VEXEC)
+                               mask |= S_IXGRP;
+                       if (mode & VREAD)
+                               mask |= S_IRGRP;
+                       if (mode & VWRITE)
+                               mask |= S_IWGRP;
+                       return ((ip->i_mode & mask) == mask ? 0 : EACCES);
+               }
 
        /* Otherwise, check everyone else. */
 
        /* Otherwise, check everyone else. */
-       switch (mode) {
-       case VEXEC:
-               return (ip->i_mode & S_IXOTH ? 0 : EACCES);
-       case VREAD:
-               return (ip->i_mode & S_IROTH ? 0 : EACCES);
-       case VWRITE:
-               return (ip->i_mode & S_IWOTH ? 0 : EACCES);
-       }
-
-       panic("ufs_access: unknown mode %x\n", mode);
-       /* NOTREACHED */
+       if (mode & VEXEC)
+               mask |= S_IXOTH;
+       if (mode & VREAD)
+               mask |= S_IROTH;
+       if (mode & VWRITE)
+               mask |= S_IWOTH;
+       return ((ip->i_mode & mask) == mask ? 0 : EACCES);
 }
 
 /* ARGSUSED */
 }
 
 /* ARGSUSED */
@@ -399,7 +397,8 @@ ufs_chmod(vp, mode, cred, p)
                        return (EPERM);
        }
        ip->i_mode &= ~ALLPERMS;
                        return (EPERM);
        }
        ip->i_mode &= ~ALLPERMS;
-       ip->i_mode |= (mode & ALLPERMS) | IN_CHANGE;
+       ip->i_mode |= (mode & ALLPERMS);
+       ip->i_flag |= IN_CHANGE;
        if ((vp->v_flag & VTEXT) && (ip->i_mode & S_ISTXT) == 0)
                (void) vnode_pager_uncache(vp);
        return (0);
        if ((vp->v_flag & VTEXT) && (ip->i_mode & S_ISTXT) == 0)
                (void) vnode_pager_uncache(vp);
        return (0);
@@ -689,14 +688,14 @@ relookup(dvp, vpp, cnp)
        struct componentname *cnp;
 {
        register struct vnode *dp = 0;  /* the directory we are searching */
        struct componentname *cnp;
 {
        register struct vnode *dp = 0;  /* the directory we are searching */
-       struct vnode *tdp;              /* saved dp */
-       struct mount *mp;               /* mount table entry */
        int docache;                    /* == 0 do not cache last component */
        int wantparent;                 /* 1 => wantparent or lockparent flag */
        int rdonly;                     /* lookup read-only flag bit */
        int docache;                    /* == 0 do not cache last component */
        int wantparent;                 /* 1 => wantparent or lockparent flag */
        int rdonly;                     /* lookup read-only flag bit */
-       char *cp;                       /* DEBUG: check name ptr/len */
-       int newhash;                    /* DEBUG: check name hash */
        int error = 0;
        int error = 0;
+#ifdef NAMEI_DIAGNOSTIC
+       int newhash;                    /* DEBUG: check name hash */
+       char *cp;                       /* DEBUG: check name ptr/len */
+#endif
 
        /*
         * Setup: break out flag bits into variables.
 
        /*
         * Setup: break out flag bits into variables.
@@ -796,7 +795,6 @@ relookup(dvp, vpp, cnp)
                panic ("relookup: symlink found.\n");
 #endif
 
                panic ("relookup: symlink found.\n");
 #endif
 
-nextname:
        /*
         * Check for read-only file systems.
         */
        /*
         * Check for read-only file systems.
         */
@@ -879,7 +877,6 @@ ufs_rename(ap)
        struct timeval tv;
        int doingdirectory = 0, oldparent = 0, newparent = 0;
        int error = 0;
        struct timeval tv;
        int doingdirectory = 0, oldparent = 0, newparent = 0;
        int error = 0;
-       int fdvpneedsrele = 1, tdvpneedsrele = 1;
        u_char namlen;
 
 #ifdef DIAGNOSTIC
        u_char namlen;
 
 #ifdef DIAGNOSTIC