Another try, this time server side. It was much simpler to do --- 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 */ +(a)REQ(close_all_sockets) +(a)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)
On Aug 27, 2015, at 9:58 AM, Bruno Jesus <00cpxxx(a)gmail.com> wrote:
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(a)gmail.com <mailto:mattdurgavich(a)gmail.com>> wrote: Cool. I'll whip up another patch with this approach. I thought this piece of work would be straightforward ;)
Thanks!
Best, -Matt
On Thu, Aug 27, 2015 at 8:47 AM, Henri Verbeet <hverbeet(a)gmail.com <javascript:_e(%7B%7D,'cvml','hverbeet(a)gmail.com');>> wrote:
On 27 August 2015 at 14:09, Bruno Jesus <00cpxxx(a)gmail.com <javascript:_e(%7B%7D,'cvml','00cpxxx(a)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.