Implemented SetCommMask, SetCommTimeouts, GetCommMask, GetCommTimeouts.
diff --git a/include/server.h b/include/server.h
index cefb21b..d79c504 100644
--- a/include/server.h
+++ b/include/server.h
@@ -1322,6 +1322,36 @@
IN char name[1]; /* file name */
};
+struct get_serial_info_request
+{
+ REQUEST_HEADER; /* request header */
+ IN int handle; /* handle to comm port */
+ OUT unsigned int readinterval;
+ OUT unsigned int readconst;
+ OUT unsigned int readmult;
+ OUT unsigned int writeconst;
+ OUT unsigned int writemult;
+ OUT unsigned int eventmask;
+ OUT unsigned int commerror;
+};
+
+struct set_serial_info_request
+{
+ REQUEST_HEADER; /* request header */
+ IN int handle; /* handle to comm port */
+ IN int flags; /* bitmask to set values (see below) */
+ IN unsigned int readinterval;
+ IN unsigned int readconst;
+ IN unsigned int readmult;
+ IN unsigned int writeconst;
+ IN unsigned int writemult;
+ IN unsigned int eventmask;
+ IN unsigned int commerror;
+};
+#define SERIALINFO_SET_TIMEOUTS 0x01
+#define SERIALINFO_SET_MASK 0x02
+#define SERIALINFO_SET_ERROR 0x04
+
/* Everything below this line is generated automatically by tools/make_requests */
/* ### make_requests begin ### */
@@ -1435,6 +1465,8 @@
REQ_WAKE_QUEUE,
REQ_WAIT_INPUT_IDLE,
REQ_CREATE_SERIAL,
+ REQ_GET_SERIAL_INFO,
+ REQ_SET_SERIAL_INFO,
REQ_NB_REQUESTS
};
@@ -1550,9 +1582,11 @@
struct wake_queue_request wake_queue;
struct wait_input_idle_request wait_input_idle;
struct create_serial_request create_serial;
+ struct get_serial_info_request get_serial_info;
+ struct set_serial_info_request set_serial_info;
};
-#define SERVER_PROTOCOL_VERSION 21
+#define SERVER_PROTOCOL_VERSION 22
/* ### make_requests end ### */
/* Everything above this line is generated automatically by tools/make_requests */
diff --git a/misc/comm.c b/misc/comm.c
index 35b4ea7..69a7111 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -1906,26 +1906,17 @@
*/
BOOL WINAPI GetCommMask(HANDLE handle,LPDWORD evtmask)
{
- int fd;
+ struct get_serial_info_request *req = get_req_buffer();
TRACE("handle %d, mask %p\n", handle, evtmask);
- if(0>(fd=COMM_GetReadFd(handle)))
- {
- FIXME("no handle %d found\n",handle);
+
+ req->handle = handle;
+
+ if(server_call( REQ_GET_SERIAL_INFO ))
return FALSE;
- }
- close(fd);
- *evtmask = eventmask;
- TRACE("%s%s%s%s%s%s%s%s%s\n",
- (eventmask&EV_BREAK)?"EV_BREAK":"",
- (eventmask&EV_CTS)?"EV_CTS":"",
- (eventmask&EV_DSR)?"EV_DSR":"",
- (eventmask&EV_ERR)?"EV_ERR":"",
- (eventmask&EV_RING)?"EV_RING":"",
- (eventmask&EV_RLSD)?"EV_RLSD":"",
- (eventmask&EV_RXCHAR)?"EV_RXCHAR":"",
- (eventmask&EV_RXFLAG)?"EV_RXFLAG":"",
- (eventmask&EV_TXEMPTY)?"EV_TXEMPTY":"");
+
+ if(evtmask)
+ *evtmask = req->eventmask;
return TRUE;
}
@@ -1935,26 +1926,17 @@
*/
BOOL WINAPI SetCommMask(HANDLE handle,DWORD evtmask)
{
- int fd;
+ struct set_serial_info_request *req = get_req_buffer();
TRACE("handle %d, mask %lx\n", handle, evtmask);
- TRACE("%s%s%s%s%s%s%s%s%s\n",
- (evtmask&EV_BREAK)?"EV_BREAK":"",
- (evtmask&EV_CTS)?"EV_CTS":"",
- (evtmask&EV_DSR)?"EV_DSR":"",
- (evtmask&EV_ERR)?"EV_ERR":"",
- (evtmask&EV_RING)?"EV_RING":"",
- (evtmask&EV_RLSD)?"EV_RLSD":"",
- (evtmask&EV_RXCHAR)?"EV_RXCHAR":"",
- (evtmask&EV_RXFLAG)?"EV_RXFLAG":"",
- (evtmask&EV_TXEMPTY)?"EV_TXEMPTY":"");
- if(0>(fd=COMM_GetWriteFd(handle))) {
- FIXME("no handle %d found\n",handle);
+ req->handle = handle;
+ req->flags = SERIALINFO_SET_MASK;
+ req->eventmask = evtmask;
+
+ if(server_call( REQ_SET_SERIAL_INFO ))
return FALSE;
- }
- close(fd);
- eventmask = evtmask;
+
return TRUE;
}
@@ -2461,41 +2443,78 @@
/*****************************************************************************
* GetCommTimeouts (KERNEL32.160)
*/
-BOOL WINAPI GetCommTimeouts(HANDLE hcom,LPCOMMTIMEOUTS lptimeouts)
+BOOL WINAPI GetCommTimeouts(HANDLE hComm,LPCOMMTIMEOUTS lptimeouts)
{
- FIXME("(%x,%p):stub.\n",hcom,lptimeouts);
+ struct get_serial_info_request *req = get_req_buffer();
+
+ TRACE("(%x,%p)\n",hComm,lptimeouts);
+
+ if(!lptimeouts)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ req->handle = hComm;
+
+ if(server_call( REQ_GET_SERIAL_INFO ))
+ return FALSE;
+
+ lptimeouts->ReadIntervalTimeout = req->readinterval;
+ lptimeouts->ReadTotalTimeoutMultiplier = req->readmult;
+ lptimeouts->ReadTotalTimeoutConstant = req->readconst;
+ lptimeouts->WriteTotalTimeoutMultiplier = req->writemult;
+ lptimeouts->WriteTotalTimeoutConstant = req->writeconst;
+
return TRUE;
}
/*****************************************************************************
* SetCommTimeouts (KERNEL32.453)
+ *
+ * Sets the timeouts used when reading and writing data to/from COMM ports.
+ *
+ * ReadIntervalTimeout
+ * - converted and passes to linux kernel as c_cc[VTIME]
+ * ReadTotalTimeoutMultiplier, ReadTotalTimeoutConstant
+ * - used in ReadFile to calculate GetOverlappedResult's timeout
+ * WriteTotalTimeoutMultiplier, WriteTotalTimeoutConstant
+ * - used in WriteFile to calculate GetOverlappedResult's timeout
*/
-BOOL WINAPI SetCommTimeouts(HANDLE hcom,LPCOMMTIMEOUTS lptimeouts) {
- /* struct DosDeviceStruct *ptr; */
- struct termios tios;
+BOOL WINAPI SetCommTimeouts(
+ HANDLE hComm, /* [I] handle of COMM device */
+ LPCOMMTIMEOUTS lptimeouts /* [I] pointer to COMMTIMEOUTS structure */
+) {
+ struct set_serial_info_request *req = get_req_buffer();
int fd;
+ struct termios tios;
- FIXME("(%x,%p):stub.\n",hcom,lptimeouts);
- /*
- if ((ptr = GetDeviceStruct(hcom)) == NULL) {
- FIXME("no handle for cid = %0x!.\n",hcom);
- return FALSE;
- }
- */
+ TRACE("(%x,%p)\n",hComm,lptimeouts);
- fd = COMM_GetWriteFd(hcom);
- if (fd < 0) {
- FIXME("no fd for cid = %0x!.\n",hcom);
+ if(!lptimeouts)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
+ req->handle = hComm;
+ req->flags = SERIALINFO_SET_TIMEOUTS;
- FIXME("ReadIntervalTimeout %ld\n",lptimeouts->ReadIntervalTimeout);
- FIXME("ReadTotalTimeoutMultiplier %ld\n",lptimeouts->ReadTotalTimeoutMultiplier);
- FIXME("ReadTotalTimeoutConstant %ld\n",lptimeouts->ReadTotalTimeoutConstant);
- FIXME("WriteTotalTimeoutMultiplier %ld\n",lptimeouts->WriteTotalTimeoutMultiplier);
- FIXME("WriteTotalTimeoutConstant %ld\n",lptimeouts->WriteTotalTimeoutConstant);
+ req->readinterval = lptimeouts->ReadIntervalTimeout ;
+ req->readmult = lptimeouts->ReadTotalTimeoutMultiplier ;
+ req->readconst = lptimeouts->ReadTotalTimeoutConstant ;
+ req->writemult = lptimeouts->WriteTotalTimeoutMultiplier ;
+ req->writeconst = lptimeouts->WriteTotalTimeoutConstant ;
+ if(server_call( REQ_SET_SERIAL_INFO ))
+ return FALSE;
+
+ /* FIXME: move this stuff to the server */
+ fd = COMM_GetWriteFd(hComm);
+ if (fd < 0) {
+ FIXME("no fd for handle = %0x!.\n",hComm);
+ return FALSE;
+ }
if (-1==tcgetattr(fd,&tios)) {
FIXME("tcgetattr on fd %d failed!\n",fd);
@@ -2507,6 +2526,7 @@
FIXME("tcsetattr on fd %d failed!\n",fd);
return FALSE;
}
+ close(fd);
return TRUE;
}
diff --git a/server/request.h b/server/request.h
index d66c230..975330c 100644
--- a/server/request.h
+++ b/server/request.h
@@ -202,6 +202,8 @@
DECL_HANDLER(wake_queue);
DECL_HANDLER(wait_input_idle);
DECL_HANDLER(create_serial);
+DECL_HANDLER(get_serial_info);
+DECL_HANDLER(set_serial_info);
#ifdef WANT_REQUEST_HANDLERS
@@ -316,6 +318,8 @@
(req_handler)req_wake_queue,
(req_handler)req_wait_input_idle,
(req_handler)req_create_serial,
+ (req_handler)req_get_serial_info,
+ (req_handler)req_set_serial_info,
};
#endif /* WANT_REQUEST_HANDLERS */
diff --git a/server/serial.c b/server/serial.c
index e5b6066..64a9956 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -196,3 +196,58 @@
}
}
+DECL_HANDLER(get_serial_info)
+{
+ struct serial *serial;
+
+ if ((serial = get_serial_obj( current->process, req->handle, 0 )))
+ {
+ /* timeouts */
+ req->readinterval = serial->readinterval;
+ req->readconst = serial->readconst;
+ req->readmult = serial->readmult;
+ req->writeconst = serial->writeconst;
+ req->writemult = serial->writemult;
+
+ /* event mask */
+ req->eventmask = serial->eventmask;
+
+ /* comm port error status */
+ req->commerror = serial->commerror;
+
+ release_object( serial );
+ }
+}
+
+DECL_HANDLER(set_serial_info)
+{
+ struct serial *serial;
+
+ if ((serial = get_serial_obj( current->process, req->handle, 0 )))
+ {
+ /* timeouts */
+ if(req->flags & SERIALINFO_SET_TIMEOUTS)
+ {
+ serial->readinterval = req->readinterval;
+ serial->readconst = req->readconst;
+ serial->readmult = req->readmult;
+ serial->writeconst = req->writeconst;
+ serial->writemult = req->writemult;
+ }
+
+ /* event mask */
+ if(req->flags & SERIALINFO_SET_MASK)
+ {
+ serial->eventmask = req->eventmask;
+ }
+
+ /* comm port error status */
+ if(req->flags & SERIALINFO_SET_ERROR)
+ {
+ serial->commerror = req->commerror;
+ }
+
+ release_object( serial );
+ }
+}
+
diff --git a/server/trace.c b/server/trace.c
index 07c1a6d..786c8b4 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -1431,6 +1431,35 @@
fprintf( stderr, " handle=%d", req->handle );
}
+static void dump_get_serial_info_request( const struct get_serial_info_request *req )
+{
+ fprintf( stderr, " handle=%d", req->handle );
+}
+
+static void dump_get_serial_info_reply( const struct get_serial_info_request *req )
+{
+ fprintf( stderr, " readinterval=%08x,", req->readinterval );
+ fprintf( stderr, " readconst=%08x,", req->readconst );
+ fprintf( stderr, " readmult=%08x,", req->readmult );
+ fprintf( stderr, " writeconst=%08x,", req->writeconst );
+ fprintf( stderr, " writemult=%08x,", req->writemult );
+ fprintf( stderr, " eventmask=%08x,", req->eventmask );
+ fprintf( stderr, " commerror=%08x", req->commerror );
+}
+
+static void dump_set_serial_info_request( const struct set_serial_info_request *req )
+{
+ fprintf( stderr, " handle=%d,", req->handle );
+ fprintf( stderr, " flags=%d,", req->flags );
+ fprintf( stderr, " readinterval=%08x,", req->readinterval );
+ fprintf( stderr, " readconst=%08x,", req->readconst );
+ fprintf( stderr, " readmult=%08x,", req->readmult );
+ fprintf( stderr, " writeconst=%08x,", req->writeconst );
+ fprintf( stderr, " writemult=%08x,", req->writemult );
+ fprintf( stderr, " eventmask=%08x,", req->eventmask );
+ fprintf( stderr, " commerror=%08x", req->commerror );
+}
+
static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_new_process_request,
(dump_func)dump_wait_process_request,
@@ -1540,6 +1569,8 @@
(dump_func)dump_wake_queue_request,
(dump_func)dump_wait_input_idle_request,
(dump_func)dump_create_serial_request,
+ (dump_func)dump_get_serial_info_request,
+ (dump_func)dump_set_serial_info_request,
};
static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
@@ -1651,6 +1682,8 @@
(dump_func)0,
(dump_func)dump_wait_input_idle_reply,
(dump_func)dump_create_serial_reply,
+ (dump_func)dump_get_serial_info_reply,
+ (dump_func)0,
};
static const char * const req_names[REQ_NB_REQUESTS] = {
@@ -1762,6 +1795,8 @@
"wake_queue",
"wait_input_idle",
"create_serial",
+ "get_serial_info",
+ "set_serial_info",
};
/* ### make_requests end ### */