From 21d6a3477334c4b6b822f5e2f1d5739bb22c9b75 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sat, 5 Jan 2008 17:56:29 +0000 Subject: [PATCH] DEVEL15-windows-vista-network-change-20080105 LICENSE MIT After a network change, test to see if the desired LAN adapter to bind the Netbios Name to has changed. If so, stop the Netbios Network and restart with the new LAN adapter. This can happen on Vista after a suspend if the service wakes up before the Loopback adapter re-initializes. (cherry picked from commit f970985bc35ade50371a9299ad580d96ad04e979) --- src/WINNT/afsd/cm_daemon.c | 1 + src/WINNT/afsd/smb.c | 24 +++++++++++++++++++++++- src/WINNT/afsd/smb.h | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/WINNT/afsd/cm_daemon.c b/src/WINNT/afsd/cm_daemon.c index bb97c27ee..48ac9c437 100644 --- a/src/WINNT/afsd/cm_daemon.c +++ b/src/WINNT/afsd/cm_daemon.c @@ -74,6 +74,7 @@ void cm_IpAddrDaemon(long parm) thrd_SetEvent(cm_IPAddrDaemon_ShutdownEvent); Result = NotifyAddrChange(NULL,NULL); if (Result == NO_ERROR && daemon_ShutdownFlag == 0) { + smb_LanAdapterChange(); thrd_ResetEvent(cm_IPAddrDaemon_ShutdownEvent); Sleep(2500); if (daemon_ShutdownFlag == 0) { diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index 6021e6c00..1f08b3f63 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -65,7 +65,7 @@ osi_rwlock_t smb_globalLock; osi_rwlock_t smb_rctLock; osi_mutex_t smb_ListenerLock; -char smb_LANadapter; +char smb_LANadapter = -1; unsigned char smb_sharename[NCBNAMSZ+1] = {0}; BOOL isGateway = FALSE; @@ -8754,6 +8754,28 @@ void smb_Listener(void *parmp) FreeNCB(ncbp); } + +void smb_LanAdapterChange(void) { + lana_number_t lanaNum; + BOOL bGateway; + char NetbiosName[MAX_NB_NAME_LENGTH] = ""; + int change = 0; + + if (SUCCEEDED(lana_GetUncServerNameEx(NetbiosName, &lanaNum, &bGateway, + LANA_NETBIOS_NAME_FULL))) { + if (smb_LANadapter != lanaNum || + isGateway != bGateway || + strcmp(cm_NetbiosName, NetbiosName)) + change = 1; + } + + if (change) { + afsi_log("Lan Adapter Change detected"); + smb_StopListeners(); + smb_RestartListeners(); + } +} + /* initialize Netbios */ int smb_NetbiosInit(void) { diff --git a/src/WINNT/afsd/smb.h b/src/WINNT/afsd/smb.h index 5c81451aa..b365bfa37 100644 --- a/src/WINNT/afsd/smb.h +++ b/src/WINNT/afsd/smb.h @@ -759,6 +759,7 @@ extern void smb_RestartListeners(void); extern void smb_StopListeners(void); extern void smb_StopListener(NCB *ncbp, int lana); extern long smb_IsNetworkStarted(void); +extern void smb_LanAdapterChange(void); #define SMB_LISTENER_UNINITIALIZED -1 #define SMB_LISTENER_STOPPED 0 -- 2.39.5