]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
ukernel: add uafs_access
authorDerrick Brashear <shadow@dementix.org>
Mon, 10 Oct 2011 20:35:45 +0000 (16:35 -0400)
committerDerrick Brashear <shadow@dementix.org>
Wed, 26 Oct 2011 22:33:44 +0000 (15:33 -0700)
we don't have an access vop. add one.

Reviewed-on: http://gerrit.openafs.org/5589
Reviewed-by: Derrick Brashear <shadow@dementix.org>
Tested-by: Derrick Brashear <shadow@dementix.org>
(cherry picked from commit 3eb60908a1f9b3f2783ec3f7755b242bff3d573d)

Change-Id: If45a7286b31e20e4e37119e5555f49ef69c8bb97
Reviewed-on: http://gerrit.openafs.org/5699
Reviewed-by: Derrick Brashear <shadow@dementix.org>
Tested-by: Derrick Brashear <shadow@dementix.org>
src/afs/UKERNEL/afs_usrops.c
src/afs/UKERNEL/afs_usrops.h

index a19557223c4a7e7daaba1b7cbe7593c9d3bdff03..a4a0fdbaec991e8204adcae5f8d3e4717ed5f7fc 100644 (file)
@@ -3831,6 +3831,45 @@ uafs_statmountpoint_r(char *path)
     return r;
 }
 
+/*
+ * uafs_getRights
+ * Get a list of rights for the current user on path.
+ */
+int
+uafs_access(char *path, int flags)
+{
+    int code;
+    struct vnode *vp;
+    int fileMode = 0;
+
+    if (flags & R_OK) {
+       fileMode |= VREAD;
+    }
+    if (flags & W_OK) {
+       fileMode |= VWRITE;
+    }
+    if (flags & X_OK) {
+       fileMode |= VEXEC;
+    }
+
+    AFS_GLOCK();
+    code = uafs_LookupName(path, afs_CurrentDir, &vp, 1, 0);
+    if (code != 0) {
+       errno = code;
+       AFS_GUNLOCK();
+       return -1;
+    }
+
+    code = afs_access(VTOAFS(vp), fileMode, get_user_struct()->u_cred);
+    VN_RELE(vp);
+
+    if (code != 0)
+       errno = code;
+
+    AFS_GUNLOCK();
+    return code ? -1 : 0;
+}
+
 /*
  * uafs_getRights
  * Get a list of rights for the current user on path.
index 658501c844a07704d05105ee3a4337aa5ca2ddff..a53a37d609b42a6f6b00395d15a5bf4a6dfb2d8b 100644 (file)
@@ -153,5 +153,6 @@ extern void uafs_Shutdown(void);
 extern void uafs_mount(void);
 extern void uafs_setMountDir(const char *dir);
 extern int uafs_fork(int wait, void* (*cbf) (void *), void *rock);
+extern int uafs_access(char *path, int amode);
 
 #endif /* __AFS_USROPS_H__ */