Module: wine Branch: master Commit: b7b9c4eaa649840bd1619d952197990fbe4ae27d URL: http://source.winehq.org/git/wine.git/?a=commit;h=b7b9c4eaa649840bd1619d9521...
Author: Alexandre Julliard julliard@winehq.org Date: Fri May 5 12:28:19 2017 +0200
server: Implement IOCTL_SERIAL_SET_WAIT_MASK as an ioctl on the server side.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/serial.c | 23 +---------------------- include/wine/server_protocol.h | 5 ++--- server/protocol.def | 2 -- server/request.h | 1 - server/serial.c | 18 ++++++++++-------- server/trace.c | 2 +- 6 files changed, 14 insertions(+), 37 deletions(-)
diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c index 1279837..66facee 100644 --- a/dlls/ntdll/serial.c +++ b/dlls/ntdll/serial.c @@ -771,21 +771,6 @@ static NTSTATUS set_special_chars(int fd, const SERIAL_CHARS* sc) return STATUS_SUCCESS; }
-static NTSTATUS set_wait_mask(HANDLE hDevice, DWORD mask) -{ - NTSTATUS status; - - SERVER_START_REQ( set_serial_info ) - { - req->handle = wine_server_obj_handle( hDevice ); - req->flags = SERIALINFO_SET_MASK; - req->eventmask = mask; - status = wine_server_call( req ); - } - SERVER_END_REQ; - return status; -} - /* * does not change IXOFF but simulates that IXOFF has been received: */ @@ -1126,6 +1111,7 @@ static inline NTSTATUS io_control(HANDLE hDevice, { case IOCTL_SERIAL_GET_TIMEOUTS: case IOCTL_SERIAL_SET_TIMEOUTS: + case IOCTL_SERIAL_SET_WAIT_MASK: /* these are handled on the server side */ return STATUS_NOT_SUPPORTED; } @@ -1301,13 +1287,6 @@ static inline NTSTATUS io_control(HANDLE hDevice, status = STATUS_NOT_SUPPORTED; #endif break; - case IOCTL_SERIAL_SET_WAIT_MASK: - if (lpInBuffer && nInBufferSize == sizeof(DWORD)) - { - status = set_wait_mask(hDevice, *(DWORD*)lpInBuffer); - } - else status = STATUS_INVALID_PARAMETER; - break; case IOCTL_SERIAL_SET_XOFF: status = set_XOff(fd); break; diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 7f92ecd..af792c6 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -3164,13 +3164,12 @@ struct set_serial_info_request struct request_header __header; obj_handle_t handle; int flags; - unsigned int eventmask; + char __pad_20[4]; }; struct set_serial_info_reply { struct reply_header __header; }; -#define SERIALINFO_SET_MASK 0x02 #define SERIALINFO_PENDING_WRITE 0x04 #define SERIALINFO_PENDING_WAIT 0x08
@@ -6396,6 +6395,6 @@ union generic_reply struct terminate_job_reply terminate_job_reply; };
-#define SERVER_PROTOCOL_VERSION 529 +#define SERVER_PROTOCOL_VERSION 530
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/protocol.def b/server/protocol.def index 7004bde..e9de522 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -2309,9 +2309,7 @@ enum message_type @REQ(set_serial_info) obj_handle_t handle; /* handle to comm port */ int flags; /* bitmask to set values (see below) */ - unsigned int eventmask; @END -#define SERIALINFO_SET_MASK 0x02 #define SERIALINFO_PENDING_WRITE 0x04 #define SERIALINFO_PENDING_WAIT 0x08
diff --git a/server/request.h b/server/request.h index e9fcbce..d9e27b8 100644 --- a/server/request.h +++ b/server/request.h @@ -1559,7 +1559,6 @@ C_ASSERT( FIELD_OFFSET(struct get_serial_info_reply, pending_write) == 16 ); C_ASSERT( sizeof(struct get_serial_info_reply) == 24 ); C_ASSERT( FIELD_OFFSET(struct set_serial_info_request, handle) == 12 ); C_ASSERT( FIELD_OFFSET(struct set_serial_info_request, flags) == 16 ); -C_ASSERT( FIELD_OFFSET(struct set_serial_info_request, eventmask) == 20 ); C_ASSERT( sizeof(struct set_serial_info_request) == 24 ); C_ASSERT( FIELD_OFFSET(struct register_async_request, type) == 12 ); C_ASSERT( FIELD_OFFSET(struct register_async_request, async) == 16 ); diff --git a/server/serial.c b/server/serial.c index a2424aa..8755543 100644 --- a/server/serial.c +++ b/server/serial.c @@ -220,6 +220,16 @@ static obj_handle_t serial_ioctl( struct fd *fd, ioctl_code_t code, struct async else set_error( STATUS_BUFFER_TOO_SMALL ); return 0;
+ case IOCTL_SERIAL_SET_WAIT_MASK: + if (get_req_data_size() >= sizeof(serial->eventmask)) + { + serial->eventmask = *(unsigned int *)get_req_data(); + serial->generation++; + fd_async_wake_up( serial->fd, ASYNC_TYPE_WAIT, STATUS_SUCCESS ); + } + else set_error( STATUS_BUFFER_TOO_SMALL ); + return 0; + default: set_error( STATUS_NOT_SUPPORTED ); return 0; @@ -329,14 +339,6 @@ DECL_HANDLER(set_serial_info) if (req->flags & SERIALINFO_PENDING_WRITE) serial->pending_write = 1;
- /* event mask */ - if (req->flags & SERIALINFO_SET_MASK) - { - serial->eventmask = req->eventmask; - serial->generation++; - fd_async_wake_up( serial->fd, ASYNC_TYPE_WAIT, STATUS_SUCCESS ); - } - release_object( serial ); } } diff --git a/server/trace.c b/server/trace.c index e370f96..4f62ee5 100644 --- a/server/trace.c +++ b/server/trace.c @@ -121,6 +121,7 @@ static void dump_ioctl_code( const char *prefix, const ioctl_code_t *code ) CASE(FSCTL_PIPE_WAIT); CASE(IOCTL_SERIAL_GET_TIMEOUTS); CASE(IOCTL_SERIAL_SET_TIMEOUTS); + CASE(IOCTL_SERIAL_SET_WAIT_MASK); CASE(WS_SIO_ADDRESS_LIST_CHANGE); default: fprintf( stderr, "%s%08x", prefix, *code ); break; #undef CASE @@ -2843,7 +2844,6 @@ static void dump_set_serial_info_request( const struct set_serial_info_request * { fprintf( stderr, " handle=%04x", req->handle ); fprintf( stderr, ", flags=%d", req->flags ); - fprintf( stderr, ", eventmask=%08x", req->eventmask ); }
static void dump_register_async_request( const struct register_async_request *req )