---
dlls/ws2_32/socket.c | 13 ++++++++++++-
server/handle.c | 12 ++++++++++++
server/protocol.def | 3 +++
server/sock.c | 2 +-
4 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index ca82ec9..66d5b2b 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -1471,7 +1471,18 @@ INT WINAPI WSACleanup(void)
{
if (num_startup) {
num_startup--;
- TRACE("pending cleanups: %d\n", num_startup);
+ if (num_startup == 0)
+ {
+ SERVER_START_REQ(close_all_sockets)
+ {
+ wine_server_call( req );
+ }
+ SERVER_END_REQ;
+ }
+ else
+ {
+ TRACE("pending cleanups: %d\n", num_startup);
+ }
return 0;
}
SetLastError(WSANOTINITIALISED);
diff --git a/server/handle.c b/server/handle.c
index 5043ff7..b4b5ecb 100644
--- a/server/handle.c
+++ b/server/handle.c
@@ -39,6 +39,8 @@
#include "security.h"
#include "request.h"
+extern struct object_ops sock_ops;
+
struct handle_entry
{
struct object *ptr; /* object */
@@ -608,6 +610,16 @@ DECL_HANDLER(set_handle_info)
reply->old_flags = set_handle_flags( current->process, req->handle, req->mask, req->flags );
}
+DECL_HANDLER(close_all_sockets)
+{
+ obj_handle_t sock;
+ UINT index = 0;
+ while ( (sock = enumerate_handles(current->process, &sock_ops, &index)) )
+ {
+ close_handle(current->process, sock);
+ }
+}
+
/* duplicate a handle */
DECL_HANDLER(dup_handle)
{
diff --git a/server/protocol.def b/server/protocol.def
index c313006..651af47 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -942,6 +942,9 @@ struct rawinput_device
obj_handle_t handle; /* handle to close */
@END
+/* Close all sockets for the current process */
+@REQ(close_all_sockets)
+@END
/* Set a handle information */
@REQ(set_handle_info)
diff --git a/server/sock.c b/server/sock.c
index 67d6416..2a9f444 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -138,7 +138,7 @@ static int sock_get_ntstatus( int err );
static int sock_get_error( int err );
static void sock_set_error(void);
-static const struct object_ops sock_ops =
+const struct object_ops sock_ops =
{
sizeof(struct sock), /* size */
sock_dump, /* dump */
--
2.3.2 (Apple Git-55)
That indeed sounds much easier than having to keep our own list inside the dll. Thanks, Henri.
Bruno
On Thursday, August 27, 2015, Matt Durgavich <
mattdurgavich@gmail.com> wrote:
Cool. I'll whip up another patch with this approach. I thought this piece of work would be straightforward ;)
Thanks!
On Thu, Aug 27, 2015 at 8:47 AM, Henri Verbeet <hverbeet@gmail.com> wrote:
On 27 August 2015 at 14:09, Bruno Jesus <00cpxxx@gmail.com> wrote:
> I have other email asking how to list all sockets from inside the server but
> I didn't get any replies so at that time I thought it was not possible to do
> that.
You'd iterate over current->process->handles->entries and compare
entry->ptr->ops against sock_ops. I.e., enumerate_handles() in
server/handle.c, although that seems currently unused.