From 1aae5bbef9a34952581bfadc540cec9750840098 Mon Sep 17 00:00:00 2001 From: valenok Date: Mon, 27 Sep 2010 01:06:05 +0100 Subject: [PATCH] fixed service handling code --- main.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/main.c b/main.c index c5012689..1c47adc4 100644 --- a/main.c +++ b/main.c @@ -271,6 +271,7 @@ static void start_mongoose(int argc, char *argv[]) { #ifdef _WIN32 static SERVICE_STATUS ss; static SERVICE_STATUS_HANDLE hStatus; +static const char *service_magic_argument = "--"; static void WINAPI ControlHandler(DWORD code) { if (code == SERVICE_CONTROL_STOP || code == SERVICE_CONTROL_SHUTDOWN) { @@ -346,7 +347,8 @@ static void show_error(void) { static int manage_service(int action) { static const char *service_name = "Mongoose"; SC_HANDLE hSCM = NULL, hService = NULL; - char path[PATH_MAX]; + SERVICE_DESCRIPTION descr = {server_name}; + char path[PATH_MAX + 20]; // Path to executable plus magic argument int success = 1; if ((hSCM = OpenSCManager(NULL, NULL, action == ID_INSTALL_SERVICE ? @@ -355,12 +357,14 @@ static int manage_service(int action) { show_error(); } else if (action == ID_INSTALL_SERVICE) { GetModuleFileName(NULL, path, sizeof(path)); + strncat(path, " ", sizeof(path)); + strncat(path, service_magic_argument, sizeof(path)); hService = CreateService(hSCM, service_name, service_name, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, path, NULL, NULL, NULL, NULL, NULL); if (hService) { - ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, server_name); + ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &descr); } else { show_error(); } @@ -374,8 +378,8 @@ static int manage_service(int action) { success = 0; } - //CloseServiceHandle(hService); - //CloseServiceHandle(hSCM); + CloseServiceHandle(hService); + CloseServiceHandle(hSCM); return success; } @@ -387,17 +391,19 @@ static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, {NULL, NULL} }; int service_installed; - char buf[200]; + char buf[200], *service_argv[] = {__argv[0], NULL}; POINT pt; HMENU hMenu; switch (msg) { case WM_CREATE: - // Win32 runtime must prepare __argc and __argv for us - start_mongoose(__argc, __argv); - // TODO(lsm): figure out why this executes long time - if (StartServiceCtrlDispatcher(service_table)) { + if (__argv[1] != NULL && + !strcmp(__argv[1], service_magic_argument)) { + start_mongoose(1, service_argv); + StartServiceCtrlDispatcher(service_table); exit(EXIT_SUCCESS); + } else { + start_mongoose(__argc, __argv); } break; case WM_COMMAND: