Implemented SetCommMask, SetCommTimeouts, GetCommMask, GetCommTimeouts.

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;
 }