/* * ServiceControl(): Handles requests from the SCM and passes them on * to named. */ void ServiceControl(DWORD dwCtrlCode) { /* Handle the requested control code */ switch(dwCtrlCode) { case SERVICE_CONTROL_INTERROGATE: UpdateSCM(0); break; case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: ns_server_flushonshutdown(ns_g_server, ISC_TRUE); isc_app_shutdown(); UpdateSCM(SERVICE_STOPPED); break; default: break; } }
/* * Initialize the Service by registering it. */ void ntservice_init(void) { if (!foreground) { /* Register handler with the SCM */ hServiceStatus = RegisterServiceCtrlHandler(BIND_SERVICE_NAME, (LPHANDLER_FUNCTION)ServiceControl); if (!hServiceStatus) { ns_main_earlyfatal( "could not register service control handler"); UpdateSCM(SERVICE_STOPPED); exit(1); } UpdateSCM(SERVICE_RUNNING); } else { strcpy(ConsoleTitle, "BIND Version "); strcat(ConsoleTitle, VERSION); SetConsoleTitle(ConsoleTitle); } }
/* * Initialize the Service by registering it. */ void ntservice_init() { if (!foreground) { /* Register handler with the SCM */ hServiceStatus = RegisterServiceCtrlHandler(NTP_DISPLAY_NAME, (LPHANDLER_FUNCTION)ServiceControl); if (!hServiceStatus) { NTReportError(NTP_SERVICE_NAME, "could not register service control handler"); UpdateSCM(SERVICE_STOPPED); exit(1); } UpdateSCM(SERVICE_RUNNING); } else { strcpy(ConsoleTitle, "NTP Version "); strcat(ConsoleTitle, Version); SetConsoleTitle(ConsoleTitle); } atexit( ntservice_exit ); }
/* * ServiceControl(): Handles requests from the SCM and passes them on * to the service. */ void ServiceControl(DWORD dwCtrlCode) { /* Handle the requested control code */ HANDLE exitEvent = get_exit_event(); switch(dwCtrlCode) { case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: UpdateSCM(SERVICE_STOP_PENDING); if (exitEvent != NULL) { SetEvent(exitEvent); Sleep( 100 ); //##++ } return; case SERVICE_CONTROL_PAUSE: case SERVICE_CONTROL_CONTINUE: case SERVICE_CONTROL_INTERROGATE: default: break; } UpdateSCM(SERVICE_RUNNING); }
/* service_ctrl - control handler for NTP service * signals the service_main routine of start/stop requests * from the control panel or other applications making * win32API calls */ void ntservice_exit( void ) { if (!foreground) { /* did not become a service, simply exit */ /* service mode, need to have the service_main routine * register with the service control manager that the * service has stopped running, before exiting */ UpdateSCM(SERVICE_STOPPED); } uninit_io_completion_port(); Sleep( 200 ); //##++ reset_winnt_time(); msyslog(LOG_INFO, "ntservice: The Network Time Protocol Service has stopped."); # ifdef DEBUG _CrtDumpMemoryLeaks(); # endif }
void ntservice_shutdown(void) { UpdateSCM(SERVICE_STOPPED); }