windows-vista-resume-smb-binding-20080202
authorJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 2 Feb 2008 22:25:40 +0000 (22:25 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 2 Feb 2008 22:25:40 +0000 (22:25 +0000)
LICENSE MIT

another plane trip, more tweaks to the logic for handling re-binding
of the netbios name after a power management resume event.

src/WINNT/afsd/afsd_service.c
src/WINNT/afsd/smb.c

index ac58d2a..e0d3576 100644 (file)
@@ -393,8 +393,9 @@ afsd_ServiceControlHandlerEx(
                    /* This is the message delivered once all devices are up */
                     afsi_log("SERVICE_CONTROL_APMRESUMEAUTOMATIC"); 
                    powerStateSuspended = 0;
-                   if (osVersion.dwMajorVersion >= 6)
-                       smb_RestartListeners(0);
+                   if (osVersion.dwMajorVersion >= 6) {
+                       smb_SetLanAdapterChangeDetected();
+                    }
                     dwRet = NO_ERROR;                       
                     break;                                  
                 default:                                                                          
index ddd0741..f3c1e1c 100644 (file)
@@ -8349,9 +8349,31 @@ exit_thread:
     return;
 }
 
+static void
+smb_LanAdapterChangeThread(void *param)
+{
+    /* 
+     * Give the IPAddrDaemon thread a chance
+     * to block before we trigger.
+     */
+    Sleep(30000);
+    smb_LanAdapterChange(0);
+}
+
 void smb_SetLanAdapterChangeDetected(void)
 {
+    int lpid;
+    thread_t phandle;
+
     lock_ObtainMutex(&smb_StartedLock);
+
+    if (!powerStateSuspended) {
+        phandle = thrd_Create(NULL, 65536, (ThreadFunc) smb_LanAdapterChangeThread,
+                              NULL, 0, &lpid, "smb_LanAdapterChange");
+        osi_assertx(phandle != NULL, "smb_LanAdapterChangeThread thread creation failure");
+        thrd_CloseHandle(phandle);
+    }
+
     smb_LanAdapterChangeDetected = 1;
     lock_ReleaseMutex(&smb_StartedLock);
 }
@@ -8635,6 +8657,9 @@ void smb_RestartListeners(int locked)
     if (!locked)
         lock_ObtainMutex(&smb_StartedLock);
 
+    if (powerStateSuspended)
+        afsi_log("smb_RestartListeners called while suspended");
+
     if (!powerStateSuspended && smb_ListenerState != SMB_LISTENER_UNINITIALIZED) {
        if (smb_ListenerState == SMB_LISTENER_STOPPED) {
             if (smb_NetbiosInit(1))