Sync to Wine-20050524:
authorGé van Geldorp <ge@gse.nl>
Sat, 28 May 2005 15:04:47 +0000 (15:04 +0000)
committerGé van Geldorp <ge@gse.nl>
Sat, 28 May 2005 15:04:47 +0000 (15:04 +0000)
Alexandre Julliard <julliard@winehq.org>
- Added rules for building import libraries in the individual dll
  makefiles, and added support for building a .def.a static import
  library too.
Vincent Beron <vberon@mecano.gme.usherb.ca>
- Provide minimal API documentation in advapi/eventlog.c to silence some
  winapi_check output.
- Move around functions in riched20, richedit and rpcrt4 to achieve the
  same goal.
Robert Shearman <rob@codeweavers.com>
- Fix RpcServerListen so that it doesn't return
  RPC_S_ALREADY_LISTENING when the only interfaces it is listening on
  are auto listens.
- Only synchronize with server thread when necessary and move this
  into RpcMgmtWaitServerListen.
Francois Gouget <fgouget@free.fr>
- Tweak the API documentation to silence winapi_check warnings.
Hartmut Birr <hartmut.birr@gmx.de>
- Clean up if named pipe is not available.
  (merge back from WineHQ)

svn path=/trunk/; revision=15581

reactos/lib/rpcrt4/Makefile.in
reactos/lib/rpcrt4/ndr_stubless.c
reactos/lib/rpcrt4/rpc_server.c
reactos/lib/rpcrt4/rpcrt4_main.c
reactos/lib/rpcrt4/rpcss_np_client.c

index b0df10c..51b438a 100644 (file)
@@ -4,6 +4,7 @@ TOPOBJDIR = ../..
 SRCDIR    = @srcdir@\r
 VPATH     = @srcdir@\r
 MODULE    = rpcrt4.dll\r
+IMPORTLIB = librpcrt4.$(IMPLIBEXT)\r
 IMPORTS   = iphlpapi advapi32 kernel32 ntdll\r
 EXTRALIBS = -luuid\r
 \r
index b6bb11d..f4c6a7a 100644 (file)
 \r
 WINE_DEFAULT_DEBUG_CHANNEL(ole);\r
 \r
