Piotr Caban : services: Set result inside service_send_command.

Alexandre Julliard julliard at winehq.org
Fri Dec 9 14:41:37 CST 2011


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Dec  9 13:33:45 2011 +0100

services: Set result inside service_send_command.

---

 programs/services/rpc.c |   34 ++++++++++++++++++++++++----------
 1 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/programs/services/rpc.c b/programs/services/rpc.c
index 66bd17b..806e65d 100644
--- a/programs/services/rpc.c
+++ b/programs/services/rpc.c
@@ -914,34 +914,50 @@ BOOL service_send_command( struct service_entry *service, HANDLE pipe,
                            const void *data, DWORD size, DWORD *result )
 {
     OVERLAPPED overlapped;
-    DWORD count;
+    DWORD count, ret;
     BOOL r;
 
     overlapped.hEvent = service->overlapped_event;
     r = WriteFile(pipe, data, size, &count, &overlapped);
     if (!r && GetLastError() == ERROR_IO_PENDING)
     {
-        WaitForSingleObject( service->overlapped_event, service_pipe_timeout );
+        ret = WaitForSingleObject( service->overlapped_event, service_pipe_timeout );
+        if (ret == WAIT_TIMEOUT)
+        {
+            WINE_ERR("sending command timed out\n");
+            *result = ERROR_SERVICE_REQUEST_TIMEOUT;
+            return FALSE;
+        }
         r = GetOverlappedResult( pipe, &overlapped, &count, FALSE );
     }
     if (!r || count != size)
     {
         WINE_ERR("service protocol error - failed to write pipe!\n");
+        *result  = (!r ? GetLastError() : ERROR_WRITE_FAULT);
         return FALSE;
     }
     r = ReadFile(pipe, result, sizeof *result, &count, &overlapped);
     if (!r && GetLastError() == ERROR_IO_PENDING)
     {
-        WaitForSingleObject( service->overlapped_event, service_pipe_timeout );
+        ret = WaitForSingleObject( service->overlapped_event, service_pipe_timeout );
+        if (ret == WAIT_TIMEOUT)
+        {
+            WINE_ERR("receiving command result timed out\n");
+            *result = ERROR_SERVICE_REQUEST_TIMEOUT;
+            return FALSE;
+        }
         r = GetOverlappedResult( pipe, &overlapped, &count, FALSE );
     }
     if (!r || count != sizeof *result)
     {
         WINE_ERR("service protocol error - failed to read pipe "
             "r = %d  count = %d!\n", r, count);
+        *result = (!r ? GetLastError() : ERROR_READ_FAULT);
         return FALSE;
     }
-    return r;
+
+    *result = ERROR_SUCCESS;
+    return TRUE;
 }
 
 /******************************************************************************
@@ -996,7 +1012,7 @@ DWORD __cdecl svcctl_ControlService(
 {
     DWORD access_required;
     struct sc_service_handle *service;
-    DWORD err;
+    DWORD result;
     BOOL ret;
     HANDLE control_mutex;
     HANDLE control_pipe;
@@ -1027,8 +1043,8 @@ DWORD __cdecl svcctl_ControlService(
             return ERROR_INVALID_PARAMETER;
     }
 
-    if ((err = validate_service_handle(hService, access_required, &service)) != 0)
-        return err;
+    if ((result = validate_service_handle(hService, access_required, &service)) != 0)
+        return result;
 
     service_lock_exclusive(service->service_entry);
 
@@ -1078,9 +1094,7 @@ DWORD __cdecl svcctl_ControlService(
     ret = WaitForSingleObject(control_mutex, 30000);
     if (ret == WAIT_OBJECT_0)
     {
-        DWORD result = ERROR_SUCCESS;
-
-        ret = service_send_control(service->service_entry, control_pipe, dwControl, &result);
+        service_send_control(service->service_entry, control_pipe, dwControl, &result);
 
         if (dwControl == SERVICE_CONTROL_STOP)
         {




More information about the wine-cvs mailing list