Alexandre Julliard : services: Add a helper function to send a command to the service.

Alexandre Julliard julliard at winehq.org
Fri May 20 12:44:30 CDT 2011


Module: wine
Branch: master
Commit: 0c1c1fc20db69fd6bfb7dae70de5f9e9793d5c18
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0c1c1fc20db69fd6bfb7dae70de5f9e9793d5c18

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri May 20 11:49:02 2011 +0200

services: Add a helper function to send a command to the service.

---

 programs/services/rpc.c      |   39 ++++++++++++++++++++++++++++-----------
 programs/services/services.c |   14 +++++---------
 programs/services/services.h |    2 ++
 3 files changed, 35 insertions(+), 20 deletions(-)

diff --git a/programs/services/rpc.c b/programs/services/rpc.c
index cf1f814..d1dd39e 100644
--- a/programs/services/rpc.c
+++ b/programs/services/rpc.c
@@ -888,12 +888,37 @@ static BOOL service_accepts_control(const struct service_entry *service, DWORD d
 }
 
 /******************************************************************************
+ * service_send_command
+ */
+BOOL service_send_command( struct service_entry *service, HANDLE pipe,
+                           const void *data, DWORD size, DWORD *result )
+{
+    DWORD count;
+    BOOL r;
+
+    r = WriteFile(pipe, data, size, &count, NULL);
+    if (!r || count != size)
+    {
+        WINE_ERR("service protocol error - failed to write pipe!\n");
+        return FALSE;
+    }
+    r = ReadFile(pipe, result, sizeof *result, &count, NULL);
+    if (!r || count != sizeof *result)
+    {
+        WINE_ERR("service protocol error - failed to read pipe "
+            "r = %d  count = %d!\n", r, count);
+        return FALSE;
+    }
+    return r;
+}
+
+/******************************************************************************
  * service_send_control
  */
 static BOOL service_send_control(struct service_entry *service, HANDLE pipe, DWORD dwControl, DWORD *result)
 {
     service_start_info *ssi;
-    DWORD len, count = 0;
+    DWORD len;
     BOOL r;
 
     /* calculate how much space we need to send the startup info */
@@ -906,16 +931,8 @@ static BOOL service_send_control(struct service_entry *service, HANDLE pipe, DWO
     ssi->name_size = strlenW(service->name) + 1;
     strcpyW( ssi->data, service->name );
 
-    r = WriteFile(pipe, ssi, ssi->total_size, &count, NULL);
-    if (!r || count != ssi->total_size)
-    {
-        WINE_ERR("service protocol error - failed to write pipe!\n");
-        return r;
-    }
-    r = ReadFile(pipe, result, sizeof *result, &count, NULL);
-    if (!r || count != sizeof *result)
-        WINE_ERR("service protocol error - failed to read pipe "
-            "r = %d  count = %d!\n", r, count);
+    r = service_send_command( service, pipe, ssi, ssi->total_size, result );
+    HeapFree( GetProcessHeap(), 0, ssi );
     return r;
 }
 
diff --git a/programs/services/services.c b/programs/services/services.c
index 5d0e4be..b3ed1a3 100644
--- a/programs/services/services.c
+++ b/programs/services/services.c
@@ -671,7 +671,7 @@ static DWORD service_wait_for_startup(struct service_entry *service_entry, HANDL
  */
 static BOOL service_send_start_message(struct service_entry *service, LPCWSTR *argv, DWORD argc)
 {
-    DWORD i, len, count, result;
+    DWORD i, len, result;
     service_start_info *ssi;
     LPWSTR p;
     BOOL r;
@@ -708,15 +708,11 @@ static BOOL service_send_start_message(struct service_entry *service, LPCWSTR *a
     }
     *p=0;
 
-    r = WriteFile(service->control_pipe, ssi, ssi->total_size, &count, NULL);
-    if (r)
+    r = service_send_command( service, service->control_pipe, ssi, ssi->total_size, &result );
+    if (r && result)
     {
-        r = ReadFile(service->control_pipe, &result, sizeof result, &count, NULL);
-        if (r && result)
-        {
-            SetLastError(result);
-            r = FALSE;
-        }
+        SetLastError(result);
+        r = FALSE;
     }
 
     HeapFree(GetProcessHeap(),0,ssi);
diff --git a/programs/services/services.h b/programs/services/services.h
index cd7de02..ea917f4 100644
--- a/programs/services/services.h
+++ b/programs/services/services.h
@@ -75,6 +75,8 @@ void service_lock_shared(struct service_entry *service);
 void service_lock_exclusive(struct service_entry *service);
 void service_unlock(struct service_entry *service);
 DWORD service_start(struct service_entry *service, DWORD service_argc, LPCWSTR *service_argv);
+BOOL service_send_command( struct service_entry *service, HANDLE pipe,
+                           const void *data, DWORD size, DWORD *result );
 
 extern HANDLE g_hStartedEvent;
 




More information about the wine-cvs mailing list