[Libguestfs] [PATCH 5/6] Make install directive use service name explicitly

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


install now sets ImagePath to be: <BINPATH> -s <SVCNAME>
---
 RHSrvAny/RHSrvAny.c | 54 +++++++++++++++++++++++++++++++----------------------
 1 file changed, 32 insertions(+), 22 deletions(-)

diff --git a/RHSrvAny/RHSrvAny.c b/RHSrvAny/RHSrvAny.c
index 4bd7ef2..75ce7c4 100644
--- a/RHSrvAny/RHSrvAny.c
+++ b/RHSrvAny/RHSrvAny.c
@@ -44,7 +44,7 @@ static SERVICE_STATUS gSvcStatus;
 static HANDLE ghSvcStopEvent = NULL;
 static SERVICE_STATUS_HANDLE gSvcStatusHandle;
 
-static VOID SvcInstall (void);
+static int SvcInstall (void);
 
 VOID WINAPI SvcCtrlHandler (DWORD);
 VOID WINAPI SvcMain (DWORD, LPTSTR *);
@@ -94,8 +94,7 @@ main (int argc, char **a_argv)
     }
 
     if (lstrcmpi(argv[i], TEXT("install")) == 0) {
-        SvcInstall();
-        return EXIT_SUCCESS;
+        return SvcInstall();
     }
 
     SERVICE_TABLE_ENTRY DispatchTable[] = {
@@ -115,22 +114,12 @@ main (int argc, char **a_argv)
     return EXIT_SUCCESS;
 }
 
-static VOID
+static int
 SvcInstall() {
     SC_HANDLE schSCManager;
     SC_HANDLE schService;
     TCHAR szPath[MAX_PATH];
-
-    if (
-        !GetModuleFileName(
-            NULL,
-            szPath,
-            MAX_PATH
-        )
-    ) {
-            printf("Cannot install service (%d)\n", (int) GetLastError());
-        return;
-    }
+    wchar_t imagePath[MAX_PATH];
 
     schSCManager = OpenSCManager(
         NULL,
@@ -140,7 +129,20 @@ SvcInstall() {
 
     if (NULL == schSCManager) {
         printf("OpenSCManager failed (%d)\n", (int) GetLastError());
-        return;
+        return EXIT_FAILURE;
+    }
+
+    /* Get the full path of the current executable in szPath */
+    if (GetModuleFileName(NULL, szPath, MAX_PATH) == 0) {
+        printf("GetModuleFileName failed (%d)\n", (int) GetLastError());
+        return EXIT_FAILURE;
+    }
+
+    /* Construct ImagePath, which is actually a command line in this instance */
+    if (snwprintf(imagePath, MAX_PATH, L"%s -s %s", szPath, svcname) >= MAX_PATH)
+    {
+        printf("ImagePath exceeded %d characters\n", MAX_PATH);
+        return EXIT_FAILURE;
     }
 
     schService = CreateService (
@@ -151,7 +153,7 @@ SvcInstall() {
         SERVICE_WIN32_OWN_PROCESS,
         SERVICE_AUTO_START,
         SERVICE_ERROR_NORMAL,
-        szPath,
+        imagePath,
         NULL,
         NULL,
         NULL,
@@ -160,12 +162,18 @@ SvcInstall() {
     );
 
     if (schService == NULL) {
-        printf (
-            "CreateService failed (%d)\n",
-            (int) GetLastError()
-        );
+        DWORD err = GetLastError();
+        switch (err) {
+        case ERROR_SERVICE_EXISTS:
+            printf("A service with this name already exists\n");
+            break;
+
+        default:
+            printf("CreateService failed (%d)\n", (int) err);
+        }
+
         CloseServiceHandle (schSCManager);
-        return;
+        return EXIT_FAILURE;
     }
     else {
         printf("Service installed successfully\n");
@@ -173,6 +181,8 @@ SvcInstall() {
 
     CloseServiceHandle (schService);
     CloseServiceHandle (schSCManager);
+
+    return EXIT_SUCCESS;
 }
 
 VOID
-- 
1.8.3.1




More information about the Libguestfs mailing list