From bfb0b1a28e3aee2d83c562d3bf7633d00e03af05 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Tue, 22 Nov 2005 00:37:48 +0000 Subject: [PATCH] STABLE14-windows-drivemap-renewal-20051121 When afscreds.exe performs a drive map renewal it should not delete all existing drive mappings. This undoes the efforts of the AFS logon network provider and any persistent mappings created with the explorer shell. This patch extends the interface to provide a mode in which DoMapShareChange does not remove unknown drive mappings. (cherry picked from commit 5ce322c9f13522cf96addaf09804021c6d78b22f) --- src/WINNT/afsd/cm_utils.c | 21 +- src/WINNT/client_config/drivemap.cpp | 301 +++++++++++++-------------- src/WINNT/client_config/drivemap.h | 2 +- src/WINNT/client_creds/main.cpp | 2 +- 4 files changed, 167 insertions(+), 159 deletions(-) diff --git a/src/WINNT/afsd/cm_utils.c b/src/WINNT/afsd/cm_utils.c index 8e90e3db5..afefb57b3 100644 --- a/src/WINNT/afsd/cm_utils.c +++ b/src/WINNT/afsd/cm_utils.c @@ -10,6 +10,7 @@ #include #include +#include #ifndef DJGPP #include #include @@ -42,9 +43,15 @@ #define ETIMEDOUT WSAETIMEDOUT #define ECONNREFUSED WSAECONNREFUSED #define ELOOP WSAELOOP +#ifdef ENAMETOOLONG +#undef ENAMETOOLONG +#endif #define ENAMETOOLONG WSAENAMETOOLONG #define EHOSTDOWN WSAEHOSTDOWN #define EHOSTUNREACH WSAEHOSTUNREACH +#ifdef ENOTEMPTY +#undef ENOTEMPTY +#endif #define ENOTEMPTY WSAENOTEMPTY #define EPROCLIM WSAEPROCLIM #define EUSERS WSAEUSERS @@ -53,15 +60,13 @@ #define EREMOTE WSAEREMOTE #endif /* EWOULDBLOCK */ #endif /* !DJGPP */ +#include + #include #include - #include #include -#include -#include - #include "afsd.h" static osi_once_t cm_utilsOnce; @@ -256,9 +261,13 @@ long cm_MapRPCError(long error, cm_req_t *reqp) || error == 122 /* EDQUOT on Linux */ || error == 1133) /* EDQUOT on Irix */ error = CM_ERROR_QUOTA; - else if (error == VNOVNODE) + else if (error == VNOVNODE) { +#ifdef COMMENT error = CM_ERROR_BADFD; - else if (error == 21) +#else + error = CM_ERROR_RETRY; +#endif + } else if (error == 21) return CM_ERROR_ISDIR; return error; } diff --git a/src/WINNT/client_config/drivemap.cpp b/src/WINNT/client_config/drivemap.cpp index 38e8ef961..aa92adf0b 100644 --- a/src/WINNT/client_config/drivemap.cpp +++ b/src/WINNT/client_config/drivemap.cpp @@ -1005,7 +1005,7 @@ BOOL fUserName=FALSE; void SetBitLogonOption(BOOL set,DWORD value) { - RWLogonOption(FALSE,((set)?value | RWLogonOption(TRUE,0):RWLogonOption(TRUE,0) & ~value) ); + RWLogonOption(FALSE,((set)?value | RWLogonOption(TRUE,0):RWLogonOption(TRUE,0) & ~value) ); } DWORD RWLogonOption(BOOL read,DWORD value) @@ -1040,27 +1040,27 @@ DWORD RWLogonOption(BOOL read,DWORD value) void MapShareName(char *pszCmdLineA) { - fUserName = TRUE; - TCHAR *p=pUserName; - pszCmdLineA++; - while (*pszCmdLineA && (*pszCmdLineA != ' ')) - { - *p++=*pszCmdLineA++; - } + fUserName = TRUE; + TCHAR *p=pUserName; + pszCmdLineA++; + while (*pszCmdLineA && (*pszCmdLineA != ' ')) + { + *p++=*pszCmdLineA++; + } } void GenRandomName(TCHAR *pname,int len) { - if (fUserName) - { //user name was passed through command line, use once - fUserName=FALSE; - return; - } - srand( (unsigned)time( NULL ) ); - for (int i=0;i0)) - { - if (drivemap) { - DisMountDOSDrive(*lpnrLocal[i].lpLocalName); + if ((lpnrLocal[i].lpLocalName) && (strlen(lpnrLocal[i].lpLocalName)>0)) + { + if (drivemap) { + DisMountDOSDrive(*lpnrLocal[i].lpLocalName); DEBUG_EVENT1("AFS DriveUnMap","UnMap-Local=%x",res); - } - } else { - DisMountDOSDriveFull(lpnrLocal[i].lpRemoteName); + } + } else { + DisMountDOSDriveFull(lpnrLocal[i].lpRemoteName); DEBUG_EVENT1("AFS DriveUnMap","UnMap-Remote=%x",res); } - } - } } - } while (res!=ERROR_NO_MORE_ITEMS); - GlobalFree((HGLOBAL)lpnrLocal); - WNetCloseEnum(hEnum); + } + } + } while (res!=ERROR_NO_MORE_ITEMS); + GlobalFree((HGLOBAL)lpnrLocal); + WNetCloseEnum(hEnum); } -BOOL DoMapShareChange() +BOOL DoMapShareChange(BOOL removeUnknown) { - DRIVEMAPLIST List; - TCHAR szMachine[ MAX_PATH],szPath[MAX_PATH]; - DWORD rc=28; - HANDLE hEnum; - LPNETRESOURCE lpnrLocal,lpnr=NULL; - DWORD res; - DWORD cEntries=-1; + DRIVEMAPLIST List; + TCHAR szMachine[ MAX_PATH],szPath[MAX_PATH]; + DWORD rc=28; + HANDLE hEnum; + LPNETRESOURCE lpnrLocal,lpnr=NULL; + DWORD res; + DWORD cEntries=-1; DWORD cbBuffer=16384; memset(szMachine, '\0', sizeof(szMachine)); GetClientNetbiosName(szMachine); // Initialize the data structure - if (!IsServiceActive()) - return TRUE; - memset (&List, 0x00, sizeof(DRIVEMAPLIST)); - for (size_t ii = 0; ii < 26; ++ii) - List.aDriveMap[ii].chDrive = chDRIVE_A + ii; - QueryDriveMapList_ReadSubmounts (&List); - if ((res=WNetOpenEnum(RESOURCE_CONNECTED,RESOURCETYPE_DISK,RESOURCEUSAGE_CONNECTABLE,lpnr,&hEnum))!=NO_ERROR) - return FALSE; - lpnrLocal=(LPNETRESOURCE) GlobalAlloc(GPTR,cbBuffer); - sprintf(szPath,"\\\\%s\\",szMachine); - _strlwr(szPath); - do { - memset(lpnrLocal,0,cbBuffer); - if ((res = WNetEnumResource(hEnum,&cEntries,lpnrLocal,&cbBuffer))==NO_ERROR) + if (!IsServiceActive()) + return TRUE; + memset (&List, 0x00, sizeof(DRIVEMAPLIST)); + for (size_t ii = 0; ii < 26; ++ii) + List.aDriveMap[ii].chDrive = chDRIVE_A + ii; + QueryDriveMapList_ReadSubmounts (&List); + if ((res=WNetOpenEnum(RESOURCE_CONNECTED,RESOURCETYPE_DISK,RESOURCEUSAGE_CONNECTABLE,lpnr,&hEnum))!=NO_ERROR) + return FALSE; + lpnrLocal=(LPNETRESOURCE) GlobalAlloc(GPTR,cbBuffer); + sprintf(szPath,"\\\\%s\\",szMachine); + _strlwr(szPath); + do { + memset(lpnrLocal,0,cbBuffer); + if ((res = WNetEnumResource(hEnum,&cEntries,lpnrLocal,&cbBuffer))==NO_ERROR) + { + for (DWORD i=0;i