windows-shellext-path-in-afs-20090507
authorJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 7 May 2009 15:53:14 +0000 (15:53 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 7 May 2009 15:53:14 +0000 (15:53 +0000)
LICENSE MIT
FIXES 124742

Change the PathInAfs test to use VIOCGETFID instead of VIOC_GET_CELL_NAME.
VIOCGETFID permits a literal test of the specified object.   This is needed
for testing the validity of a symlink to a msdfs: or non-existent path.
Otherwise, the AFS Shell Extension context menu will not be displayed.

src/WINNT/client_exp/gui2fs.cpp

index 40ada97..c0c01f3 100644 (file)
@@ -39,6 +39,11 @@ extern "C" {
 #include <afs/auth.h>
 #include <WINNT\afsreg.h>
 #include <cm.h>
+#include <cm_nls.h>
+#include <osi.h>
+#include <cm_user.h>
+#include <cm_scache.h>
+#include <cm_ioctl.h>
 }
 
 #define STRSAFE_NO_DEPRECATE
@@ -1154,6 +1159,8 @@ CString ParseSymlink(const CString strFile, CString strSymlink)
 BOOL IsPathInAfs(const CString & strPath)
 {
     struct ViceIoctl blob;
+    cm_ioctlQueryOptions_t options;
+    cm_fid_t fid;
     int code;
 
     HOURGLASS hourglass;
@@ -1163,13 +1170,18 @@ BOOL IsPathInAfs(const CString & strPath)
     debugBuf.Format(_T("IsPathInAfs(%s)"), strPath);
     OutputDebugString(debugBuf);
 
-    blob.in_size = 0;
-    blob.out_size = MAXSIZE;
-    blob.out = space;
+    memset(&options, 0, sizeof(options));
+    options.size = sizeof(options);
+    options.field_flags |= CM_IOCTL_QOPTS_FIELD_LITERAL;
+    options.literal = 1;
+    blob.in_size = options.size;    /* no variable length data */
+    blob.in = &options;
+    blob.out_size = sizeof(cm_fid_t);
+    blob.out = (char *) &fid;
 
-    code = pioctl_T(strPath, VIOC_FILE_CELL_NAME, &blob, 1);
+    code = pioctl_T(strPath, VIOCGETFID, &blob, 1);
 
-    debugBuf.Format(_T("VIOC_FILE_CELL_NAME=%d"), code);
+    debugBuf.Format(_T("VIOCGETFID=%d"), code);
     OutputDebugString(debugBuf);
 
     if (code) {
@@ -1627,7 +1639,7 @@ BOOL IsSymlink(const CString& strName)
 
     HOURGLASS hourglass;
 
-           {
+    {
         CString str;
         str.Format(_T("IsSymlink(%s)"), strName);
         OutputDebugString(str);