[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