+/*
+ * 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>
static int powerEventsRegistered = 0;
extern int powerStateSuspended = 0;
+extern int RDR_Initialized = 0;
static VOID (WINAPI* pRtlCaptureContext)(PCONTEXT ContextRecord) = NULL;
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;
afsi_log("SERVICE_CONTROL_SHUTDOWN");
/* Write all dirty buffers back to server */
- if ( !lana_OnlyLoopback() )
+ if (cm_noIPAddr > 0)
buf_CleanAndReset();
/* Force trace if requested */
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 &&
+ cm_noIPAddr > 0)
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
** i.e. as if returning BROADCAST_QUERY_DENY
*/
if (powerEventsRegistered) {
- switch((int) dwEventType)
+ cm_UpdateIFInfo();
+
+ switch((int) dwEventType)
{
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 (cm_noIPAddr > 0)
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 (cm_noIPAddr > 0)
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");
- powerStateSuspended = 1;
- if (osVersion.dwMajorVersion >= 6) {
- cm_SuspendSCache();
- smb_StopListeners(0);
- }
+ osi_Log0(afsd_logp,"SERVICE_CONTROL_APMSUSPEND");
+ if (!powerStateSuspended) {
+ powerStateSuspended = 1;
+ 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");
- powerStateSuspended = 1;
- if (osVersion.dwMajorVersion >= 6) {
- cm_SuspendSCache();
- smb_StopListeners(0);
- }
+ osi_Log0(afsd_logp,"SERVICE_CONTROL_APMSTANDBY");
+ if (!powerStateSuspended) {
+ powerStateSuspended = 1;
+ 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");
- if (osVersion.dwMajorVersion >= 6)
- smb_RestartListeners(0);
+ osi_Log0(afsd_logp,"SERVICE_CONTROL_APMRESUMECRITICAL");
+ if (powerStateSuspended) {
+ powerStateSuspended = 0;
+ if (osVersion.dwMajorVersion >= 6)
+ smb_RestartListeners(0);
+ cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS
+ | CM_FLAG_CHECKUPSERVERS, 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");
+ if (powerStateSuspended) {
+ powerStateSuspended = 0;
+ cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS
+ | CM_FLAG_CHECKUPSERVERS, 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");
+ if (powerStateSuspended) {
+ powerStateSuspended = 0;
+ cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS
+ | CM_FLAG_CHECKUPSERVERS, 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;
- if (osVersion.dwMajorVersion >= 6) {
- smb_SetLanAdapterChangeDetected();
- }
+ osi_Log0(afsd_logp,"SERVICE_CONTROL_APMRESUMEAUTOMATIC");
+ if (powerStateSuspended) {
+ powerStateSuspended = 0;
+ cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS
+ | CM_FLAG_CHECKUPSERVERS, 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_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;
}
}
DWORD size = GetFileVersionInfoSize(filename, &dwVersionHandle);
if (!size) {
- afsi_log("GetFileVersionInfoSize failed");
+ afsi_log("GetFileVersionInfoSize(%s) failed", filename);
return GetLastError();
}
/* 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.
+ */
+ smb_Enabled = !RDR_Initialized;
+
code = afsd_InitSMB(&reason, MessageBox);
- if (code != 0) {
+ if (smb_Enabled && code != 0) {
afsi_log("afsd_InitSMB failed: %s (code = %d)", reason, code);
osi_panic(reason, __FILE__, __LINE__);
}
+ if (!smb_Enabled && !RDR_Initialized) {
+ afsi_log("Neither RDR nor SMB interfaces available");
+ osi_panic(reason, __FILE__, __LINE__);
+ }
+
/* allow an exit to be called post smb initialization */
hHookDll = cm_LoadAfsdHookLib();
if (hHookDll)
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");
/* Remove the ExceptionFilter */
SetUnhandledExceptionFilter(NULL);
+ LogEvent(EVENTLOG_INFORMATION_TYPE, MSG_SERVICE_STOPPED);
+
if (bRunningAsService) {
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode = GlobalStatus ? ERROR_EXCEPTION_IN_SERVICE : NO_ERROR;