reindent-20030715
[openafs.git] / src / afs / VNOPS / afs_vnop_access.c
index 69fcd33..afd6c9c 100644 (file)
 #include <afsconfig.h>
 #include "afs/param.h"
 
-RCSID("$Header$");
+RCSID
+    ("$Header$");
 
 #include "afs/sysincludes.h"   /* Standard vendor system headers */
 #include "afsincludes.h"       /* Afs-based standard headers */
-#include "afs/afs_stats.h" /* statistics */
+#include "afs/afs_stats.h"     /* statistics */
 #include "afs/afs_cbqueue.h"
 #include "afs/nfsclient.h"
 #include "afs/afs_osidnlc.h"
 
 #ifndef ANONYMOUSID
-#define ANONYMOUSID     32766 /* make sure this is same as in ptserver.h */
+#define ANONYMOUSID     32766  /* make sure this is same as in ptserver.h */
 #endif
 
 
@@ -51,8 +52,9 @@ static char fileModeMap[8] = {
 };
 
 /* avc must be held.  Returns bit map of mode bits.  Ignores file mode bits */
-afs_int32 afs_GetAccessBits(register struct vcache *avc, register afs_int32 arights, 
-       register struct vrequest *areq)
+afs_int32
+afs_GetAccessBits(register struct vcache *avc, register afs_int32 arights,
+                 register struct vrequest *areq)
 {
     AFS_STATCNT(afs_GetAccessBits);
     /* see if anyuser has the required access bits */
@@ -61,41 +63,40 @@ afs_int32 afs_GetAccessBits(register struct vcache *avc, register afs_int32 arig
     }
 
     /* look in per-pag cache */
-    if (avc->Access) {  /* not beautiful, but Sun's cc will tolerate it */
-      struct axscache *ac;
+    if (avc->Access) {         /* not beautiful, but Sun's cc will tolerate it */
+       struct axscache *ac;
 
-      ac = afs_FindAxs(avc->Access, areq->uid);
-      if (ac) {
-       return (arights & ac->axess);
-      }
+       ac = afs_FindAxs(avc->Access, areq->uid);
+       if (ac) {
+           return (arights & ac->axess);
+       }
     }
 
-    if (!(avc->states & CForeign)) { 
-      /* If there aren't any bits cached for this user (but the vnode
-       * _is_ cached, obviously), make sure this user has valid tokens
-       * before bothering with the RPC.  */
-      struct unixuser *tu;
-      extern struct unixuser *afs_FindUser();
-      tu = afs_FindUser( areq->uid, avc->fid.Cell, READ_LOCK );
-      if (!tu) {
-       return (arights & avc->anyAccess);
-      }
-      if ((tu->vid == UNDEFVID) || !(tu->states & UHasTokens) ||
-         (tu->states & UTokensBad)) {
-       afs_PutUser(tu, READ_LOCK);
-       return (arights & avc->anyAccess);
-      }
-      else {
-       afs_PutUser(tu, READ_LOCK);
-      }
+    if (!(avc->states & CForeign)) {
+       /* If there aren't any bits cached for this user (but the vnode
+        * _is_ cached, obviously), make sure this user has valid tokens
+        * before bothering with the RPC.  */
+       struct unixuser *tu;
+       extern struct unixuser *afs_FindUser();
+       tu = afs_FindUser(areq->uid, avc->fid.Cell, READ_LOCK);
+       if (!tu) {
+           return (arights & avc->anyAccess);
+       }
+       if ((tu->vid == UNDEFVID) || !(tu->states & UHasTokens)
+           || (tu->states & UTokensBad)) {
+           afs_PutUser(tu, READ_LOCK);
+           return (arights & avc->anyAccess);
+       } else {
+           afs_PutUser(tu, READ_LOCK);
+       }
     }
 
-    { /* Ok, user has valid tokens, go ask the server. */
-      struct AFSFetchStatus OutStatus;
-      afs_int32 code;
-    
-      code = afs_FetchStatus(avc, &avc->fid, areq, &OutStatus);
-      return (code ? 0 : OutStatus.CallerAccess & arights);
+    {                          /* Ok, user has valid tokens, go ask the server. */
+       struct AFSFetchStatus OutStatus;
+       afs_int32 code;
+
+       code = afs_FetchStatus(avc, &avc->fid, areq, &OutStatus);
+       return (code ? 0 : OutStatus.CallerAccess & arights);
     }
 }
 
@@ -103,8 +104,9 @@ afs_int32 afs_GetAccessBits(register struct vcache *avc, register afs_int32 arig
 /* the new access ok function.  AVC must be held but not locked. if avc is a
  * file, its parent need not be held, and should not be locked. */
 
-int afs_AccessOK(struct vcache *avc, afs_int32 arights, struct vrequest *areq, 
-       afs_int32 check_mode_bits)
+int
+afs_AccessOK(struct vcache *avc, afs_int32 arights, struct vrequest *areq,
+            afs_int32 check_mode_bits)
 {
     register struct vcache *tvc;
     struct VenusFid dirFid;
@@ -115,10 +117,9 @@ int afs_AccessOK(struct vcache *avc, afs_int32 arights, struct vrequest *areq,
     AFS_STATCNT(afs_AccessOK);
 
     if ((vType(avc) == VDIR) || (avc->states & CForeign)) {
-      /* rights are just those from acl */
-      return (arights == afs_GetAccessBits(avc, arights, areq));
-    }
-    else {
+       /* rights are just those from acl */
+       return (arights == afs_GetAccessBits(avc, arights, areq));
+    } else {
        /* some rights come from dir and some from file.  Specifically, you 
         * have "a" rights to a file if you are its owner, which comes
         * back as "a" rights to the file. You have other rights just
@@ -138,8 +139,7 @@ int afs_AccessOK(struct vcache *avc, afs_int32 arights, struct vrequest *areq,
                dirBits = afs_GetAccessBits(tvc, arights, areq);
                afs_PutVCache(tvc);
            }
-       }
-       else
+       } else
            dirBits = 0xffffffff;       /* assume OK; this is a race condition */
        if (arights & PRSFS_ADMINISTER)
            fileBits = afs_GetAccessBits(avc, arights, areq);
@@ -147,25 +147,28 @@ int afs_AccessOK(struct vcache *avc, afs_int32 arights, struct vrequest *areq,
            fileBits = 0;       /* don't make call if results don't matter */
 
        /* compute basic rights in fileBits, taking A from file bits */
-       fileBits = (fileBits & PRSFS_ADMINISTER) | (dirBits & ~PRSFS_ADMINISTER);
+       fileBits =
+           (fileBits & PRSFS_ADMINISTER) | (dirBits & ~PRSFS_ADMINISTER);
 
        /* for files, throw in R and W if have I and A (owner).  This makes
-          insert-only dirs work properly */
-       if (vType(avc) != VDIR && (fileBits & (PRSFS_ADMINISTER | PRSFS_INSERT)) ==
+        * insert-only dirs work properly */
+       if (vType(avc) != VDIR
+           && (fileBits & (PRSFS_ADMINISTER | PRSFS_INSERT)) ==
            (PRSFS_ADMINISTER | PRSFS_INSERT))
            fileBits |= (PRSFS_READ | PRSFS_WRITE);
 
        if (check_mode_bits & CHECK_MODE_BITS) {
            /* owner mode bits are further restrictions on the access mode
-             * The mode bits are mapped to protection bits through the
-             * fileModeMap. If CMB_ALLOW_EXEC_AS_READ is set, it's from the
-             * NFS translator and we don't know if it's a read or execute
-             * on the NFS client, but both need to read the data.
-             */
+            * The mode bits are mapped to protection bits through the
+            * fileModeMap. If CMB_ALLOW_EXEC_AS_READ is set, it's from the
+            * NFS translator and we don't know if it's a read or execute
+            * on the NFS client, but both need to read the data.
+            */
            mask = (avc->m.Mode & 0700) >> 6;   /* file restrictions to use */
            fileBits &= ~fileModeMap[mask];
            if (check_mode_bits & CMB_ALLOW_EXEC_AS_READ) {
-                if (avc->m.Mode & 0100) fileBits |= PRSFS_READ;
+               if (avc->m.Mode & 0100)
+                   fileBits |= PRSFS_READ;
            }
        }
        return ((fileBits & arights) == arights);       /* true if all rights bits are on */
@@ -174,9 +177,13 @@ int afs_AccessOK(struct vcache *avc, afs_int32 arights, struct vrequest *areq,
 
 
 #if defined(AFS_SUN5_ENV) || (defined(AFS_SGI_ENV) && !defined(AFS_SGI65_ENV))
-int afs_access(OSI_VC_DECL(avc), register afs_int32 amode, int flags, struct AFS_UCRED *acred)
+int
+afs_access(OSI_VC_DECL(avc), register afs_int32 amode, int flags,
+          struct AFS_UCRED *acred)
 #else
-int afs_access(OSI_VC_DECL(avc), register afs_int32 amode, struct AFS_UCRED *acred)
+int
+afs_access(OSI_VC_DECL(avc), register afs_int32 amode,
+          struct AFS_UCRED *acred)
 #endif
 {
     register afs_int32 code;
@@ -184,12 +191,13 @@ int afs_access(OSI_VC_DECL(avc), register afs_int32 amode, struct AFS_UCRED *acr
     struct afs_fakestat_state fakestate;
     OSI_VC_CONVERT(avc)
 
-    AFS_STATCNT(afs_access);
-    afs_Trace3(afs_iclSetp, CM_TRACE_ACCESS, ICL_TYPE_POINTER, avc, 
-               ICL_TYPE_INT32, amode,
-               ICL_TYPE_OFFSET, ICL_HANDLE_OFFSET(avc->m.Length));
+       AFS_STATCNT(afs_access);
+    afs_Trace3(afs_iclSetp, CM_TRACE_ACCESS, ICL_TYPE_POINTER, avc,
+              ICL_TYPE_INT32, amode, ICL_TYPE_OFFSET,
+              ICL_HANDLE_OFFSET(avc->m.Length));
     afs_InitFakeStat(&fakestate);
-    if ((code = afs_InitReq(&treq, acred))) return code;
+    if ((code = afs_InitReq(&treq, acred)))
+       return code;
 
     code = afs_EvalFakeStat(&avc, &fakestate, &treq);
     if (code) {
@@ -199,9 +207,9 @@ int afs_access(OSI_VC_DECL(avc), register afs_int32 amode, struct AFS_UCRED *acr
 
     code = afs_VerifyVCache(avc, &treq);
     if (code) {
-      afs_PutFakeStat(&fakestate);
-      code = afs_CheckCode(code, &treq, 16);
-      return code; 
+       afs_PutFakeStat(&fakestate);
+       code = afs_CheckCode(code, &treq, 16);
+       return code;
     }
 
     /* if we're looking for write access and we have a read-only file system, report it */
@@ -209,7 +217,7 @@ int afs_access(OSI_VC_DECL(avc), register afs_int32 amode, struct AFS_UCRED *acr
        afs_PutFakeStat(&fakestate);
        return EROFS;
     }
-    code = 1;          /* Default from here on in is access ok. */
+    code = 1;                  /* Default from here on in is access ok. */
     if (avc->states & CForeign) {
        /* In the dfs xlator the EXEC bit is mapped to LOOKUP */
        if (amode & VEXEC)
@@ -218,24 +226,33 @@ int afs_access(OSI_VC_DECL(avc), register afs_int32 amode, struct AFS_UCRED *acr
            code = afs_AccessOK(avc, PRSFS_WRITE, &treq, CHECK_MODE_BITS);
            if (code && (vType(avc) == VDIR)) {
                if (code)
-                   code = afs_AccessOK(avc, PRSFS_INSERT, &treq, CHECK_MODE_BITS);
-               if (!code) 
-                   code = afs_AccessOK(avc, PRSFS_DELETE, &treq, CHECK_MODE_BITS);
-           }   
-       }       
-       if (code && (amode & VREAD)) 
+                   code =
+                       afs_AccessOK(avc, PRSFS_INSERT, &treq,
+                                    CHECK_MODE_BITS);
+               if (!code)
+                   code =
+                       afs_AccessOK(avc, PRSFS_DELETE, &treq,
+                                    CHECK_MODE_BITS);
+           }
+       }
+       if (code && (amode & VREAD))
            code = afs_AccessOK(avc, PRSFS_READ, &treq, CHECK_MODE_BITS);
     } else {
        if (vType(avc) == VDIR) {
-           if (amode & VEXEC) 
-              code = afs_AccessOK(avc, PRSFS_LOOKUP, &treq, CHECK_MODE_BITS);
+           if (amode & VEXEC)
+               code =
+                   afs_AccessOK(avc, PRSFS_LOOKUP, &treq, CHECK_MODE_BITS);
            if (code && (amode & VWRITE)) {
-               code = afs_AccessOK(avc, PRSFS_INSERT, &treq, CHECK_MODE_BITS);
-               if (!code) 
-                  code = afs_AccessOK(avc, PRSFS_DELETE, &treq, CHECK_MODE_BITS);
+               code =
+                   afs_AccessOK(avc, PRSFS_INSERT, &treq, CHECK_MODE_BITS);
+               if (!code)
+                   code =
+                       afs_AccessOK(avc, PRSFS_DELETE, &treq,
+                                    CHECK_MODE_BITS);
            }
            if (code && (amode & VREAD))
-               code = afs_AccessOK(avc, PRSFS_LOOKUP, &treq, CHECK_MODE_BITS);
+               code =
+                   afs_AccessOK(avc, PRSFS_LOOKUP, &treq, CHECK_MODE_BITS);
        } else {
            if (amode & VEXEC) {
                code = afs_AccessOK(avc, PRSFS_READ, &treq, CHECK_MODE_BITS);
@@ -252,32 +269,36 @@ int afs_access(OSI_VC_DECL(avc), register afs_int32 amode, struct AFS_UCRED *acr
                     */
                    if (!((amode & VREAD) && AFS_NFSXLATORREQ(acred)))
 #endif
-                   if ((avc->m.Mode & 0100) == 0) code = 0;
-               } else if (avc->m.Mode & 0100) code = 1;
+                       if ((avc->m.Mode & 0100) == 0)
+                           code = 0;
+               } else if (avc->m.Mode & 0100)
+                   code = 1;
            }
-           if (code && (amode & VWRITE)) 
-           {
-              code = afs_AccessOK(avc, PRSFS_WRITE, &treq, CHECK_MODE_BITS);
-
-              /* The above call fails when the NFS translator tries to copy
-              ** a file with r--r--r-- permissions into a directory which
-               ** has system:anyuser acl. This is because the destination file
-              ** file is first created with r--r--r-- permissions through an
-              ** unauthenticated connectin.  hence, the above afs_AccessOK
-              ** call returns failure. hence, we retry without any file 
-              ** mode bit checking */
-              if ( !code && AFS_NFSXLATORREQ(acred) && avc->m.Owner == ANONYMOUSID)
-               code=afs_AccessOK(avc,PRSFS_WRITE, &treq, DONT_CHECK_MODE_BITS);
+           if (code && (amode & VWRITE)) {
+               code = afs_AccessOK(avc, PRSFS_WRITE, &treq, CHECK_MODE_BITS);
+
+               /* The above call fails when the NFS translator tries to copy
+                ** a file with r--r--r-- permissions into a directory which
+                ** has system:anyuser acl. This is because the destination file
+                ** file is first created with r--r--r-- permissions through an
+                ** unauthenticated connectin.  hence, the above afs_AccessOK
+                ** call returns failure. hence, we retry without any file 
+                ** mode bit checking */
+               if (!code && AFS_NFSXLATORREQ(acred)
+                   && avc->m.Owner == ANONYMOUSID)
+                   code =
+                       afs_AccessOK(avc, PRSFS_WRITE, &treq,
+                                    DONT_CHECK_MODE_BITS);
            }
-           if (code && (amode & VREAD)) 
-              code = afs_AccessOK(avc, PRSFS_READ, &treq, CHECK_MODE_BITS);
+           if (code && (amode & VREAD))
+               code = afs_AccessOK(avc, PRSFS_READ, &treq, CHECK_MODE_BITS);
        }
     }
     afs_PutFakeStat(&fakestate);
     if (code) {
        return 0;               /* if access is ok */
     } else {
-       code = afs_CheckCode(EACCES, &treq, 17);             /* failure code */
+       code = afs_CheckCode(EACCES, &treq, 17);        /* failure code */
        return code;
     }
 }
@@ -287,18 +308,21 @@ int afs_access(OSI_VC_DECL(avc), register afs_int32 amode, struct AFS_UCRED *acr
  * afs_getRights
  * This function is just an interface to afs_GetAccessBits
  */
-int afs_getRights(OSI_VC_DECL(avc), register afs_int32 arights, struct AFS_UCRED *acred)
+int
+afs_getRights(OSI_VC_DECL(avc), register afs_int32 arights,
+             struct AFS_UCRED *acred)
 {
     register afs_int32 code;
     struct vrequest treq;
     OSI_VC_CONVERT(avc)
 
-    if (code = afs_InitReq(&treq, acred)) return code;
+       if (code = afs_InitReq(&treq, acred))
+       return code;
 
     code = afs_VerifyVCache(avc, &treq);
     if (code) {
-      code = afs_CheckCode(code, &treq, 16);
-      return code; 
+       code = afs_CheckCode(code, &treq, 16);
+       return code;
     }
 
     return afs_GetAccessBits(avc, arights, &treq);