mirror of
https://github.com/reactos/wine.git
synced 2025-02-19 04:18:09 +00:00
- implemented GetCommModemStatus
- fixed the DTR, CTS and COMMBREAK related subfunctions of EscapeCommFunction - added more verbose TRACEing
This commit is contained in:
parent
594af0de05
commit
684ee2ce21
161
misc/comm.c
161
misc/comm.c
@ -568,9 +568,11 @@ LONG WINAPI EscapeCommFunction16(UINT16 cid,UINT16 nFunction)
|
|||||||
TRACE("cid=%d, function=%d\n", cid, nFunction);
|
TRACE("cid=%d, function=%d\n", cid, nFunction);
|
||||||
if ((nFunction != GETMAXCOM) && (nFunction != GETMAXLPT)) {
|
if ((nFunction != GETMAXCOM) && (nFunction != GETMAXLPT)) {
|
||||||
if ((ptr = GetDeviceStruct(cid)) == NULL) {
|
if ((ptr = GetDeviceStruct(cid)) == NULL) {
|
||||||
|
TRACE("GetDeviceStruct failed\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (tcgetattr(ptr->fd,&port) == -1) {
|
if (tcgetattr(ptr->fd,&port) == -1) {
|
||||||
|
TRACE("tcgetattr failed\n");
|
||||||
ptr->commerror=WinError();
|
ptr->commerror=WinError();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -578,21 +580,25 @@ LONG WINAPI EscapeCommFunction16(UINT16 cid,UINT16 nFunction)
|
|||||||
|
|
||||||
switch (nFunction) {
|
switch (nFunction) {
|
||||||
case RESETDEV:
|
case RESETDEV:
|
||||||
|
TRACE("RESETDEV\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GETMAXCOM:
|
case GETMAXCOM:
|
||||||
|
TRACE("GETMAXCOM\n");
|
||||||
for (max = MAX_PORTS;!COM[max].devicename;max--)
|
for (max = MAX_PORTS;!COM[max].devicename;max--)
|
||||||
;
|
;
|
||||||
return max;
|
return max;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GETMAXLPT:
|
case GETMAXLPT:
|
||||||
|
TRACE("GETMAXLPT\n");
|
||||||
for (max = MAX_PORTS;!LPT[max].devicename;max--)
|
for (max = MAX_PORTS;!LPT[max].devicename;max--)
|
||||||
;
|
;
|
||||||
return FLAG_LPT + max;
|
return FLAG_LPT + max;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GETBASEIRQ:
|
case GETBASEIRQ:
|
||||||
|
TRACE("GETBASEIRQ\n");
|
||||||
/* FIXME: use tables */
|
/* FIXME: use tables */
|
||||||
/* just fake something for now */
|
/* just fake something for now */
|
||||||
if (cid & FLAG_LPT) {
|
if (cid & FLAG_LPT) {
|
||||||
@ -605,30 +611,36 @@ LONG WINAPI EscapeCommFunction16(UINT16 cid,UINT16 nFunction)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef TIOCM_DTR
|
|
||||||
case CLRDTR:
|
case CLRDTR:
|
||||||
|
TRACE("CLRDTR\n");
|
||||||
|
#ifdef TIOCM_DTR
|
||||||
return COMM_WhackModem(ptr->fd, ~TIOCM_DTR, 0);
|
return COMM_WhackModem(ptr->fd, ~TIOCM_DTR, 0);
|
||||||
#endif
|
#endif
|
||||||
#ifdef TIOCM_RTS
|
|
||||||
case CLRRTS:
|
case CLRRTS:
|
||||||
|
TRACE("CLRRTS\n");
|
||||||
|
#ifdef TIOCM_RTS
|
||||||
return COMM_WhackModem(ptr->fd, ~TIOCM_RTS, 0);
|
return COMM_WhackModem(ptr->fd, ~TIOCM_RTS, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TIOCM_DTR
|
|
||||||
case SETDTR:
|
case SETDTR:
|
||||||
|
TRACE("SETDTR\n");
|
||||||
|
#ifdef TIOCM_DTR
|
||||||
return COMM_WhackModem(ptr->fd, 0, TIOCM_DTR);
|
return COMM_WhackModem(ptr->fd, 0, TIOCM_DTR);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TIOCM_RTS
|
|
||||||
case SETRTS:
|
case SETRTS:
|
||||||
|
TRACE("SETRTS\n");
|
||||||
|
#ifdef TIOCM_RTS
|
||||||
return COMM_WhackModem(ptr->fd, 0, TIOCM_RTS);
|
return COMM_WhackModem(ptr->fd, 0, TIOCM_RTS);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case SETXOFF:
|
case SETXOFF:
|
||||||
|
TRACE("SETXOFF\n");
|
||||||
port.c_iflag |= IXOFF;
|
port.c_iflag |= IXOFF;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SETXON:
|
case SETXON:
|
||||||
|
TRACE("SETXON\n");
|
||||||
port.c_iflag |= IXON;
|
port.c_iflag |= IXON;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1517,8 +1529,28 @@ int commerror=0,eventmask=0;
|
|||||||
*/
|
*/
|
||||||
BOOL WINAPI SetCommBreak(HANDLE handle)
|
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;
|
return TRUE;
|
||||||
|
#else
|
||||||
|
FIXME("ioctl not available\n");
|
||||||
|
SetLastError(ERROR_NOT_SUPPORTED);
|
||||||
|
return FALSE;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
@ -1526,8 +1558,28 @@ BOOL WINAPI SetCommBreak(HANDLE handle)
|
|||||||
*/
|
*/
|
||||||
BOOL WINAPI ClearCommBreak(HANDLE handle)
|
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;
|
return TRUE;
|
||||||
|
#else
|
||||||
|
FIXME("ioctl not available\n");
|
||||||
|
SetLastError(ERROR_NOT_SUPPORTED);
|
||||||
|
return FALSE;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
@ -1535,7 +1587,7 @@ BOOL WINAPI ClearCommBreak(HANDLE handle)
|
|||||||
*/
|
*/
|
||||||
BOOL WINAPI EscapeCommFunction(HANDLE handle,UINT nFunction)
|
BOOL WINAPI EscapeCommFunction(HANDLE handle,UINT nFunction)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd,direct=FALSE,result=FALSE;
|
||||||
struct termios port;
|
struct termios port;
|
||||||
|
|
||||||
TRACE("handle %d, function=%d\n", handle, nFunction);
|
TRACE("handle %d, function=%d\n", handle, nFunction);
|
||||||
@ -1551,60 +1603,89 @@ BOOL WINAPI EscapeCommFunction(HANDLE handle,UINT nFunction)
|
|||||||
|
|
||||||
switch (nFunction) {
|
switch (nFunction) {
|
||||||
case RESETDEV:
|
case RESETDEV:
|
||||||
|
TRACE("\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef TIOCM_DTR
|
|
||||||
case CLRDTR:
|
case CLRDTR:
|
||||||
port.c_cflag &= TIOCM_DTR;
|
TRACE("CLRDTR\n");
|
||||||
|
#ifdef TIOCM_DTR
|
||||||
|
direct=TRUE;
|
||||||
|
result= COMM_WhackModem(fd, ~TIOCM_DTR, 0);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TIOCM_RTS
|
|
||||||
case CLRRTS:
|
case CLRRTS:
|
||||||
port.c_cflag &= TIOCM_RTS;
|
TRACE("CLRRTS\n");
|
||||||
|
#ifdef TIOCM_RTS
|
||||||
|
direct=TRUE;
|
||||||
|
result= COMM_WhackModem(fd, ~TIOCM_RTS, 0);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CRTSCTS
|
|
||||||
case SETDTR:
|
case SETDTR:
|
||||||
port.c_cflag |= CRTSCTS;
|
TRACE("SETDTR\n");
|
||||||
|
#ifdef TIOCM_DTR
|
||||||
|
direct=TRUE;
|
||||||
|
result= COMM_WhackModem(fd, 0, TIOCM_DTR);
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
case SETRTS:
|
case SETRTS:
|
||||||
port.c_cflag |= CRTSCTS;
|
TRACE("SETRTS\n");
|
||||||
|
#ifdef TIOCM_DTR
|
||||||
|
direct=TRUE;
|
||||||
|
result= COMM_WhackModem(fd, 0, TIOCM_RTS);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case SETXOFF:
|
case SETXOFF:
|
||||||
|
TRACE("SETXOFF\n");
|
||||||
port.c_iflag |= IXOFF;
|
port.c_iflag |= IXOFF;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SETXON:
|
case SETXON:
|
||||||
|
TRACE("SETXON\n");
|
||||||
port.c_iflag |= IXON;
|
port.c_iflag |= IXON;
|
||||||
break;
|
break;
|
||||||
case SETBREAK:
|
case SETBREAK:
|
||||||
FIXME("setbreak, stub\n");
|
TRACE("setbreak\n");
|
||||||
/* ptr->suspended = 1; */
|
#ifdef TIOCSBRK
|
||||||
|
direct=TRUE;
|
||||||
|
result = ioctl(fd,TIOCSBRK,0);
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case CLRBREAK:
|
case CLRBREAK:
|
||||||
FIXME("clrbreak, stub\n");
|
TRACE("clrbreak\n");
|
||||||
/* ptr->suspended = 0; */
|
#ifdef TIOCSBRK
|
||||||
|
direct=TRUE;
|
||||||
|
result = ioctl(fd,TIOCCBRK,0);
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
WARN("(handle=%d,nFunction=%d): Unknown function\n",
|
WARN("(handle=%d,nFunction=%d): Unknown function\n",
|
||||||
handle, nFunction);
|
handle, nFunction);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tcsetattr(fd, TCSADRAIN, &port) == -1) {
|
if (!direct)
|
||||||
|
if (tcsetattr(fd, TCSADRAIN, &port) == -1) {
|
||||||
commerror = WinError();
|
commerror = WinError();
|
||||||
close(fd);
|
close(fd);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else {
|
} else
|
||||||
commerror = 0;
|
result= TRUE;
|
||||||
close(fd);
|
else
|
||||||
return TRUE;
|
{
|
||||||
}
|
if (result == -1)
|
||||||
|
{
|
||||||
|
result= FALSE;
|
||||||
|
commerror=WinError();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
result = TRUE;
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
@ -2258,8 +2339,38 @@ BOOL WINAPI SetCommTimeouts(INT cid,LPCOMMTIMEOUTS lptimeouts) {
|
|||||||
*/
|
*/
|
||||||
BOOL WINAPI GetCommModemStatus(HANDLE hFile,LPDWORD lpModemStat )
|
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;
|
return TRUE;
|
||||||
|
#else
|
||||||
|
return FALSE;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* WaitCommEvent (KERNEL32.719)
|
* WaitCommEvent (KERNEL32.719)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user