+/*
+ * 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>
long code;
DWORD dwRet = ERROR_CALL_NOT_IMPLEMENTED;
OSVERSIONINFO osVersion;
+ DWORD dwCurrentState = ServiceStatus.dwCurrentState;
/* Get the version of Windows */
memset(&osVersion, 0x00, sizeof(osVersion));
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 */
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;
#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
{
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;
}
}
/* Notify any volume status handlers that the cache manager has started */
cm_VolStatus_Service_Started();
+ code = RDR_Initialize();
+ 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.
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();
afsd_ShutdownCM();
+ RpcShutdown();
+
cm_ShutdownMappedMemory();
+ if (RDR_Initialized) {
+ RDR_ShutdownFinal();
+ afsi_log("RDR shutdown complete");
+ }
+
rx_Finalize();
afsi_log("rx finalization complete");