X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;f=service.cpp;h=dbac12b9b3580094c8b3588107e5307672cde0fb;hb=62f28c55d444d846579159133dbe091809a2c08b;hp=937a2ece4150ffae88f74c3f844858db7d1998d7;hpb=ee9a86c8408feaf173733aea12a80211e5d74483;p=nssm.git diff --git a/service.cpp b/service.cpp index 937a2ec..dbac12b 100644 --- a/service.cpp +++ b/service.cpp @@ -1360,7 +1360,7 @@ int edit_service(nssm_service_t *service, bool editing) { } /* Control a service. */ -int control_service(unsigned long control, int argc, TCHAR **argv) { +int control_service(unsigned long control, int argc, TCHAR **argv, bool return_status) { if (argc < 1) return usage(1); TCHAR *service_name = argv[0]; TCHAR canonical_name[SERVICE_NAME_LENGTH]; @@ -1368,6 +1368,7 @@ int control_service(unsigned long control, int argc, TCHAR **argv) { SC_HANDLE services = open_service_manager(SC_MANAGER_CONNECT | SC_MANAGER_ENUMERATE_SERVICE); if (! services) { print_message(stderr, NSSM_MESSAGE_OPEN_SERVICE_MANAGER_FAILED); + if (return_status) return 0; return 2; } @@ -1394,6 +1395,7 @@ int control_service(unsigned long control, int argc, TCHAR **argv) { SC_HANDLE service_handle = open_service(services, service_name, access, canonical_name, _countof(canonical_name)); if (! service_handle) { CloseServiceHandle(services); + if (return_status) return 0; return 3; } @@ -1431,6 +1433,7 @@ int control_service(unsigned long control, int argc, TCHAR **argv) { if (response) { print_message(stderr, NSSM_MESSAGE_BAD_CONTROL_RESPONSE, canonical_name, service_status_text(service_status.dwCurrentState), service_control_text(control)); + if (return_status) return 0; return 1; } else _tprintf(_T("%s: %s: %s"), canonical_name, service_control_text(control), error_string(error)); @@ -1439,6 +1442,7 @@ int control_service(unsigned long control, int argc, TCHAR **argv) { else { CloseServiceHandle(service_handle); _ftprintf(stderr, _T("%s: %s: %s"), canonical_name, service_control_text(control), error_string(error)); + if (return_status) return 0; return 1; } } @@ -1453,10 +1457,12 @@ int control_service(unsigned long control, int argc, TCHAR **argv) { if (ret) { _tprintf(_T("%s\n"), service_status_text(service_status.dwCurrentState)); + if (return_status) return service_status.dwCurrentState; return 0; } else { _ftprintf(stderr, _T("%s: %s\n"), canonical_name, error_string(error)); + if (return_status) return 0; return 1; } } @@ -1477,22 +1483,32 @@ int control_service(unsigned long control, int argc, TCHAR **argv) { if (response) { print_message(stderr, NSSM_MESSAGE_BAD_CONTROL_RESPONSE, canonical_name, service_status_text(service_status.dwCurrentState), service_control_text(control)); + if (return_status) return 0; return 1; } else _tprintf(_T("%s: %s: %s"), canonical_name, service_control_text(control), error_string(error)); + if (return_status) return service_status.dwCurrentState; return 0; } else { CloseServiceHandle(service_handle); _ftprintf(stderr, _T("%s: %s: %s"), canonical_name, service_control_text(control), error_string(error)); if (error == ERROR_SERVICE_NOT_ACTIVE) { - if (control == SERVICE_CONTROL_SHUTDOWN || control == SERVICE_CONTROL_STOP) return 0; + if (control == SERVICE_CONTROL_SHUTDOWN || control == SERVICE_CONTROL_STOP) { + if (return_status) return SERVICE_STOPPED; + return 0; + } } + if (return_status) return 0; return 1; } } } +int control_service(unsigned long control, int argc, TCHAR **argv) { + return control_service(control, argc, argv, false); +} + /* Remove the service */ int remove_service(nssm_service_t *service) { if (! service) return 1;