Some comm clean up, much more error messages, only use TIOCOUTQ if
defined [wine-bugs/104], tried implementing SetCommTimeouts.
diff --git a/misc/comm.c b/misc/comm.c
index 30fa554..4cee534 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -153,6 +153,7 @@
if (COM[fd].fd)
return &COM[fd];
} else {
+ fd &= 0x7f;
if (LPT[fd].fd)
return &LPT[fd];
}
@@ -338,6 +339,7 @@
}
if (!ValidCOMPort(port)) {
+ FIXME("invalid COM port %d?\n",port);
return -1;
}
@@ -517,6 +519,7 @@
TRACE("cid=%d\n", cid);
if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ FIXME("no cid=%d found!\n", cid);
return -1;
}
if (!(cid&FLAG_LPT)) {
@@ -553,6 +556,7 @@
TRACE("cid=%d\n", cid);
if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ FIXME("no cid=%d found!\n", cid);
return -1;
}
@@ -569,10 +573,10 @@
struct DosDeviceStruct *ptr;
TRACE("cid=%d\n", cid);
- if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ if (!(ptr = GetDeviceStruct(cid))) {
+ FIXME("no cid=%d found!\n", cid);
return -1;
}
-
ptr->suspended = 0;
ptr->commerror = 0;
return 0;
@@ -590,7 +594,7 @@
TRACE("cid=%d, function=%d\n", cid, nFunction);
if ((nFunction != GETMAXCOM) && (nFunction != GETMAXLPT)) {
if ((ptr = GetDeviceStruct(cid)) == NULL) {
- TRACE("GetDeviceStruct failed\n");
+ FIXME("no cid=%d found!\n", cid);
return -1;
}
if (tcgetattr(ptr->fd,&port) == -1) {
@@ -691,6 +695,7 @@
TRACE("cid=%d, queue=%d\n", cid, fnQueue);
if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ FIXME("no cid=%d found!\n", cid);
return -1;
}
switch (fnQueue) {
@@ -727,6 +732,7 @@
unsigned int mstat;
if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ FIXME("no handle for cid = %0x!.\n",cid);
return -1;
}
if (cid&FLAG_LPT) {
@@ -771,8 +777,10 @@
unsigned int mstat;
TRACE("cid %d,mask %d\n",cid,fuEvtMask);
- if ((ptr = GetDeviceStruct(cid)) == NULL)
+ if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ FIXME("no handle for cid = %0x!.\n",cid);
return (SEGPTR)NULL;
+ }
ptr->eventmask = fuEvtMask;
@@ -802,8 +810,10 @@
WORD events;
TRACE("cid %d, mask %d\n", cid, fnEvtClear);
- if ((ptr = GetDeviceStruct(cid)) == NULL)
+ if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ FIXME("no handle for cid = %0x!.\n",cid);
return 0;
+ }
if ((cid&FLAG_LPT) || !ValidCOMPort(cid)) {
WARN(" cid %d not comm port\n",cid);
@@ -825,6 +835,7 @@
TRACE("cid %d, ptr %p\n", lpdcb->Id, lpdcb);
if ((ptr = GetDeviceStruct(lpdcb->Id)) == NULL) {
+ FIXME("no handle for cid = %0x!.\n",lpdcb->Id);
return -1;
}
if (tcgetattr(ptr->fd, &port) == -1) {
@@ -1041,6 +1052,7 @@
TRACE("cid %d, ptr %p\n", cid, lpdcb);
if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ FIXME("no handle for cid = %0x!.\n",cid);
return -1;
}
if (tcgetattr(ptr->fd, &port) == -1) {
@@ -1180,6 +1192,7 @@
TRACE("cid %d, data %d \n", cid, chTransmit);
if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ FIXME("no handle for cid = %0x!.\n",cid);
return -1;
}
@@ -1221,6 +1234,7 @@
TRACE("cid %d (char %d)\n", cid, chUnget);
if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ FIXME("no handle for cid = %0x!.\n",cid);
return -1;
}
@@ -1253,6 +1267,7 @@
TRACE("cid %d, ptr %p, length %d\n", cid, lpvBuf, cbRead);
if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ FIXME("no handle for cid = %0x!.\n",cid);
return -1;
}
@@ -1302,6 +1317,7 @@
TRACE("cid %d, ptr %p, length %d\n",
cid, lpvBuf, cbWrite);
if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ FIXME("no handle for cid = %0x!.\n",cid);
return -1;
}
@@ -1352,6 +1368,7 @@
TRACE("(%d, %x, %d, %d)\n", cid, hwnd, cbWriteNotify, cbOutQueue);
if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ FIXME("no handle for cid = %0x!.\n",cid);
ptr->commerror = IE_BADID;
return -1;
}
@@ -1541,7 +1558,7 @@
*/
static int COMM_GetWriteFd( HANDLE handle)
{
- int fd;
+ int fd = -1;
struct get_write_fd_request *req = get_req_buffer();
req->handle = handle;
server_call_fd( REQ_GET_WRITE_FD, -1, &fd );
@@ -1619,8 +1636,10 @@
TRACE("handle %d, function=%d\n", handle, nFunction);
fd = COMM_GetWriteFd(handle);
- if(fd<0)
+ if(fd<0) {
+ FIXME("handle %d not found.\n",handle);
return FALSE;
+ }
if (tcgetattr(fd,&port) == -1) {
commerror=WinError();
@@ -1725,8 +1744,10 @@
TRACE("handle %d, flags %lx\n", handle, flags);
fd = COMM_GetWriteFd(handle);
- if(fd<0)
- return FALSE;
+ if(fd<0) {
+ FIXME("no handle %d found\n",handle);
+ return FALSE;
+ }
/*
** not exactly sure how these are different
@@ -1734,21 +1755,13 @@
** and the other flushes the kernel's buffers.
*/
if(flags&PURGE_TXABORT)
- {
tcflush(fd,TCOFLUSH);
- }
if(flags&PURGE_RXABORT)
- {
tcflush(fd,TCIFLUSH);
- }
if(flags&PURGE_TXCLEAR)
- {
tcflush(fd,TCOFLUSH);
- }
if(flags&PURGE_RXCLEAR)
- {
tcflush(fd,TCIFLUSH);
- }
close(fd);
return 1;
@@ -1764,6 +1777,7 @@
fd=COMM_GetReadFd(handle);
if(0>fd)
{
+ FIXME("no handle %d found\n",handle);
return FALSE;
}
@@ -1771,8 +1785,12 @@
{
lpStat->status = 0;
+#ifdef TIOCOUTQ
if(ioctl(fd, TIOCOUTQ, &lpStat->cbOutQue))
WARN("ioctl returned error\n");
+#else
+ lpStat->cbOutQue = 0; /* FIXME: find a different way to find out */
+#endif
if(ioctl(fd, TIOCINQ, &lpStat->cbInQue))
WARN("ioctl returned error\n");
@@ -1805,8 +1823,8 @@
FIXME("insize %ld outsize %ld unimplemented stub\n", insize, outsize);
fd=COMM_GetWriteFd(handle);
- if(0>fd)
- {
+ if(0>fd) {
+ FIXME("handle %d not found?\n",handle);
return FALSE;
}
close(fd);
@@ -1823,6 +1841,7 @@
TRACE("handle %d, mask %p\n", handle, evtmask);
if(0>(fd=COMM_GetReadFd(handle)))
{
+ FIXME("no handle %d found\n",handle);
return FALSE;
}
close(fd);
@@ -1861,6 +1880,7 @@
(evtmask&EV_TXEMPTY)?"EV_TXEMPTY":"");
if(0>(fd=COMM_GetWriteFd(handle))) {
+ FIXME("no handle %d found\n",handle);
return FALSE;
}
close(fd);
@@ -1884,7 +1904,10 @@
TRACE("%s %s\n",(lpdcb->fInX)?"IXON":"~IXON",
(lpdcb->fOutX)?"IXOFF":"~IXOFF");
- if ((fd = COMM_GetWriteFd(handle)) < 0) return FALSE;
+ if ((fd = COMM_GetWriteFd(handle)) < 0) {
+ FIXME("no handle %d found\n",handle);
+ return FALSE;
+ }
if ((tcgetattr(fd,&port)) == -1) {
int save_error = errno;
@@ -2318,9 +2341,9 @@
struct DosDeviceStruct *ptr;
FIXME("(%d,'%c'), use win32 handle!\n",cid,chTransmit);
- if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ if ((ptr = GetDeviceStruct(cid)) == NULL)
+ FIXME("no handle for cid = %0x!.\n",cid);
return FALSE;
- }
if (ptr->suspended) {
ptr->commerror = IE_HARDWARE;
@@ -2338,26 +2361,52 @@
/*****************************************************************************
* GetCommTimeouts (KERNEL32.160)
*/
-BOOL WINAPI GetCommTimeouts(INT cid,LPCOMMTIMEOUTS lptimeouts)
+BOOL WINAPI GetCommTimeouts(HANDLE hcom,LPCOMMTIMEOUTS lptimeouts)
{
- FIXME("(%x,%p):stub.\n",cid,lptimeouts);
+ FIXME("(%x,%p):stub.\n",hcom,lptimeouts);
return TRUE;
}
/*****************************************************************************
* SetCommTimeouts (KERNEL32.453)
*/
-BOOL WINAPI SetCommTimeouts(INT cid,LPCOMMTIMEOUTS lptimeouts) {
- FIXME("(%x,%p):stub.\n",cid,lptimeouts);
- TRACE("ReadIntervalTimeout %ld\n",lptimeouts->ReadIntervalTimeout);
- TRACE("ReadTotalTimeoutMultiplier %ld\n",
- lptimeouts->ReadTotalTimeoutMultiplier);
- TRACE("ReadTotalTimeoutConstant %ld\n",
- lptimeouts->ReadTotalTimeoutConstant);
- TRACE("WriteTotalTimeoutMultiplier %ld\n",
- lptimeouts->WriteTotalTimeoutMultiplier);
- TRACE("WriteTotalTimeoutConstant %ld\n",
- lptimeouts->WriteTotalTimeoutConstant);
+BOOL WINAPI SetCommTimeouts(HANDLE hcom,LPCOMMTIMEOUTS lptimeouts) {
+ struct DosDeviceStruct *ptr;
+ struct termios tios;
+ int fd;
+
+ FIXME("(%x,%p):stub.\n",hcom,lptimeouts);
+ /*
+ if ((ptr = GetDeviceStruct(hcom)) == NULL) {
+ FIXME("no handle for cid = %0x!.\n",hcom);
+ return FALSE;
+ }
+ */
+
+ fd = COMM_GetWriteFd(hcom);
+ if (fd < 0) {
+ FIXME("no fd for cid = %0x!.\n",hcom);
+ return FALSE;
+ }
+
+
+ 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);
+
+
+ if (-1==tcgetattr(fd,&tios)) {
+ FIXME("tcgetattr on fd %d failed!\n",fd);
+ return FALSE;
+ }
+ /* VTIME is in 1/10 seconds */
+ tios.c_cc[VTIME]= (lptimeouts->ReadIntervalTimeout+99)/100;
+ if (-1==tcsetattr(fd,0,&tios)) {
+ FIXME("tcsetattr on fd %d failed!\n",fd);
+ return FALSE;
+ }
return TRUE;
}