[Libguestfs] [PATCH 6/6] Add uninstall command

Matthew Booth mbooth at redhat.com
Thu Aug 29 15:09:27 UTC 2013


---
 RHSrvAny/RHSrvAny.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)

diff --git a/RHSrvAny/RHSrvAny.c b/RHSrvAny/RHSrvAny.c
index 75ce7c4..3639d22 100644
--- a/RHSrvAny/RHSrvAny.c
+++ b/RHSrvAny/RHSrvAny.c
@@ -45,6 +45,7 @@ static HANDLE ghSvcStopEvent = NULL;
 static SERVICE_STATUS_HANDLE gSvcStatusHandle;
 
 static int SvcInstall (void);
+static int SvcUninstall (void);
 
 VOID WINAPI SvcCtrlHandler (DWORD);
 VOID WINAPI SvcMain (DWORD, LPTSTR *);
@@ -95,6 +96,8 @@ main (int argc, char **a_argv)
 
     if (lstrcmpi(argv[i], TEXT("install")) == 0) {
         return SvcInstall();
+    } else if (lstrcmpi(argv[i], TEXT("uninstall")) == 0) {
+        return SvcUninstall();
     }
 
     SERVICE_TABLE_ENTRY DispatchTable[] = {
@@ -115,6 +118,65 @@ main (int argc, char **a_argv)
 }
 
 static int
+SvcUninstall() {
+    SC_HANDLE schSCManager = NULL;
+    SC_HANDLE schService = NULL;
+
+    schSCManager = OpenSCManager(
+        NULL,
+        NULL,
+        SC_MANAGER_ALL_ACCESS
+    );
+
+    if (NULL == schSCManager) {
+        printf("OpenSCManager failed (%d)\n", (int) GetLastError());
+        return EXIT_FAILURE;
+    }
+
+    schService = OpenService(
+        schSCManager,
+        svcname,
+        SERVICE_ALL_ACCESS
+    );
+
+    if (schService == NULL) {
+        DWORD err = GetLastError();
+        switch (err) {
+        case ERROR_ACCESS_DENIED:
+            printf("You do not have permission to uninstall this service\n");
+            break;
+
+        case ERROR_SERVICE_DOES_NOT_EXIST:
+            printf("The service does not exist\n");
+            break;
+
+        default:
+            printf("OpenService failed (%d)\n", (int) err);
+        }
+
+        goto error;
+    }
+
+    if (DeleteService(schService) == 0) {
+        printf("DeleteService failed (%d)\n", (int) GetLastError());
+        goto error;
+    } else {
+        printf("Service uninstalled successfully\n");
+    }
+
+    CloseServiceHandle (schService);
+    CloseServiceHandle (schSCManager);
+
+    return EXIT_SUCCESS;
+
+error:
+    if (schService) CloseServiceHandle (schService);
+    if (schSCManager) CloseServiceHandle (schSCManager);
+
+    return EXIT_FAILURE;
+}
+
+static int
 SvcInstall() {
     SC_HANDLE schSCManager;
     SC_HANDLE schService;
-- 
1.8.3.1




More information about the Libguestfs mailing list