]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE14-windows-drivemap-renewal-20051121
authorJeffrey Altman <jaltman@secure-endpoints.com>
Tue, 22 Nov 2005 00:37:48 +0000 (00:37 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Tue, 22 Nov 2005 00:37:48 +0000 (00:37 +0000)
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
src/WINNT/client_config/drivemap.cpp
src/WINNT/client_config/drivemap.h
src/WINNT/client_creds/main.cpp

index 8e90e3db5b6ec3ddb9b9acf5d6b5bb2afab71a38..afefb57b397b4105e0383762da4b4842b568541f 100644 (file)
@@ -10,6 +10,7 @@
 #include <afs/param.h>
 #include <afs/stds.h>
 
+#include <errno.h>
 #ifndef DJGPP
 #include <windows.h>
 #include <winsock2.h>
 #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
 #define EREMOTE                 WSAEREMOTE
 #endif /* EWOULDBLOCK */
 #endif /* !DJGPP */
+#include <afs/unified_afs.h>
+
 #include <string.h>
 #include <malloc.h>
-
 #include <osi.h>
 #include <rx/rx.h>
 
-#include <errno.h>
-#include <afs/unified_afs.h>
-
 #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;
 }
index 38e8ef9612009e10e83be73792c8b16ab6c5ddcc..aa92adf0b3d0d71d11ca13b1019c32e15dbb8f8d 100644 (file)
@@ -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;i<len;i++)
-               pname[i]='a'+(rand() % 26);
-       pname[len]=0;
+    if (fUserName)
+    {          //user name was passed through command line, use once
+       fUserName=FALSE;
        return;
+    }
+    srand( (unsigned)time( NULL ) );
+    for (int i=0;i<len;i++)
+       pname[i]='a'+(rand() % 26);
+    pname[len]=0;
+    return;
 }
 
 /*
@@ -1071,14 +1071,14 @@ void GenRandomName(TCHAR *pname,int len)
 BOOL TestAndDoMapShare(DWORD dwState)
 {
     if ((dwState!=SERVICE_RUNNING) || (dwOldState!=SERVICE_START_PENDING))
-       {
-               dwOldState=dwState;
-               return TRUE;
-       }
-       dwOldState=SERVICE_RUNNING;
-       if (RWLogonOption(TRUE,LOGON_OPTION_HIGHSECURITY))
-           return (DoMapShare() && GlobalMountDrive());
-       return GlobalMountDrive();
+    {
+       dwOldState=dwState;
+       return TRUE;
+    }
+    dwOldState=SERVICE_RUNNING;
+    if (RWLogonOption(TRUE,LOGON_OPTION_HIGHSECURITY))
+       return (DoMapShare() && GlobalMountDrive());
+    return GlobalMountDrive();
 }
 
 BOOL IsServiceActive()
@@ -1102,120 +1102,119 @@ BOOL IsServiceActive()
 
 void TestAndDoUnMapShare()
 {
-       if (!RWLogonOption(TRUE,LOGON_OPTION_HIGHSECURITY))
-               return;
-       DoUnMapShare(FALSE);    
+    if (!RWLogonOption(TRUE,LOGON_OPTION_HIGHSECURITY))
+       return;
+    DoUnMapShare(FALSE);       
 }
 
 void DoUnMapShare(BOOL drivemap)       //disconnect drivemap 
 {
-       TCHAR szMachine[MAX_PATH],szPath[MAX_PATH];
-       DWORD rc=28;
-       HANDLE hEnum;
-       LPNETRESOURCE lpnrLocal,lpnr=NULL;
-       DWORD res;
-       DWORD cbBuffer=16384;
-       DWORD cEntries=-1;
-       CHAR *pSubmount="";
+    TCHAR szMachine[MAX_PATH],szPath[MAX_PATH];
+    DWORD rc=28;
+    HANDLE hEnum;
+    LPNETRESOURCE lpnrLocal,lpnr=NULL;
+    DWORD res;
+    DWORD cbBuffer=16384;
+    DWORD cEntries=-1;
+    CHAR *pSubmount="";
 
     memset(szMachine, '\0', sizeof(szMachine));
     GetClientNetbiosName(szMachine);
 
    // Initialize the data structure
-       if ((res=WNetOpenEnum(RESOURCE_CONNECTED,RESOURCETYPE_DISK,RESOURCEUSAGE_CONNECTABLE,lpnr,&hEnum))!=NO_ERROR)
-               return;
-       sprintf(szPath,"\\\\%s\\",szMachine);
-       _strlwr(szPath);
-       lpnrLocal=(LPNETRESOURCE) GlobalAlloc(GPTR,cbBuffer);
-       do {
-               memset(lpnrLocal,0,cbBuffer);
-               if ((res = WNetEnumResource(hEnum,&cEntries,lpnrLocal,&cbBuffer))==NO_ERROR)
+    if ((res=WNetOpenEnum(RESOURCE_CONNECTED,RESOURCETYPE_DISK,RESOURCEUSAGE_CONNECTABLE,lpnr,&hEnum))!=NO_ERROR)
+       return;
+    sprintf(szPath,"\\\\%s\\",szMachine);
+    _strlwr(szPath);
+    lpnrLocal=(LPNETRESOURCE) GlobalAlloc(GPTR,cbBuffer);
+    do {
+       memset(lpnrLocal,0,cbBuffer);
+       if ((res = WNetEnumResource(hEnum,&cEntries,lpnrLocal,&cbBuffer))==NO_ERROR)
+       {
+           for (DWORD i=0;i<cEntries;i++)
+           {
+               if (strstr(_strlwr(lpnrLocal[i].lpRemoteName),szPath))
                {
-                       for (DWORD i=0;i<cEntries;i++)
-                       {
-                               if (strstr(_strlwr(lpnrLocal[i].lpRemoteName),szPath))
-                               {
-                                       if ((lpnrLocal[i].lpLocalName) && (strlen(lpnrLocal[i].lpLocalName)>0))
-                                       {
-                                               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<cEntries;i++)
+           {
+               if (strstr(_strlwr(lpnrLocal[i].lpRemoteName),szPath)==NULL)
+                   continue;   //only look at real afs mappings
+               CHAR * pSubmount=strrchr(lpnrLocal[i].lpRemoteName,'\\')+1;
+               if (lstrcmpi(pSubmount,"all")==0) 
+                   continue;                           // do not remove 'all'
+               for (DWORD j=0;j<List.cSubmounts;j++)
                {
-                       for (DWORD i=0;i<cEntries;i++)
-                       {
-                               if (strstr(_strlwr(lpnrLocal[i].lpRemoteName),szPath)==NULL)
-                                       continue;       //only look at real afs mappings
-                               CHAR * pSubmount=strrchr(lpnrLocal[i].lpRemoteName,'\\')+1;
-                               if (lstrcmpi(pSubmount,"all")==0) 
-                                       continue;                               // do not remove 'all'
-                               for (DWORD j=0;j<List.cSubmounts;j++)
-                               {
-                                       if (
-                                               (List.aSubmounts[j].szSubmount[0]) &&
-                                               (lstrcmpi(List.aSubmounts[j].szSubmount,pSubmount)==0)
-                                               ) 
-                                       {
-                                               List.aSubmounts[j].fInUse=TRUE; 
-                                               goto nextname;
-                                       }
-                               }
-                               // wasn't on list so lets remove
-                               DisMountDOSDrive(pSubmount);
-                               nextname:;
-                       }
+                   if ((List.aSubmounts[j].szSubmount[0]) &&
+                        (lstrcmpi(List.aSubmounts[j].szSubmount,pSubmount)==0)
+                        ) 
+                   {
+                       List.aSubmounts[j].fInUse=TRUE; 
+                       goto nextname;
+                   }
                }
-       } while (res!=ERROR_NO_MORE_ITEMS);
-       GlobalFree((HGLOBAL)lpnrLocal);
-       WNetCloseEnum(hEnum);
-       sprintf(szPath,"\\\\%s\\all",szMachine);
+               // wasn't on list so lets remove
+               DisMountDOSDrive(pSubmount);
+             nextname:;
+           }
+       }
+    } while (res!=ERROR_NO_MORE_ITEMS);
+    GlobalFree((HGLOBAL)lpnrLocal);
+    WNetCloseEnum(hEnum);
+    sprintf(szPath,"\\\\%s\\all",szMachine);
 
-       // Lets connect all submounts that weren't connectd
+    // Lets connect all submounts that weren't connectd
     DWORD cbUser=MAXRANDOMNAMELEN-1;
-       CHAR szUser[MAXRANDOMNAMELEN];
+    CHAR szUser[MAXRANDOMNAMELEN];
     CHAR * pUser = NULL;
-       if (WNetGetUser(szPath,(LPSTR)szUser,&cbUser)!=NO_ERROR) {
+    if (WNetGetUser(szPath,(LPSTR)szUser,&cbUser)!=NO_ERROR) {
         if (RWLogonOption(TRUE,LOGON_OPTION_HIGHSECURITY)) {
             if (!pUserName[0]) {
                 GenRandomName(szUser,MAXRANDOMNAMELEN-1);
@@ -1225,42 +1224,42 @@ BOOL DoMapShareChange()
             }
         }
     } else {
-               if ((pUser=strchr(szUser,'\\'))!=NULL)
+       if ((pUser=strchr(szUser,'\\'))!=NULL)
             pUser++;
-       }
+    }
 
     for (DWORD j=0;j<List.cSubmounts;j++)
-       {
-               if (List.aSubmounts[j].fInUse)
-                       continue;
-               DWORD res=MountDOSDrive(0,List.aSubmounts[j].szSubmount,FALSE,pUser);
-       }
-       return TRUE;
+    {
+       if (List.aSubmounts[j].fInUse)
+           continue;
+       DWORD res=MountDOSDrive(0,List.aSubmounts[j].szSubmount,FALSE,pUser);
+    }
+    return TRUE;
 }
 
 BOOL DoMapShare()
 {
-       DRIVEMAPLIST List;
-       DWORD rc=28;
-       BOOL bMappedAll=FALSE;
+    DRIVEMAPLIST List;
+    DWORD rc=28;
+    BOOL bMappedAll=FALSE;
 
    // Initialize the data structure
-       DEBUG_EVENT0("AFS DoMapShare");
-       QueryDriveMapList (&List);
-       DoUnMapShare(TRUE);
-       // All connections have been removed
-       // Lets restore them after making the connection from the random name
+    DEBUG_EVENT0("AFS DoMapShare");
+    QueryDriveMapList (&List);
+    DoUnMapShare(TRUE);
+    // All connections have been removed
+    // Lets restore them after making the connection from the random name
 
-       TCHAR szMachine[ MAX_PATH],szPath[MAX_PATH];
+    TCHAR szMachine[ MAX_PATH],szPath[MAX_PATH];
     memset(szMachine, '\0', sizeof(szMachine));
     GetClientNetbiosName(szMachine);
     sprintf(szPath,"\\\\%s\\all",szMachine);
 
     // Lets connect all submounts that weren't connectd
     DWORD cbUser=MAXRANDOMNAMELEN-1;
-       CHAR szUser[MAXRANDOMNAMELEN];
+    CHAR szUser[MAXRANDOMNAMELEN];
     CHAR * pUser = NULL;
-       if (WNetGetUser(szPath,(LPSTR)szUser,&cbUser)!=NO_ERROR) {
+    if (WNetGetUser(szPath,(LPSTR)szUser,&cbUser)!=NO_ERROR) {
         if (RWLogonOption(TRUE,LOGON_OPTION_HIGHSECURITY)) {
             if (!pUserName[0]) {
                 GenRandomName(szUser,MAXRANDOMNAMELEN-1);
@@ -1270,33 +1269,33 @@ BOOL DoMapShare()
             }
         }
     } else {
-               if ((pUser=strchr(szUser,'\\'))!=NULL)
+       if ((pUser=strchr(szUser,'\\'))!=NULL)
             pUser++;
-       }
+    }
 
-       for (DWORD i=0;i<List.cSubmounts;i++)
+    for (DWORD i=0;i<List.cSubmounts;i++)
+    {
+       if (List.aSubmounts[i].szSubmount[0])
        {
-               if (List.aSubmounts[i].szSubmount[0])
-               {
-                       DWORD res=MountDOSDrive(0,List.aSubmounts[i].szSubmount,FALSE,pUser);
-                       if (lstrcmpi("all",List.aSubmounts[i].szSubmount)==0)
-                               bMappedAll=TRUE;
-               }
+           DWORD res=MountDOSDrive(0,List.aSubmounts[i].szSubmount,FALSE,pUser);
+           if (lstrcmpi("all",List.aSubmounts[i].szSubmount)==0)
+               bMappedAll=TRUE;
        }
-       if (!bMappedAll)        //make sure all is mapped also
-       {
+    }
+    if (!bMappedAll)   //make sure all is mapped also
+    {
         DWORD res=MountDOSDrive(0,"all",FALSE,pUser);
         if (res==ERROR_SESSION_CREDENTIAL_CONFLICT)
         {
             DisMountDOSDrive("all");
             MountDOSDrive(0,"all",FALSE,pUser);
         }
-       }
-       for (TCHAR chDrive = chDRIVE_A; chDrive <= chDRIVE_Z; ++chDrive)
+    }
+    for (TCHAR chDrive = chDRIVE_A; chDrive <= chDRIVE_Z; ++chDrive)
+    {
+       if (List.aDriveMap[chDrive-chDRIVE_A].fActive ||
+            ForceMapActive(chDrive))
        {
-               if (List.aDriveMap[chDrive-chDRIVE_A].fActive ||
-            ForceMapActive(chDrive))
-               {
             TCHAR szSubmount[ MAX_PATH ];
             if (List.aDriveMap[chDrive-chDRIVE_A].szSubmount[0])
                 lstrcpy(szSubmount,List.aDriveMap[chDrive-chDRIVE_A].szSubmount);
@@ -1306,12 +1305,12 @@ BOOL DoMapShare()
             BOOL fPersistent = List.aDriveMap[chDrive-chDRIVE_A].fPersistent;
             if (RWLogonOption(TRUE,LOGON_OPTION_HIGHSECURITY))
                 fPersistent = FALSE;
-                   DWORD res=MountDOSDrive(chDrive
-                                           ,szSubmount
-                                           ,fPersistent,pUser);
-               }
+           DWORD res=MountDOSDrive(chDrive
+                                    ,szSubmount
+                                    ,fPersistent,pUser);
        }
-       return TRUE;
+    }
+    return TRUE;
 }
 
 BOOL GlobalMountDrive()
index 9165d1121e01f0366acf7fccb8bf58987219cb79..d0726f1d27e6383b920c13faa1b7773918959457 100644 (file)
@@ -89,7 +89,7 @@ BOOL TestAndDoMapShare(DWORD);
 BOOL DoMapShare();
 void MapShareName(char *);
 void DoUnMapShare(BOOL);
-BOOL DoMapShareChange();
+BOOL DoMapShareChange(BOOL removeUnknown=TRUE);
 DWORD RWLogonOption(BOOL read,DWORD value);
 BOOL GlobalMountDrive();
 DWORD MountDOSDrive(char chDrive,const char *szSubmount,BOOL bPresistant=TRUE,const char *puser=NULL);
index 11bf7d742dcd0cebcd3ccc313d4a819b5b50e0ca..744af343a05653f0315dc2d7c4e6c59385c72e16 100644 (file)
@@ -334,7 +334,7 @@ BOOL InitApp (LPSTR pszCmdLineA)
       {
           if ( IsDebuggerPresent() )
               OutputDebugString("Renewing Drive Maps\n");
-          DoMapShare();
+          DoMapShareChange(FALSE);
       }
       if (fShow)
       {