static VOID WINAPI ServiceCtrlHandler(DWORD ctrlCode) { serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; serviceStatus.dwCurrentState = SERVICE_RUNNING; serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; serviceStatus.dwWin32ExitCode = 0; serviceStatus.dwServiceSpecificExitCode = 0; serviceStatus.dwCheckPoint = 0; serviceStatus.dwWaitHint = 0; switch (ctrlCode) { case SERVICE_CONTROL_STOP: case SERVICE_CONTROL_SHUTDOWN: serviceStatus.dwCurrentState = SERVICE_STOP_PENDING; serviceStatus.dwWaitHint = 4000; SetServiceStatus(serviceHandle, &serviceStatus); /* notify other threads and allow them to terminate */ ZBX_DO_EXIT(); zbx_free_service_resources(); serviceStatus.dwCurrentState = SERVICE_STOPPED; serviceStatus.dwWaitHint = 0; serviceStatus.dwCheckPoint = 0; serviceStatus.dwWin32ExitCode = 0; break; default: break; } SetServiceStatus(serviceHandle, &serviceStatus); }
void zbx_on_exit(void) { zabbix_log(LOG_LEVEL_DEBUG, "zbx_on_exit() called"); zbx_free_service_resources(); #if defined(PS_OVERWRITE_ARGV) setproctitle_free_env(); #endif exit(SUCCEED); }