Windows: update GetFileVersionInformation fail msg
[openafs.git] / src / WINNT / afsd / afsd_service.c
index 873e6d0..ea47deb 100644 (file)
@@ -1,3 +1,11 @@
+/*
+ * Copyright 2000, International Business Machines Corporation and others.
+ * All Rights Reserved.
+ *
+ * This software has been released under the terms of the IBM Public
+ * License.  For details, see the LICENSE file in the top-level source
+ * directory or online at http://www.openafs.org/dl/license10.html
+ */
 
 #include <afsconfig.h>
 #include <afs/param.h>
@@ -117,7 +125,7 @@ static void afsd_notifier(char *msgp, char *filep, long line)
 
     if (bRunningAsService) {
         ServiceStatus.dwCurrentState = SERVICE_STOPPED;
-        ServiceStatus.dwWin32ExitCode = NO_ERROR;
+        ServiceStatus.dwWin32ExitCode = ERROR_EXCEPTION_IN_SERVICE;
         ServiceStatus.dwCheckPoint = 0;
         ServiceStatus.dwWaitHint = 0;
         ServiceStatus.dwControlsAccepted = 0;
@@ -249,6 +257,7 @@ afsd_ServiceControlHandlerEx(
     long code;
     DWORD dwRet = ERROR_CALL_NOT_IMPLEMENTED;
     OSVERSIONINFO osVersion;
+    DWORD dwCurrentState = ServiceStatus.dwCurrentState;
 
     /* Get the version of Windows */
     memset(&osVersion, 0x00, sizeof(osVersion));
@@ -272,7 +281,8 @@ afsd_ServiceControlHandlerEx(
         SetServiceStatus(StatusHandle, &ServiceStatus);
 
         /* Write all dirty buffers back to server */
-       if ( !lana_OnlyLoopback() )
+       if (dwCurrentState == SERVICE_RUNNING &&
+            !lana_OnlyLoopback() )
            buf_CleanAndReset();
 
         /* Force trace if requested */
@@ -307,6 +317,7 @@ afsd_ServiceControlHandlerEx(
         ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_POWEREVENT;
         SetServiceStatus(StatusHandle, &ServiceStatus);
         afsi_log("SERVICE_CONTROL_INTERROGATE");
+        osi_Log0(afsd_logp, "SERVICE_CONTROL_INTERROGATE");
         dwRet = NO_ERROR;
         break;
 
@@ -317,6 +328,7 @@ afsd_ServiceControlHandlerEx(
 #ifdef DEBUG
            afsi_log("SERVICE_CONTROL_POWEREVENT");
 #endif
+           osi_Log0(afsd_logp, "SERVICE_CONTROL_POWEREVENT");
             /*
             ** dwEventType of this notification == WPARAM of WM_POWERBROADCAST
             ** Return NO_ERROR == return TRUE for that message, i.e. accept request
@@ -328,87 +340,134 @@ afsd_ServiceControlHandlerEx(
                 {
                 case PBT_APMQUERYSUSPEND:
                     afsi_log("SERVICE_CONTROL_APMQUERYSUSPEND");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMQUERYSUSPEND");
                     /* Write all dirty buffers back to server */
-                   if ( !lana_OnlyLoopback() ) {
+                   if ( !lana_OnlyLoopback() )
                        buf_CleanAndReset();
-                        cm_SuspendSCache();
-                    }
                     afsi_log("SERVICE_CONTROL_APMQUERYSUSPEND buf_CleanAndReset complete");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMQUERYSUSPEND buf_CleanAndReset complete");
                     dwRet = NO_ERROR;
                     break;
                 case PBT_APMQUERYSTANDBY:
                     afsi_log("SERVICE_CONTROL_APMQUERYSTANDBY");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMQUERYSTANDBY");
                     /* Write all dirty buffers back to server */
-                   if ( !lana_OnlyLoopback() ) {
+                   if ( !lana_OnlyLoopback() )
                        buf_CleanAndReset();
-                        cm_SuspendSCache();
-                    }
                     afsi_log("SERVICE_CONTROL_APMQUERYSTANDBY buf_CleanAndReset complete");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMQUERYSTANDBY buf_CleanAndReset complete");
                     dwRet = NO_ERROR;
                     break;
 
                     /* allow remaining case PBT_WhatEver */
                 case PBT_APMSUSPEND:
                     afsi_log("SERVICE_CONTROL_APMSUSPEND");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMSUSPEND");
                    powerStateSuspended = 1;
-                   if (osVersion.dwMajorVersion >= 6) {
-                        cm_SuspendSCache();
+                   if (osVersion.dwMajorVersion >= 6)
                        smb_StopListeners(0);
-                    }
+
+                    if (RDR_Initialized)
+                        RDR_Suspend();
+                    cm_SuspendSCache();
+
                     dwRet = NO_ERROR;
+                    afsi_log("SERVICE_CONTROL_APMSUSPEND complete");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMSUSPEND complete");
                     break;
                 case PBT_APMSTANDBY:
                     afsi_log("SERVICE_CONTROL_APMSTANDBY");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMSTANDBY");
                    powerStateSuspended = 1;
-                   if (osVersion.dwMajorVersion >= 6) {
-                        cm_SuspendSCache();
+                   if (osVersion.dwMajorVersion >= 6)
                        smb_StopListeners(0);
-                    }
+                    if (RDR_Initialized)
+                        RDR_Suspend();
+                    cm_SuspendSCache();
                     dwRet = NO_ERROR;
+                    afsi_log("SERVICE_CONTROL_APMSTANDBY complete");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMSTANDBY complete");
                     break;
                 case PBT_APMRESUMECRITICAL:
                     afsi_log("SERVICE_CONTROL_APMRESUMECRITICAL");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMRESUMECRITICAL");
                    if (osVersion.dwMajorVersion >= 6)
                        smb_RestartListeners(0);
+                    cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, NULL);
+                    if (RDR_Initialized)
+                        RDR_Resume();
                     dwRet = NO_ERROR;
+                    afsi_log("SERVICE_CONTROL_APMRESUMECRITICAL complete");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMRESUMECRITICAL complete");
                     break;
                 case PBT_APMRESUMESUSPEND:
                    /* User logged in after suspend */
                     afsi_log("SERVICE_CONTROL_APMRESUMESUSPEND");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMRESUMESUSPEND");
+                   powerStateSuspended = 0;
+                    cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, NULL);
+                   if (osVersion.dwMajorVersion >= 6)
+                       smb_RestartListeners(0);
+                   if (smb_Enabled && osVersion.dwMajorVersion >= 6) {
+                       smb_SetLanAdapterChangeDetected();
+                    }
+                    if (RDR_Initialized)
+                        RDR_Resume();
                     dwRet = NO_ERROR;
+                    afsi_log("SERVICE_CONTROL_APMRESUMESUSPEND complete");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMRESUMESUSPEND complete");
                     break;
                 case PBT_APMRESUMESTANDBY:
                    /* User logged in after standby */
                     afsi_log("SERVICE_CONTROL_APMRESUMESTANDBY");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMRESUMESTANDBY");
+                   powerStateSuspended = 0;
+                    cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, NULL);
+                   if (osVersion.dwMajorVersion >= 6)
+                       smb_RestartListeners(0);
+                   if (smb_Enabled && osVersion.dwMajorVersion >= 6) {
+                       smb_SetLanAdapterChangeDetected();
+                    }
+                    if (RDR_Initialized)
+                        RDR_Resume();
                     dwRet = NO_ERROR;
+                    afsi_log("SERVICE_CONTROL_APMRESUMESTANDBY complete");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMRESUMESTANDBY complete");
                     break;
                 case PBT_APMBATTERYLOW:
                     afsi_log("SERVICE_CONTROL_APMBATTERYLOW");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMBATTERYLOW");
                     dwRet = NO_ERROR;
                     break;
                 case PBT_APMPOWERSTATUSCHANGE:
 #ifdef DEBUG
                    afsi_log("SERVICE_CONTROL_APMPOWERSTATUSCHANGE");
 #endif
+                   osi_Log0(afsd_logp,"SERVICE_CONTROL_APMPOWERSTATUSCHANGE");
                     dwRet = NO_ERROR;
                     break;
                 case PBT_APMOEMEVENT:
 #ifdef DEBUG
                     afsi_log("SERVICE_CONTROL_APMOEMEVENT");
 #endif
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMOEMEVENT");
                     dwRet = NO_ERROR;
                     break;
                 case PBT_APMRESUMEAUTOMATIC:
                    /* This is the message delivered once all devices are up */
                     afsi_log("SERVICE_CONTROL_APMRESUMEAUTOMATIC");
-                   powerStateSuspended = 0;
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMRESUMEAUTOMATIC");
                    if (smb_Enabled && osVersion.dwMajorVersion >= 6) {
                        smb_SetLanAdapterChangeDetected();
                     }
+                    cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, NULL);
                     dwRet = NO_ERROR;
+                    afsi_log("SERVICE_CONTROL_APMRESUMEAUTOMATIC complete");
+                    osi_Log0(afsd_logp,"SERVICE_CONTROL_APMRESUMEAUTOMATIC complete");
                     break;
                 default:
                     afsi_log("SERVICE_CONTROL_unknown");
+                    osi_Log1(afsd_logp, "SERVICE_CONTROL_unknown: 0x%x", dwEventType);
                     dwRet = NO_ERROR;
                 }
             }
