diff options
author | Arnon Gilboa <agilboa@agilboa.usersys.redhat.com> | 2010-03-22 17:17:18 +0200 |
---|---|---|
committer | Arnon Gilboa <agilboa@agilboa.usersys.redhat.com> | 2010-03-24 18:34:52 +0200 |
commit | 508d63e55906d3a82fb668bb0c31dc3d0909dc6e (patch) | |
tree | 8ea08cfc0fa4a5b4789a4cdf78d2f58a81c5f954 | |
parent | 59ab4bc31e970f8cfa23903aac6ce1ac43f12804 (diff) |
spice: vdagent: return error code -1 on service install/uninstall failure #576625
-rw-r--r-- | vdservice/vdservice.cpp | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/vdservice/vdservice.cpp b/vdservice/vdservice.cpp index e8a773c..8139af4 100644 --- a/vdservice/vdservice.cpp +++ b/vdservice/vdservice.cpp @@ -44,9 +44,9 @@ class VDService { public: static VDService* get(); ~VDService(); - void run(); - void install(); - void uninstall(); + bool run(); + bool install(); + bool uninstall(); private: VDService(); @@ -162,24 +162,26 @@ VDService::~VDService() delete _log; } -void VDService::run() +bool VDService::run() { SERVICE_TABLE_ENTRY service_table[] = {{VD_SERVICE_NAME, main}, {0, 0}}; - StartServiceCtrlDispatcher(service_table); + return !!StartServiceCtrlDispatcher(service_table); } -void VDService::install() +bool VDService::install() { + bool ret = false; + SC_HANDLE service_control_manager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE); if (!service_control_manager) { printf("OpenSCManager failed\n"); - return; + return false; } TCHAR path[_MAX_PATH + 1]; if (!GetModuleFileName(0, path, sizeof(path) / sizeof(path[0]))) { printf("GetModuleFileName failed\n"); CloseServiceHandle(service_control_manager); - return; + return false; } SC_HANDLE service = CreateService(service_control_manager, VD_SERVICE_NAME, VD_SERVICE_DISPLAY_NAME, SERVICE_ALL_ACCESS, @@ -194,27 +196,32 @@ void VDService::install() } CloseServiceHandle(service); printf("Service installed successfully\n"); + ret = true; } else if (GetLastError() == ERROR_SERVICE_EXISTS) { printf("Service already exists\n"); + ret = true; } else { printf("Service not installed successfully, error %d\n", GetLastError()); } CloseServiceHandle(service_control_manager); + return ret; } -void VDService::uninstall() +bool VDService::uninstall() { + bool ret = false; + SC_HANDLE service_control_manager = OpenSCManager(0, 0, SC_MANAGER_CONNECT); if (!service_control_manager) { printf("OpenSCManager failed\n"); - return; + return false; } SC_HANDLE service = OpenService(service_control_manager, VD_SERVICE_NAME, SERVICE_QUERY_STATUS | DELETE); if (!service) { printf("OpenService failed\n"); CloseServiceHandle(service_control_manager); - return; + return false; } SERVICE_STATUS status; if (!QueryServiceStatus(service, &status)) { @@ -223,6 +230,7 @@ void VDService::uninstall() printf("Service is still running\n"); } else if (DeleteService(service)) { printf("Service removed successfully\n"); + ret = true; } else { switch (GetLastError()) { case ERROR_ACCESS_DENIED: @@ -238,6 +246,7 @@ void VDService::uninstall() } CloseServiceHandle(service); CloseServiceHandle(service_control_manager); + return ret; } const char* session_events[] = { @@ -1019,23 +1028,25 @@ void VDService::write_agent_control(uint32_t type, uint32_t opaque) int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { + bool success = false; + if (!supported_system_version()) { printf("vdservice is not supported in this system version\n"); - return 0; + return -1; } VDService* vdservice = VDService::get(); if (argc > 1) { if (lstrcmpi(argv[1], TEXT("install")) == 0) { - vdservice->install(); + success = vdservice->install(); } else if (lstrcmpi(argv[1], TEXT("uninstall")) == 0) { - vdservice->uninstall(); + success = vdservice->uninstall(); } else { printf("Use: vdservice install / uninstall\n"); } } else { - vdservice->run(); + success = vdservice->run(); } delete vdservice; - return 0; + return (success ? 0 : -1); } |