static struct
{
int (*main_fn)(int, char **);
- event *stop_event;
int connected;
SERVICE_STATUS_HANDLE hServiceStatus;
char *name;
is_service = 1;
globdat.main_fn = main_fn;
- globdat.stop_event = create_event(0, 0, "apache-signal");
globdat.connected = 1;
if(!StartServiceCtrlDispatcher(dispatchTable))
}
else
{
-
return(globdat.exit_status);
}
}
// RETURN VALUE:
// none
//
-// COMMENTS:
+// COMMENTS: See the user-defined Handler() entry in the PSDK
//
VOID WINAPI service_ctrl(DWORD dwCtrlCode)
{
- int state;
-
- state = globdat.ssStatus.dwCurrentState;
switch(dwCtrlCode)
{
// Stop the service.
case SERVICE_CONTROL_STOP:
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, NULL,
"Service Stop/Shutdown signaled, shutting down server.");
- state = SERVICE_STOP_PENDING;
- ap_start_shutdown();
+ ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 15000);
+ ap_start_shutdown();
+ ReportStatusToSCMgr(SERVICE_STOPPED, NO_ERROR, 0);
break;
case SERVICE_APACHE_RESTART:
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_INFO, NULL,
"Service Restart signaled, shutting down server.");
- state = SERVICE_START_PENDING;
- ap_start_restart(1);
+ ReportStatusToSCMgr(SERVICE_START_PENDING, NO_ERROR, 15000);
+ ap_start_restart(1);
break;
// Update the service status.
//
case SERVICE_CONTROL_INTERROGATE:
- ReportStatusToSCMgr(state, NO_ERROR, 0);
- return;
+ ReportStatusToSCMgr(globdat.ssStatus.dwCurrentState, NO_ERROR, 0);
+ break;
- // invalid control code
+ // invalid control code, ignored
//
default:
- return;
-
+ break;
}
-
- ReportStatusToSCMgr(state, NO_ERROR, 15000);
}
static int checkPoint = 1;
int rv;
- if(firstTime)
+ if (firstTime)
{
firstTime = 0;
globdat.ssStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
globdat.ssStatus.dwCheckPoint = 1;
}
- if(globdat.connected)
+ if (globdat.connected)
{
if ((currentState == SERVICE_START_PENDING)
|| (currentState == SERVICE_STOP_PENDING))
globdat.ssStatus.dwCurrentState = currentState;
globdat.ssStatus.dwWin32ExitCode = exitCode;
- if(waitHint)
- globdat.ssStatus.dwWaitHint = waitHint;
if ( ( currentState == SERVICE_RUNNING ) ||
( currentState == SERVICE_STOPPED ) )
globdat.ssStatus.dwWaitHint = 0;
globdat.ssStatus.dwCheckPoint = 0;
}
- else
+ else
+ {
+ if(waitHint)
+ globdat.ssStatus.dwWaitHint = waitHint;
globdat.ssStatus.dwCheckPoint = ++checkPoint;
+ }
rv = SetServiceStatus(globdat.hServiceStatus, &globdat.ssStatus);
}