@@ -583,7 +642,7 @@ GetVersionInfo( CHAR * filename, CHAR * szOutput, DWORD dwOutput )
     DWORD size = GetFileVersionInfoSize(filename, &dwVersionHandle);
 
     if (!size) {
-        afsi_log("GetFileVersionInfoSize failed");
+       afsi_log("GetFileVersionInfoSize(%s) failed", filename);
         return GetLastError();
     }
 
@@ -1327,6 +1386,26 @@ afsd_Main(DWORD argc, LPTSTR *argv)
         /* Notify any volume status handlers that the cache manager has started */
         cm_VolStatus_Service_Started();
 
+        code = RDR_Initialize();
+        if ( code == ERROR_SERVICE_DISABLED) {
+            afsi_log("RDR_Initialize failed: 1058 (Unable to load AFSRedirLib.sys)");
+            osi_panic(reason, __FILE__, __LINE__);
+        } else {
+            RDR_Initialized = !code;
+            afsi_log("RDR_Initialize returned: (code = %d)", code);
+        }
+
+        if (RDR_Initialized) {
+            if (cm_sysNameCount)
+                RDR_SysName( AFS_SYSNAME_ARCH_32BIT, cm_sysNameCount, cm_sysNameList );
+#ifdef _WIN64
+            if (cm_sysName64Count)
+                RDR_SysName( AFS_SYSNAME_ARCH_64BIT, cm_sysName64Count, cm_sysName64List );
+            else if (cm_sysNameCount)
+                RDR_SysName( AFS_SYSNAME_ARCH_64BIT, cm_sysNameCount, cm_sysNameList );
+#endif
+        }
+
         /*
          * Set the default for the SMB interface based upon the state of the
          * Redirector interface.
@@ -1464,11 +1543,15 @@ afsd_Main(DWORD argc, LPTSTR *argv)
     DismountGlobalDrives();
     afsi_log("Global Drives dismounted");
 
+    if (RDR_Initialized) {
+        RDR_ShutdownNotify();
+        cm_VolStatus_SetRDRNotifications(FALSE);
+        afsi_log("RDR notified of shutdown");
+    }
+
     smb_Shutdown();
     afsi_log("smb shutdown complete");
 
-    RpcShutdown();
-
     cm_ReleaseAllLocks();
 
     cm_DaemonShutdown();
@@ -1479,8 +1562,15 @@ afsd_Main(DWORD argc, LPTSTR *argv)
 
     afsd_ShutdownCM();
 
+    RpcShutdown();
+
     cm_ShutdownMappedMemory();
 
+    if (RDR_Initialized) {
+        RDR_ShutdownFinal();
+        afsi_log("RDR shutdown complete");
+    }
+
     rx_Finalize();
     afsi_log("rx finalization complete");