(service_main,main,shutdown) [_WIN32]: Add missing loc_NTTerm().
(service_main,main,shutdown,empth_exit,service_stopped) [_WIN32]: Add shutdown Event to allow the service to shutdown. When SERVICE_STOPPED is passed to SetServiceStatus() all threads are kills this prevents shutdown() from executing. The shutdown Event is used to block the service_main thread until the stopping of the service is started. After the shutdown() is complete then the SetServiceStatus() is called.
This commit is contained in:
parent
6c7f707b76
commit
014d005c69
3 changed files with 42 additions and 36 deletions
|
@ -473,9 +473,7 @@ empth_exit(void)
|
||||||
/* The main line. Wait forever. */
|
/* The main line. Wait forever. */
|
||||||
while (1) {
|
while (1) {
|
||||||
if (daemonize) {
|
if (daemonize) {
|
||||||
if (service_stopped())
|
service_stopped();
|
||||||
shutdwn(0);
|
|
||||||
Sleep(3);
|
|
||||||
} else {
|
} else {
|
||||||
char buf[20];
|
char buf[20];
|
||||||
printf("\nEmpire Server>");
|
printf("\nEmpire Server>");
|
||||||
|
|
|
@ -149,12 +149,11 @@ remove_service(char *service_name)
|
||||||
|
|
||||||
static SERVICE_STATUS service_status;
|
static SERVICE_STATUS service_status;
|
||||||
static SERVICE_STATUS_HANDLE service_status_handle;
|
static SERVICE_STATUS_HANDLE service_status_handle;
|
||||||
|
static HANDLE hShutdownEvent = NULL;
|
||||||
|
|
||||||
void WINAPI
|
void WINAPI
|
||||||
service_ctrl_handler(DWORD Opcode)
|
service_ctrl_handler(DWORD Opcode)
|
||||||
{
|
{
|
||||||
DWORD status;
|
|
||||||
|
|
||||||
switch(Opcode)
|
switch(Opcode)
|
||||||
{
|
{
|
||||||
case SERVICE_CONTROL_PAUSE:
|
case SERVICE_CONTROL_PAUSE:
|
||||||
|
@ -168,19 +167,8 @@ service_ctrl_handler(DWORD Opcode)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SERVICE_CONTROL_STOP:
|
case SERVICE_CONTROL_STOP:
|
||||||
service_status.dwWin32ExitCode = 0;
|
logerror("Service stopping");
|
||||||
service_status.dwCurrentState = SERVICE_STOPPED;
|
SetEvent(hShutdownEvent);
|
||||||
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");
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case SERVICE_CONTROL_INTERROGATE:
|
case SERVICE_CONTROL_INTERROGATE:
|
||||||
|
@ -193,10 +181,8 @@ service_ctrl_handler(DWORD Opcode)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send current status. */
|
/* Send current status. */
|
||||||
if (!SetServiceStatus (service_status_handle, &service_status)) {
|
if (!SetServiceStatus (service_status_handle, &service_status))
|
||||||
status = GetLastError();
|
logerror("SetServiceStatus error %ld",GetLastError());
|
||||||
logerror("SetServiceStatus error %ld",status);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,6 +202,13 @@ service_main(DWORD argc, LPTSTR *argv)
|
||||||
|
|
||||||
if (service_status_handle == (SERVICE_STATUS_HANDLE)0) {
|
if (service_status_handle == (SERVICE_STATUS_HANDLE)0) {
|
||||||
logerror("RegisterServiceCtrlHandler failed %d\n", GetLastError());
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,19 +229,27 @@ service_main(DWORD argc, LPTSTR *argv)
|
||||||
close_files();
|
close_files();
|
||||||
|
|
||||||
loc_NTTerm();
|
loc_NTTerm();
|
||||||
|
|
||||||
/* This is where the service does its work. */
|
|
||||||
logerror("Returning the Main Thread \n",0);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
void
|
||||||
service_stopped(void)
|
service_stopped(void)
|
||||||
{
|
{
|
||||||
if (service_status.dwCurrentState == SERVICE_STOPPED)
|
if (hShutdownEvent != NULL) {
|
||||||
return 1;
|
WaitForSingleObject(hShutdownEvent,INFINITE);
|
||||||
else
|
shutdwn(0);
|
||||||
return 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 */
|
#endif /* _WIN32 */
|
||||||
|
|
|
@ -218,7 +218,7 @@ main(int argc, char **argv)
|
||||||
*/
|
*/
|
||||||
if (GetLastError() != ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) {
|
if (GetLastError() != ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) {
|
||||||
logerror("Failed to dispatch service (%d)", GetLastError());
|
logerror("Failed to dispatch service (%d)", GetLastError());
|
||||||
printf("Failed to dispatch service (%d)\n", GetLastError());
|
loc_NTTerm();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -488,7 +488,14 @@ shutdwn(int sig)
|
||||||
else
|
else
|
||||||
logerror("Server shutting down at Deity's request");
|
logerror("Server shutting down at Deity's request");
|
||||||
close_files();
|
close_files();
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
loc_NTTerm();
|
||||||
|
if (!daemonize)
|
||||||
_exit(0);
|
_exit(0);
|
||||||
|
#else
|
||||||
|
_exit(0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue