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