From 6c708d1415b27bf8f2804f3407e4fbe2f7bf1009 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Tue, 27 Nov 2012 14:26:21 -0500 Subject: [PATCH] Windows: Implement dynamic cell detection for RDR RDR_EvaluateNodeByName knew how to parse \\afs\foo#bar\ notation but couldn't perform a lookup for a cell that wasn't already in the root directory. Add support for autorecognition. Change-Id: I8c2bacd034afa507d551da83dfc1958bd849a3a1 Reviewed-on: http://gerrit.openafs.org/8562 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsrdr/user/RDRFunction.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/WINNT/afsrdr/user/RDRFunction.c b/src/WINNT/afsrdr/user/RDRFunction.c index 1b56c5963..44276f4c2 100644 --- a/src/WINNT/afsrdr/user/RDRFunction.c +++ b/src/WINNT/afsrdr/user/RDRFunction.c @@ -984,7 +984,7 @@ RDR_EvaluateNodeByName( IN cm_user_t *userp, ParentID.Cell, ParentID.Volume, ParentID.Vnode, ParentID.Unique); /* Allocate enough room to add a volume prefix if necessary */ - cbName = FileNameLength + (CM_PREFIX_VOL_CCH + 1) * sizeof(WCHAR); + cbName = FileNameLength + (CM_PREFIX_VOL_CCH + 64) * sizeof(WCHAR); wszName = malloc(cbName); if (!wszName) { osi_Log0(afsd_logp, "RDR_EvaluateNodeByName Out of Memory"); @@ -1062,12 +1062,24 @@ RDR_EvaluateNodeByName( IN cm_user_t *userp, code = cm_Lookup(dscp, wszName, CM_FLAG_CHECKPATH, userp, &req, &scp); if ((code == CM_ERROR_NOSUCHPATH || code == CM_ERROR_NOSUCHFILE || code == CM_ERROR_BPLUS_NOMATCH) && - (wcschr(wszName, '%') != NULL || wcschr(wszName, '#') != NULL)) { - /* - * A volume reference: {%,#} -> @vol:{%,#} - */ + dscp == cm_data.rootSCachep) { + StringCchCopyNW(wszName, cbName, _C(CM_PREFIX_VOL), CM_PREFIX_VOL_CCH); - StringCbCatNW(wszName, cbName, FileName, FileNameLength); + if (wcschr(wszName, '%') != NULL || wcschr(wszName, '#') != NULL) { + /* + * A volume reference: {%,#} -> @vol:{%,#} + */ + StringCbCatNW(wszName, cbName, FileName, FileNameLength); + } else { + if (FileName[0] == L'.') { + StringCbCatNW(wszName, cbName, &FileName[1], FileNameLength); + StringCbCatNW(wszName, cbName, L"%", sizeof(WCHAR)); + } else { + StringCbCatNW(wszName, cbName, FileName, FileNameLength); + StringCbCatNW(wszName, cbName, L"#", sizeof(WCHAR)); + } + StringCbCatNW(wszName, cbName, L"root.cell", 9 * sizeof(WCHAR)); + } bVol = TRUE; code = cm_EvaluateVolumeReference(wszName, CM_FLAG_CHECKPATH, userp, &req, &scp); -- 2.39.5