[PATCH 1/3] rpcss: Make initialization helper easier to extend.
Nikolay Sivov
nsivov at codeweavers.com
Thu Nov 7 13:59:59 CST 2019
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
programs/rpcss/rpcss_main.c | 102 ++++++++++++++++++++----------------
1 file changed, 57 insertions(+), 45 deletions(-)
diff --git a/programs/rpcss/rpcss_main.c b/programs/rpcss/rpcss_main.c
index 6d24ccbc07..42749028c3 100644
--- a/programs/rpcss/rpcss_main.c
+++ b/programs/rpcss/rpcss_main.c
@@ -37,53 +37,60 @@ static WCHAR rpcssW[] = {'R','p','c','S','s',0};
static HANDLE exit_event;
static SERVICE_STATUS_HANDLE service_handle;
-static BOOL RPCSS_Initialize(void)
+static RPC_STATUS RPCSS_Initialize(void)
{
- static unsigned short irot_protseq[] = IROT_PROTSEQ;
- static unsigned short irot_endpoint[] = IROT_ENDPOINT;
- static unsigned short epm_protseq[] = {'n','c','a','c','n','_','n','p',0};
- static unsigned short epm_endpoint[] = {'\\','p','i','p','e','\\','e','p','m','a','p','p','e','r',0};
- static unsigned short epm_protseq_lrpc[] = {'n','c','a','l','r','p','c',0};
- static unsigned short epm_endpoint_lrpc[] = {'e','p','m','a','p','p','e','r',0};
- RPC_STATUS status;
-
- WINE_TRACE("\n");
-
- status = RpcServerRegisterIf(epm_v3_0_s_ifspec, NULL, NULL);
- if (status != RPC_S_OK)
- return status;
- status = RpcServerRegisterIf(Irot_v0_2_s_ifspec, NULL, NULL);
- if (status != RPC_S_OK)
- {
- RpcServerUnregisterIf(epm_v3_0_s_ifspec, NULL, FALSE);
- return FALSE;
- }
-
- status = RpcServerUseProtseqEpW(epm_protseq, RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
- epm_endpoint, NULL);
- if (status != RPC_S_OK)
- goto fail;
-
- status = RpcServerUseProtseqEpW(epm_protseq_lrpc, RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
- epm_endpoint_lrpc, NULL);
- if (status != RPC_S_OK)
- goto fail;
-
- status = RpcServerUseProtseqEpW(irot_protseq, RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
- irot_endpoint, NULL);
- if (status != RPC_S_OK)
- goto fail;
-
- status = RpcServerListen(1, RPC_C_LISTEN_MAX_CALLS_DEFAULT, TRUE);
- if (status != RPC_S_OK)
- goto fail;
-
- return TRUE;
+ static unsigned short irot_protseq[] = IROT_PROTSEQ;
+ static unsigned short irot_endpoint[] = IROT_ENDPOINT;
+ static unsigned short epm_protseq[] = {'n','c','a','c','n','_','n','p',0};
+ static unsigned short epm_endpoint[] = {'\\','p','i','p','e','\\','e','p','m','a','p','p','e','r',0};
+ static unsigned short epm_protseq_lrpc[] = {'n','c','a','l','r','p','c',0};
+ static unsigned short epm_endpoint_lrpc[] = {'e','p','m','a','p','p','e','r',0};
+ static const struct protseq_map
+ {
+ unsigned short *protseq;
+ unsigned short *endpoint;
+ } protseqs[] =
+ {
+ { epm_protseq, epm_endpoint },
+ { epm_protseq_lrpc, epm_endpoint_lrpc },
+ { irot_protseq, irot_endpoint },
+ };
+ RPC_IF_HANDLE ifspecs[] =
+ {
+ epm_v3_0_s_ifspec,
+ Irot_v0_2_s_ifspec,
+ };
+ RPC_STATUS status;
+ int i, j;
+
+ WINE_TRACE("\n");
+
+ for (i = 0, j = 0; i < ARRAY_SIZE(ifspecs); ++i, j = i)
+ {
+ status = RpcServerRegisterIf(ifspecs[i], NULL, NULL);
+ if (status != RPC_S_OK)
+ goto fail;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(protseqs); ++i)
+ {
+ status = RpcServerUseProtseqEpW(protseqs[i].protseq, RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
+ protseqs[i].endpoint, NULL);
+ if (status != RPC_S_OK)
+ goto fail;
+ }
+
+ status = RpcServerListen(1, RPC_C_LISTEN_MAX_CALLS_DEFAULT, TRUE);
+ if (status != RPC_S_OK)
+ goto fail;
+
+ return RPC_S_OK;
fail:
- RpcServerUnregisterIf(epm_v3_0_s_ifspec, NULL, FALSE);
- RpcServerUnregisterIf(Irot_v0_2_s_ifspec, NULL, FALSE);
- return FALSE;
+ for (i = 0; i < j; ++i)
+ RpcServerUnregisterIf(ifspecs[i], NULL, FALSE);
+
+ return status;
}
static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_data, LPVOID context )
@@ -121,10 +128,15 @@ static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_
static void WINAPI ServiceMain( DWORD argc, LPWSTR *argv )
{
SERVICE_STATUS status;
+ RPC_STATUS ret;
TRACE( "starting service\n" );
- if (!RPCSS_Initialize()) return;
+ if ((ret = RPCSS_Initialize()))
+ {
+ WARN("Failed to initialize rpc interfaces, status %d.\n", ret);
+ return;
+ }
exit_event = CreateEventW( NULL, TRUE, FALSE, NULL );
--
2.24.0.rc1
More information about the wine-devel
mailing list