venus: Remove dedebug
[openafs.git] / src / WINNT / afsrdr / user / RDRIoctl.c
index ceb81cc..cbbdf84 100644 (file)
@@ -149,6 +149,7 @@ RDR_InitIoctl(void)
     RDR_ioctlProcsp[VIOC_SETUNIXMODE] = RDR_IoctlSetUnixMode;
     RDR_ioctlProcsp[VIOC_GETVERIFYDATA] = RDR_IoctlGetVerifyData;
     RDR_ioctlProcsp[VIOC_SETVERIFYDATA] = RDR_IoctlSetVerifyData;
+    RDR_ioctlProcsp[VIOC_GETCALLERACCESS] = RDR_IoctlGetCallerAccess;
 }
 
 void
@@ -640,10 +641,15 @@ RDR_ParseIoctlPath(RDR_ioctl_t *ioctlp, cm_user_t *userp, cm_req_t *reqp,
             return code;
        }
 
-       lastComponent = cm_ClientStrRChr(relativePath, '\\');
-       if (lastComponent && (lastComponent - relativePath) > 1 && wcslen(lastComponent) > 1) {
-           *lastComponent = '\0';
-           lastComponent++;
+       lastComponent = cm_ClientStrRChr(relativePath, L'\\');
+       if (lastComponent && (lastComponent - relativePath) > 1) {
+            if (wcslen(lastComponent) == 1) {
+                *lastComponent = L'\0';
+                lastComponent = L".";
+            } else {
+                *lastComponent = L'\0';
+                lastComponent++;
+            }
 
            code = cm_NameI(substRootp, relativePath, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW,
                             userp, NULL, reqp, &iscp);
@@ -1961,3 +1967,34 @@ RDR_IoctlSetVerifyData(struct RDR_ioctl *ioctlp, struct cm_user *userp, afs_uint
 
     return cm_IoctlSetVerifyData(&ioctlp->ioctl);
 }
+
+afs_int32
+RDR_IoctlGetCallerAccess(struct RDR_ioctl *ioctlp, struct cm_user *userp, afs_uint32 pflags)
+{
+    afs_int32 code;
+    cm_scache_t *scp;
+    cm_ioctlQueryOptions_t * optionsp;
+    afs_uint32 flags = 0;
+
+    optionsp = cm_IoctlGetQueryOptions(&ioctlp->ioctl, userp);
+    if (optionsp && CM_IOCTL_QOPTS_HAVE_LITERAL(optionsp))
+        flags |= (optionsp->literal ? CM_PARSE_FLAG_LITERAL : 0);
+
+    if (optionsp && CM_IOCTL_QOPTS_HAVE_FID(optionsp)) {
+        cm_fid_t fid;
+        cm_SkipIoctlPath(&ioctlp->ioctl);
+        cm_SetFid(&fid, optionsp->fid.cell, optionsp->fid.volume,
+                  optionsp->fid.vnode, optionsp->fid.unique);
+        code = cm_GetSCache(&fid, NULL, &scp, userp, &ioctlp->req);
+    } else {
+        code = RDR_ParseIoctlPath(ioctlp, userp, &ioctlp->req, &scp, flags);
+    }
+    if (code)
+        return code;
+
+    code = cm_IoctlGetCallerAccess(&ioctlp->ioctl, userp, scp, &ioctlp->req);
+
+    cm_ReleaseSCache(scp);
+
+    return code;
+}