expand-drive-mappings-20040823
[openafs.git] / src / WINNT / client_config / drivemap.cpp
index 166461a..2681847 100644 (file)
@@ -306,14 +306,18 @@ BOOL IsValidSubmountName (LPTSTR pszSubmount)
       return FALSE;
 
    for ( ; *pszSubmount; ++pszSubmount)
-      {
-      if (!isprint(*pszSubmount))
-         return FALSE;
-      if (*pszSubmount == TEXT(' '))
-         return FALSE;
-      if (*pszSubmount == TEXT('\t'))
-         return FALSE;
-      }
+   {
+       if (!isprint(*pszSubmount))
+           return FALSE;
+       if (*pszSubmount == TEXT(' '))
+           return FALSE;
+       if (*pszSubmount == TEXT('/'))
+           return FALSE;
+       if (*pszSubmount == TEXT('\\'))
+           return FALSE;
+       if (*pszSubmount == TEXT('\t'))
+           return FALSE;
+   }
 
    return TRUE;
 }
@@ -443,7 +447,7 @@ void QueryDriveMapList_ReadMappings (PDRIVEMAPLIST pList)
 {
     HKEY hkMappings;
     RegCreateKeyEx( HKEY_CURRENT_USER,
-                    "SOFTWARE\\OpenAFS\\Client\\Mappings",
+                    cszSECTION_MAPPINGS,
                     0, 
                     "AFS", 
                     REG_OPTION_NON_VOLATILE,
@@ -476,13 +480,20 @@ void QueryDriveMapList_ReadMappings (PDRIVEMAPLIST pList)
 
         RegEnumValue( hkMappings, dwIndex, drive, &driveLen, NULL,
                       &dwType, (LPBYTE)mapping, &mappingLen);
+        if ( dwType == REG_EXPAND_SZ ) {
+            TCHAR buf[MAX_PATH];
+            DWORD dummyLen = ExpandEnvironmentStrings(buf, mapping, MAX_PATH);
+            if (dummyLen > MAX_PATH)
+                continue;
+            _tcsncpy(mapping, buf, MAX_PATH);
+        }
 
-       DRIVEMAP DriveMap;
-       memset (&DriveMap, 0x00, sizeof(DRIVEMAP));
-       DriveMap.chDrive = toupper(*drive);
-       DriveMap.fPersistent = TRUE;
-       if ((DriveMap.chDrive < chDRIVE_A) || (DriveMap.chDrive > chDRIVE_Z))
-           continue;
+        DRIVEMAP DriveMap;
+        memset (&DriveMap, 0x00, sizeof(DRIVEMAP));
+        DriveMap.chDrive = toupper(*drive);
+        DriveMap.fPersistent = TRUE;
+        if ((DriveMap.chDrive < chDRIVE_A) || (DriveMap.chDrive > chDRIVE_Z))
+            continue;
 
        if (mapping[0] != TEXT('\0'))
        {
@@ -537,7 +548,7 @@ void WriteDriveMappings (PDRIVEMAPLIST pList)
 {
     HKEY hkMappings;
     RegCreateKeyEx( HKEY_CURRENT_USER, 
-                    "SOFTWARE\\OpenAFS\\Client\\Mappings",
+                    cszSECTION_MAPPINGS,
                     0, 
                     "AFS", 
                     REG_OPTION_NON_VOLATILE,
@@ -583,7 +594,7 @@ void WriteDriveMappings (PDRIVEMAPLIST pList)
            if (!pList->aDriveMap[iDrive].fPersistent)
                lstrcat (szRHS, TEXT("*"));
 
-           RegSetValueEx( hkMappings, szLHS, 0, REG_SZ, (const BYTE *)szRHS, lstrlen(szRHS) + 1);
+           RegSetValueEx( hkMappings, szLHS, 0, REG_EXPAND_SZ, (const BYTE *)szRHS, lstrlen(szRHS) + 1);
        }
    }
    RegCloseKey( hkMappings );
@@ -1319,7 +1330,7 @@ DWORD MountDOSDrive(char chDrive,const char *szSubmount,BOOL bPersistent,const c
     nr.dwType=RESOURCETYPE_DISK;
     nr.lpLocalName=szDrive;
     nr.lpRemoteName=szPath;
-    nr.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
+    nr.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE; /* ignored parameter */
     DWORD res=WNetAddConnection2(&nr,NULL,pUsername,(bPersistent)?CONNECT_UPDATE_PROFILE:0);
     DEBUG_EVENT5("AFS DriveMap","Mount %s Local[%s] Remote[%s] User[%s]=%x",
                   (bPersistent)?"Persistant" : "NonPresistant",