Bruno Jesus : server: Add a request to get socket information.

Alexandre Julliard julliard at winehq.org
Mon Sep 2 14:34:29 CDT 2013


Module: wine
Branch: master
Commit: ec49a574deb154b324ec69e0f31c297b148a9acc
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ec49a574deb154b324ec69e0f31c297b148a9acc

Author: Bruno Jesus <00cpxxx at gmail.com>
Date:   Sat Aug 31 00:14:47 2013 -0300

server: Add a request to get socket information.

---

 include/wine/server_protocol.h |   21 ++++++++++++++++++++-
 server/protocol.def            |   10 ++++++++++
 server/request.h               |    8 ++++++++
 server/sock.c                  |   14 ++++++++++++++
 server/trace.c                 |   15 +++++++++++++++
 5 files changed, 67 insertions(+), 1 deletions(-)

diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 086aca9..4919579 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -1529,6 +1529,22 @@ struct get_socket_event_reply
 
 
 
+struct get_socket_info_request
+{
+    struct request_header __header;
+    obj_handle_t handle;
+};
+struct get_socket_info_reply
+{
+    struct reply_header __header;
+    int family;
+    int type;
+    int protocol;
+    char __pad_20[4];
+};
+
+
+
 struct enable_socket_event_request
 {
     struct request_header __header;
@@ -5082,6 +5098,7 @@ enum request
     REQ_accept_into_socket,
     REQ_set_socket_event,
     REQ_get_socket_event,
+    REQ_get_socket_info,
     REQ_enable_socket_event,
     REQ_set_socket_deferred,
     REQ_alloc_console,
@@ -5341,6 +5358,7 @@ union generic_request
     struct accept_into_socket_request accept_into_socket_request;
     struct set_socket_event_request set_socket_event_request;
     struct get_socket_event_request get_socket_event_request;
+    struct get_socket_info_request get_socket_info_request;
     struct enable_socket_event_request enable_socket_event_request;
     struct set_socket_deferred_request set_socket_deferred_request;
     struct alloc_console_request alloc_console_request;
@@ -5598,6 +5616,7 @@ union generic_reply
     struct accept_into_socket_reply accept_into_socket_reply;
     struct set_socket_event_reply set_socket_event_reply;
     struct get_socket_event_reply get_socket_event_reply;
+    struct get_socket_info_reply get_socket_info_reply;
     struct enable_socket_event_reply enable_socket_event_reply;
     struct set_socket_deferred_reply set_socket_deferred_reply;
     struct alloc_console_reply alloc_console_reply;
@@ -5802,6 +5821,6 @@ union generic_reply
     struct set_suspend_context_reply set_suspend_context_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 447
+#define SERVER_PROTOCOL_VERSION 448
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/protocol.def b/server/protocol.def
index c9be72e..9164e3e 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -1236,6 +1236,16 @@ enum server_fd_type
 @END
 
 
+/* Get socket info */
+ at REQ(get_socket_info)
+    obj_handle_t handle;        /* handle to the socket */
+ at REPLY
+    int family;                 /* family, see socket manpage */
+    int type;                   /* type, see socket manpage */
+    int protocol;               /* protocol, see socket manpage */
+ at END
+
+
 /* Re-enable pending socket events */
 @REQ(enable_socket_event)
     obj_handle_t handle;        /* handle to the socket */
diff --git a/server/request.h b/server/request.h
index 0777161..e6e2c40 100644
--- a/server/request.h
+++ b/server/request.h
@@ -156,6 +156,7 @@ DECL_HANDLER(accept_socket);
 DECL_HANDLER(accept_into_socket);
 DECL_HANDLER(set_socket_event);
 DECL_HANDLER(get_socket_event);
+DECL_HANDLER(get_socket_info);
 DECL_HANDLER(enable_socket_event);
 DECL_HANDLER(set_socket_deferred);
 DECL_HANDLER(alloc_console);
@@ -414,6 +415,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
     (req_handler)req_accept_into_socket,
     (req_handler)req_set_socket_event,
     (req_handler)req_get_socket_event,
+    (req_handler)req_get_socket_info,
     (req_handler)req_enable_socket_event,
     (req_handler)req_set_socket_deferred,
     (req_handler)req_alloc_console,
@@ -972,6 +974,12 @@ C_ASSERT( FIELD_OFFSET(struct get_socket_event_reply, mask) == 8 );
 C_ASSERT( FIELD_OFFSET(struct get_socket_event_reply, pmask) == 12 );
 C_ASSERT( FIELD_OFFSET(struct get_socket_event_reply, state) == 16 );
 C_ASSERT( sizeof(struct get_socket_event_reply) == 24 );
+C_ASSERT( FIELD_OFFSET(struct get_socket_info_request, handle) == 12 );
+C_ASSERT( sizeof(struct get_socket_info_request) == 16 );
+C_ASSERT( FIELD_OFFSET(struct get_socket_info_reply, family) == 8 );
+C_ASSERT( FIELD_OFFSET(struct get_socket_info_reply, type) == 12 );
+C_ASSERT( FIELD_OFFSET(struct get_socket_info_reply, protocol) == 16 );
+C_ASSERT( sizeof(struct get_socket_info_reply) == 24 );
 C_ASSERT( FIELD_OFFSET(struct enable_socket_event_request, handle) == 12 );
 C_ASSERT( FIELD_OFFSET(struct enable_socket_event_request, mask) == 16 );
 C_ASSERT( FIELD_OFFSET(struct enable_socket_event_request, sstate) == 20 );
diff --git a/server/sock.c b/server/sock.c
index 13cef61..d6a228e 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -1073,3 +1073,17 @@ DECL_HANDLER(set_socket_deferred)
     sock->deferred = acceptsock;
     release_object( sock );
 }
