diff --git a/src/afs/UKERNEL/afs_usrops.c b/src/afs/UKERNEL/afs_usrops.c index cabc41b3b3..7972d84b27 100644 --- a/src/afs/UKERNEL/afs_usrops.c +++ b/src/afs/UKERNEL/afs_usrops.c @@ -3830,6 +3830,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. diff --git a/src/afs/UKERNEL/afs_usrops.h b/src/afs/UKERNEL/afs_usrops.h index e1580d00ad..723917e4a1 100644 --- a/src/afs/UKERNEL/afs_usrops.h +++ b/src/afs/UKERNEL/afs_usrops.h @@ -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__ */