- implemented GetCommModemStatus
- fixed the DTR, CTS and COMMBREAK related subfunctions of EscapeCommFunction
- added more verbose TRACEing
diff --git a/misc/comm.c b/misc/comm.c
index e0cedf3..16b5b6c 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -568,9 +568,11 @@
TRACE("cid=%d, function=%d\n", cid, nFunction);
if ((nFunction != GETMAXCOM) && (nFunction != GETMAXLPT)) {
if ((ptr = GetDeviceStruct(cid)) == NULL) {
+ TRACE("GetDeviceStruct failed\n");
return -1;
}
if (tcgetattr(ptr->fd,&port) == -1) {
+ TRACE("tcgetattr failed\n");
ptr->commerror=WinError();
return -1;
}
@@ -578,21 +580,25 @@
switch (nFunction) {
case RESETDEV:
+ TRACE("RESETDEV\n");
break;
case GETMAXCOM:
+ TRACE("GETMAXCOM\n");
for (max = MAX_PORTS;!COM[max].devicename;max--)
;
return max;
break;
case GETMAXLPT:
+ TRACE("GETMAXLPT\n");
for (max = MAX_PORTS;!LPT[max].devicename;max--)
;
return FLAG_LPT + max;
break;
case GETBASEIRQ:
+ TRACE("GETBASEIRQ\n");
/* FIXME: use tables */
/* just fake something for now */
if (cid & FLAG_LPT) {
@@ -605,30 +611,36 @@
}
break;
-#ifdef TIOCM_DTR
case CLRDTR:
+ TRACE("CLRDTR\n");
+#ifdef TIOCM_DTR
return COMM_WhackModem(ptr->fd, ~TIOCM_DTR, 0);
#endif
-#ifdef TIOCM_RTS
case CLRRTS:
+ TRACE("CLRRTS\n");
+#ifdef TIOCM_RTS
return COMM_WhackModem(ptr->fd, ~TIOCM_RTS, 0);
#endif
-#ifdef TIOCM_DTR
case SETDTR:
+ TRACE("SETDTR\n");
+#ifdef TIOCM_DTR
return COMM_WhackModem(ptr->fd, 0, TIOCM_DTR);
#endif
-#ifdef TIOCM_RTS
case SETRTS:
+ TRACE("SETRTS\n");
+#ifdef TIOCM_RTS
return COMM_WhackModem(ptr->fd, 0, TIOCM_RTS);
#endif
case SETXOFF:
+ TRACE("SETXOFF\n");
port.c_iflag |= IXOFF;
break;
case SETXON:
+ TRACE("SETXON\n");
port.c_iflag |= IXON;
break;
@@ -1517,8 +1529,28 @@
*/
BOOL WINAPI SetCommBreak(HANDLE handle)
{
- FIXME("handle %d, stub!\n", handle);
+#if defined(TIOCSBRK) && defined(TIOCCBRK) /* check if available for compilation */
+ int fd,result;
+
+ fd = COMM_GetWriteFd(handle);
+ if(fd<0) {
+ TRACE("COMM_GetWriteFd failed\n");
+ return FALSE;
+ }
+ result = ioctl(fd,TIOCSBRK,0);
+ close(fd);
+ if (result ==-1)
+ {
+ TRACE("ioctl failed\n");
+ SetLastError(ERROR_NOT_SUPPORTED);
+ return FALSE;
+ }
return TRUE;
+#else
+ FIXME("ioctl not available\n");
+ SetLastError(ERROR_NOT_SUPPORTED);
+ return FALSE;
+#endif
}
/*****************************************************************************
@@ -1526,8 +1558,28 @@
*/
BOOL WINAPI ClearCommBreak(HANDLE handle)
{
- FIXME("handle %d, stub!\n", handle);
+#if defined(TIOCSBRK) && defined(TIOCCBRK) /* check if available for compilation */
+ int fd,result;
+
+ fd = COMM_GetWriteFd(handle);
+ if(fd<0) {
+ TRACE("COMM_GetWriteFd failed\n");
+ return FALSE;
+ }
+ result = ioctl(fd,TIOCCBRK,0);
+ close(fd);
+ if (result ==-1)
+ {
+ TRACE("ioctl failed\n");
+ SetLastError(ERROR_NOT_SUPPORTED);
+ return FALSE;
+ }
return TRUE;
+#else
+ FIXME("ioctl not available\n");
+ SetLastError(ERROR_NOT_SUPPORTED);
+ return FALSE;
+#endif
}
/*****************************************************************************
@@ -1535,7 +1587,7 @@
*/
BOOL WINAPI EscapeCommFunction(HANDLE handle,UINT nFunction)
{
- int fd;
+ int fd,direct=FALSE,result=FALSE;
struct termios port;
TRACE("handle %d, function=%d\n", handle, nFunction);
@@ -1551,60 +1603,89 @@
switch (nFunction) {
case RESETDEV:
+ TRACE("\n");
break;
-#ifdef TIOCM_DTR
case CLRDTR:
- port.c_cflag &= TIOCM_DTR;
+ TRACE("CLRDTR\n");
+#ifdef TIOCM_DTR
+ direct=TRUE;
+ result= COMM_WhackModem(fd, ~TIOCM_DTR, 0);
break;
#endif
-#ifdef TIOCM_RTS
case CLRRTS:
- port.c_cflag &= TIOCM_RTS;
+ TRACE("CLRRTS\n");
+#ifdef TIOCM_RTS
+ direct=TRUE;
+ result= COMM_WhackModem(fd, ~TIOCM_RTS, 0);
break;
#endif
-#ifdef CRTSCTS
case SETDTR:
- port.c_cflag |= CRTSCTS;
+ TRACE("SETDTR\n");
+#ifdef TIOCM_DTR
+ direct=TRUE;
+ result= COMM_WhackModem(fd, 0, TIOCM_DTR);
break;
+#endif
case SETRTS:
- port.c_cflag |= CRTSCTS;
+ TRACE("SETRTS\n");
+#ifdef TIOCM_DTR
+ direct=TRUE;
+ result= COMM_WhackModem(fd, 0, TIOCM_RTS);
break;
#endif
case SETXOFF:
+ TRACE("SETXOFF\n");
port.c_iflag |= IXOFF;
break;
case SETXON:
+ TRACE("SETXON\n");
port.c_iflag |= IXON;
break;
case SETBREAK:
- FIXME("setbreak, stub\n");
-/* ptr->suspended = 1; */
+ TRACE("setbreak\n");
+#ifdef TIOCSBRK
+ direct=TRUE;
+ result = ioctl(fd,TIOCSBRK,0);
break;
+#endif
case CLRBREAK:
- FIXME("clrbreak, stub\n");
-/* ptr->suspended = 0; */
+ TRACE("clrbreak\n");
+#ifdef TIOCSBRK
+ direct=TRUE;
+ result = ioctl(fd,TIOCCBRK,0);
break;
+#endif
default:
WARN("(handle=%d,nFunction=%d): Unknown function\n",
handle, nFunction);
break;
}
- if (tcsetattr(fd, TCSADRAIN, &port) == -1) {
+ if (!direct)
+ if (tcsetattr(fd, TCSADRAIN, &port) == -1) {
commerror = WinError();
close(fd);
return FALSE;
- } else {
- commerror = 0;
- close(fd);
- return TRUE;
- }
+ } else
+ result= TRUE;
+ else
+ {
+ if (result == -1)
+ {
+ result= FALSE;
+ commerror=WinError();
+ }
+ else
+ result = TRUE;
+ }
+ close(fd);
+ return result;
}
/********************************************************************
@@ -2258,8 +2339,38 @@
*/
BOOL WINAPI GetCommModemStatus(HANDLE hFile,LPDWORD lpModemStat )
{
- FIXME("(%d %p)\n",hFile,lpModemStat );
+ int fd,mstat, result=FALSE;
+
+ *lpModemStat=0;
+#ifdef TIOCMGET
+ fd = COMM_GetWriteFd(hFile);
+ if(fd<0)
+ return FALSE;
+ result = ioctl(fd, TIOCMGET, &mstat);
+ close(fd);
+ if (result == -1)
+ {
+ TRACE("ioctl failed\n");
+ return FALSE;
+ }
+ if (mstat & TIOCM_CTS)
+ *lpModemStat |= MS_CTS_ON;
+ if (mstat & TIOCM_DSR)
+ *lpModemStat |= MS_DSR_ON;
+ if (mstat & TIOCM_RNG)
+ *lpModemStat |= MS_RING_ON;
+ /*FIXME: Not really sure about RLSD UB 990810*/
+ if (mstat & TIOCM_CAR)
+ *lpModemStat |= MS_RLSD_ON;
+ TRACE("%s%s%s%s\n",
+ (*lpModemStat &MS_RLSD_ON)?"MS_RLSD_ON ":"",
+ (*lpModemStat &MS_RING_ON)?"MS_RING_ON ":"",
+ (*lpModemStat &MS_DSR_ON)?"MS_DSR_ON ":"",
+ (*lpModemStat &MS_CTS_ON)?"MS_CTS_ON ":"");
return TRUE;
+#else
+ return FALSE;
+#endif
}
/***********************************************************************
* WaitCommEvent (KERNEL32.719)