diff --git a/src/lib/empthread/ntthread.c b/src/lib/empthread/ntthread.c index 894b53fc..882ad507 100644 --- a/src/lib/empthread/ntthread.c +++ b/src/lib/empthread/ntthread.c @@ -473,9 +473,7 @@ empth_exit(void) /* The main line. Wait forever. */ while (1) { if (daemonize) { - if (service_stopped()) - shutdwn(0); - Sleep(3); + service_stopped(); } else { char buf[20]; printf("\nEmpire Server>"); diff --git a/src/lib/gen/service.c b/src/lib/gen/service.c index 89b9c500..e79bff2c 100644 --- a/src/lib/gen/service.c +++ b/src/lib/gen/service.c @@ -147,14 +147,13 @@ remove_service(char *service_name) } } -static SERVICE_STATUS service_status; -static SERVICE_STATUS_HANDLE service_status_handle; +static SERVICE_STATUS service_status; +static SERVICE_STATUS_HANDLE service_status_handle; +static HANDLE hShutdownEvent = NULL; void WINAPI service_ctrl_handler(DWORD Opcode) { - DWORD status; - switch(Opcode) { case SERVICE_CONTROL_PAUSE: @@ -167,20 +166,9 @@ service_ctrl_handler(DWORD Opcode) service_status.dwCurrentState = SERVICE_RUNNING; break; - case SERVICE_CONTROL_STOP: - service_status.dwWin32ExitCode = 0; - service_status.dwCurrentState = SERVICE_STOPPED; - service_status.dwCheckPoint = 0; - service_status.dwWaitHint = 0; - - if (!SetServiceStatus (service_status_handle, - &service_status)) { - status = GetLastError(); - logerror("Error while stopping service SetServiceStatus" - " error %ld", status); - } - - logerror("Service stopped"); + case SERVICE_CONTROL_STOP: + logerror("Service stopping"); + SetEvent(hShutdownEvent); return; case SERVICE_CONTROL_INTERROGATE: @@ -193,10 +181,8 @@ service_ctrl_handler(DWORD Opcode) } /* Send current status. */ - if (!SetServiceStatus (service_status_handle, &service_status)) { - status = GetLastError(); - logerror("SetServiceStatus error %ld",status); - } + if (!SetServiceStatus (service_status_handle, &service_status)) + logerror("SetServiceStatus error %ld",GetLastError()); return; } @@ -215,10 +201,17 @@ service_main(DWORD argc, LPTSTR *argv) DEFAULT_SERVICE_NAME, service_ctrl_handler); if (service_status_handle == (SERVICE_STATUS_HANDLE)0) { - logerror("RegisterServiceCtrlHandler failed %d\n", GetLastError()); - return; + logerror("RegisterServiceCtrlHandler failed %d\n", GetLastError()); + loc_NTTerm(); + return; } + if ((hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL) { + logerror("CreateEvent for Shutdown failed %d\n", GetLastError()); + loc_NTTerm(); + return; + } + start_server(0); /* Initialization complete - report running status. */ @@ -236,19 +229,27 @@ service_main(DWORD argc, LPTSTR *argv) close_files(); loc_NTTerm(); - - /* This is where the service does its work. */ - logerror("Returning the Main Thread \n",0); return; } -int +void service_stopped(void) { - if (service_status.dwCurrentState == SERVICE_STOPPED) - return 1; - else - return 0; + if (hShutdownEvent != NULL) { + WaitForSingleObject(hShutdownEvent,INFINITE); + shutdwn(0); + logerror("Service stopped"); + service_status.dwWin32ExitCode = 0; + service_status.dwCurrentState = SERVICE_STOPPED; + service_status.dwCheckPoint = 0; + service_status.dwWaitHint = 0; + + if (!SetServiceStatus (service_status_handle, + &service_status)) { + logerror("Error while stopping service SetServiceStatus" + " error %ld", GetLastError()); + } + } } #endif /* _WIN32 */ diff --git a/src/server/main.c b/src/server/main.c index 773e7161..eccb55b5 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -218,7 +218,7 @@ main(int argc, char **argv) */ if (GetLastError() != ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) { logerror("Failed to dispatch service (%d)", GetLastError()); - printf("Failed to dispatch service (%d)\n", GetLastError()); + loc_NTTerm(); exit(EXIT_FAILURE); } } @@ -488,7 +488,14 @@ shutdwn(int sig) else logerror("Server shutting down at Deity's request"); close_files(); + +#if defined(_WIN32) + loc_NTTerm(); + if (!daemonize) + _exit(0); +#else _exit(0); +#endif }