-LONG_PTR /* CLIENT_CALL_RETURN */ RPCRT4_NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, va_list args)\r
+/***********************************************************************\r
+ * Note: this should return a CLIENT_CALL_RETURN, but calling convention for\r
+ * returning structures/unions is different between Windows and gcc on i386.\r
+ */\r
+LONG_PTR RPCRT4_NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, va_list args)\r
 {\r
 \r
   RPC_CLIENT_INTERFACE *rpc_cli_if = (RPC_CLIENT_INTERFACE *)(pStubDesc->RpcInterfaceInformation);\r
@@ -83,8 +87,11 @@ LONG_PTR /* CLIENT_CALL_RETURN */ RPCRT4_NdrClientCall2(PMIDL_STUB_DESC pStubDes
 \r
 /***********************************************************************\r
  *           NdrClientCall2 [RPCRT4.@]\r
+ *\r
+ * Note: this should return a CLIENT_CALL_RETURN, but calling convention for\r
+ * returning structures/unions is different between Windows and gcc on i386.\r
  */\r
-LONG_PTR /* CLIENT_CALL_RETURN */ WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc,\r
+LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc,\r
   PFORMAT_STRING pFormat, ...)\r
 {\r
     LONG_PTR ret;\r
index 3867ae6..507e3f3 100644 (file)
@@ -103,8 +103,6 @@ static HANDLE mgr_event;
 static HANDLE mgr_mutex;\r
 /* set when server thread has finished opening connections */\r
 static HANDLE server_ready_event;\r
-/* thread that waits for connections */\r
-static HANDLE server_thread;\r
 \r
 static CRITICAL_SECTION spacket_cs;\r
 static CRITICAL_SECTION_DEBUG spacket_cs_debug =\r
@@ -587,14 +585,18 @@ static void RPCRT4_sync_with_server_thread(void)
   ReleaseMutex(mgr_mutex);\r
 }\r
 \r
-static void RPCRT4_start_listen(BOOL auto_listen)\r
+static RPC_STATUS RPCRT4_start_listen(BOOL auto_listen)\r
 {\r
+  RPC_STATUS status = RPC_S_ALREADY_LISTENING;\r
+\r
   TRACE("\n");\r
 \r
   EnterCriticalSection(&listen_cs);\r
   if (auto_listen || (manual_listen_count++ == 0))\r
   {\r
+    status = RPC_S_OK;\r
     if (++listen_count == 1) {\r
+      HANDLE server_thread;\r
       /* first listener creates server thread */\r
       if (!mgr_mutex) mgr_mutex = CreateMutexW(NULL, FALSE, NULL);\r
       if (!mgr_event) mgr_event = CreateEventW(NULL, FALSE, FALSE, NULL);\r
@@ -603,13 +605,12 @@ static void RPCRT4_start_listen(BOOL auto_listen)
       if (!worker_tls) worker_tls = TlsAlloc();\r
       std_listen = TRUE;\r
       server_thread = CreateThread(NULL, 0, RPCRT4_server_thread, NULL, 0, NULL);\r
-    } else {\r
-      LeaveCriticalSection(&listen_cs);\r
-      RPCRT4_sync_with_server_thread();\r
-      return;\r
+      CloseHandle(server_thread);\r
     }\r
   }\r
   LeaveCriticalSection(&listen_cs);\r
+\r
+  return status;\r
 }\r
 \r
 static void RPCRT4_stop_listen(BOOL auto_listen)\r
@@ -977,23 +978,16 @@ RPC_STATUS WINAPI RpcServerRegisterAuthInfoW( LPWSTR ServerPrincName, unsigned l
  */\r
 RPC_STATUS WINAPI RpcServerListen( UINT MinimumCallThreads, UINT MaxCalls, UINT DontWait )\r
 {\r
+  RPC_STATUS status;\r
+\r
   TRACE("(%u,%u,%u)\n", MinimumCallThreads, MaxCalls, DontWait);\r
 \r
   if (!protseqs)\r
     return RPC_S_NO_PROTSEQS_REGISTERED;\r
 \r
-  EnterCriticalSection(&listen_cs);\r
-\r
-  if (std_listen) {\r
-    LeaveCriticalSection(&listen_cs);\r
-    return RPC_S_ALREADY_LISTENING;\r
-  }\r
-\r
-  RPCRT4_start_listen(FALSE);\r
-\r
-  LeaveCriticalSection(&listen_cs);\r
+  status = RPCRT4_start_listen(FALSE);\r
 \r
-  if (DontWait) return RPC_S_OK;\r
+  if (DontWait || (status != RPC_S_OK)) return status;\r
 \r
   return RpcMgmtWaitServerListen();\r
 }\r
@@ -1003,29 +997,20 @@ RPC_STATUS WINAPI RpcServerListen( UINT MinimumCallThreads, UINT MaxCalls, UINT
  */\r
 RPC_STATUS WINAPI RpcMgmtWaitServerListen( void )\r
 {\r
-  RPC_STATUS rslt = RPC_S_OK;\r
-\r
-  TRACE("\n");\r
+  TRACE("()\n");\r
 \r
   EnterCriticalSection(&listen_cs);\r
 \r
-  if (!std_listen)\r
-    if ( (rslt = RpcServerListen(1, 0, TRUE)) != RPC_S_OK ) {\r
-      LeaveCriticalSection(&listen_cs);\r
-      return rslt;\r
-    }\r
+  if (!std_listen) {\r
+    LeaveCriticalSection(&listen_cs);\r
+    return RPC_S_NOT_LISTENING;\r
+  }\r
   \r
   LeaveCriticalSection(&listen_cs);\r
 \r
-  while (std_listen) {\r
-    WaitForSingleObject(mgr_event, INFINITE);\r
-    if (!std_listen) {\r
-      Sleep(100); /* don't spin violently */\r
-      TRACE("spinning.\n");\r
-    }\r
-  }\r
+  RPCRT4_sync_with_server_thread();\r
 \r
-  return rslt;\r
+  return RPC_S_OK;\r
 }\r
 \r
 /***********************************************************************\r
index 4f8d66a..81f09ea 100644 (file)
@@ -767,7 +767,10 @@ BOOL RPCRT4_RPCSSOnDemandCall(PRPCSS_NP_MESSAGE msg, char *vardata_payload, PRPC
     return TRUE;\r
 }\r
 \r
-/* DceErrorInqText\r
+#define MAX_RPC_ERROR_TEXT 256\r
+\r
+/******************************************************************************\r
+ * DceErrorInqTextW   (rpcrt4.@)\r
  *\r
  * Notes\r
  * 1. On passing a NULL pointer the code does bomb out.\r
@@ -778,9 +781,6 @@ BOOL RPCRT4_RPCSSOnDemandCall(PRPCSS_NP_MESSAGE msg, char *vardata_payload, PRPC
  * 4. The MSDN documentation currently declares that the second argument is\r
  *    unsigned char *, even for the W version.  I don't believe it.\r
  */\r
-\r
-#define MAX_RPC_ERROR_TEXT 256\r
-\r
 RPC_STATUS RPC_ENTRY DceErrorInqTextW (RPC_STATUS e, unsigned short *buffer)\r
 {\r
     DWORD count;\r
@@ -801,6 +801,9 @@ RPC_STATUS RPC_ENTRY DceErrorInqTextW (RPC_STATUS e, unsigned short *buffer)
     return RPC_S_OK;\r
 }\r
 \r
+/******************************************************************************\r
+ * DceErrorInqTextA   (rpcrt4.@)\r
+ */\r
 RPC_STATUS RPC_ENTRY DceErrorInqTextA (RPC_STATUS e, unsigned char *buffer)\r
 {\r
     RPC_STATUS status;\r
index 230baae..67b42d7 100644 (file)
@@ -84,7 +84,6 @@ HANDLE RPCRT4_RpcssNPConnect(void)
     if (! WaitNamedPipeA(NAME_RPCSS_NAMED_PIPE, MASTER_MUTEX_WAITNAMEDPIPE_TIMEOUT))\r
     {\r
       ERR("Named pipe unavailable after waiting.  Something is probably wrong.\n");\r
-      CloseHandle(the_pipe);\r
       the_pipe = NULL;\r
       break;\r
     }\r