+
+DECL_HANDLER(get_socket_info)
+{
+    struct sock *sock;
+
+    sock = (struct sock *)get_handle_obj( current->process, req->handle, FILE_READ_ATTRIBUTES, &sock_ops );
+    if (!sock) return;
+
+    reply->family   = sock->family;
+    reply->type     = sock->type;
+    reply->protocol = sock->proto;
+
+    release_object( &sock->obj );
+}
diff --git a/server/trace.c b/server/trace.c
index cf211a0..5b51e05 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -1712,6 +1712,18 @@ static void dump_get_socket_event_reply( const struct get_socket_event_reply *re
     dump_varargs_ints( ", errors=", cur_size );
 }
 
+static void dump_get_socket_info_request( const struct get_socket_info_request *req )
+{
+    fprintf( stderr, " handle=%04x", req->handle );
+}
+
+static void dump_get_socket_info_reply( const struct get_socket_info_reply *req )
+{
+    fprintf( stderr, " family=%d", req->family );
+    fprintf( stderr, ", type=%d", req->type );
+    fprintf( stderr, ", protocol=%d", req->protocol );
+}
+
 static void dump_enable_socket_event_request( const struct enable_socket_event_request *req )
 {
     fprintf( stderr, " handle=%04x", req->handle );
@@ -4107,6 +4119,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_accept_into_socket_request,
     (dump_func)dump_set_socket_event_request,
     (dump_func)dump_get_socket_event_request,
+    (dump_func)dump_get_socket_info_request,
     (dump_func)dump_enable_socket_event_request,
     (dump_func)dump_set_socket_deferred_request,
     (dump_func)dump_alloc_console_request,
@@ -4362,6 +4375,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
     NULL,
     NULL,
     (dump_func)dump_get_socket_event_reply,
+    (dump_func)dump_get_socket_info_reply,
     NULL,
     NULL,
     (dump_func)dump_alloc_console_reply,
@@ -4617,6 +4631,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
     "accept_into_socket",
     "set_socket_event",
     "get_socket_event",
+    "get_socket_info",
     "enable_socket_event",
     "set_socket_deferred",
     "alloc_console",




More information about the wine-cvs mailing list