Commit 0a17a7c0 authored by Mike McCormack's avatar Mike McCormack Committed by Alexandre Julliard

Rewrite SetCommState16 to use SetCommState.

parent 26af8221
...@@ -894,11 +894,8 @@ UINT16 WINAPI GetCommEventMask16(INT16 cid,UINT16 fnEvtClear) ...@@ -894,11 +894,8 @@ UINT16 WINAPI GetCommEventMask16(INT16 cid,UINT16 fnEvtClear)
*/ */
INT16 WINAPI SetCommState16(LPDCB16 lpdcb) INT16 WINAPI SetCommState16(LPDCB16 lpdcb)
{ {
struct termios port;
struct DosDeviceStruct *ptr; struct DosDeviceStruct *ptr;
int bytesize, stopbits; DCB dcb;
int fail=0;
int fd,r=0;
TRACE("cid %d, ptr %p\n", lpdcb->Id, lpdcb); TRACE("cid %d, ptr %p\n", lpdcb->Id, lpdcb);
if ((ptr = GetDeviceStruct(lpdcb->Id)) == NULL) { if ((ptr = GetDeviceStruct(lpdcb->Id)) == NULL) {
...@@ -906,248 +903,33 @@ INT16 WINAPI SetCommState16(LPDCB16 lpdcb) ...@@ -906,248 +903,33 @@ INT16 WINAPI SetCommState16(LPDCB16 lpdcb)
return -1; return -1;
} }
/* FIXME: replace with a call to SetCommState */ memset(&dcb,0,sizeof dcb);
if ( (fd = FILE_GetUnixHandle(ptr->handle,GENERIC_READ)) == 0 ) dcb.DCBlength = sizeof dcb;
return -1; if(lpdcb->BaudRate==57601)
if (tcgetattr(fd, &port) == -1) { dcb.BaudRate = 115200;
close(fd);
ptr->commerror = WinError();
return -1;
}
port.c_cc[VMIN] = 0;
port.c_cc[VTIME] = 1;
#ifdef IMAXBEL
port.c_iflag &= ~(ISTRIP|BRKINT|IGNCR|ICRNL|INLCR|IMAXBEL);
#else
port.c_iflag &= ~(ISTRIP|BRKINT|IGNCR|ICRNL|INLCR);
#endif
port.c_iflag |= (IGNBRK);
port.c_oflag &= ~(OPOST);
port.c_cflag &= ~(HUPCL);
port.c_cflag |= CLOCAL | CREAD;
port.c_lflag &= ~(ICANON|ECHO|ISIG);
port.c_lflag |= NOFLSH;
TRACE("baudrate %d\n",lpdcb->BaudRate);
#ifdef CBAUD
port.c_cflag &= ~CBAUD;
switch (lpdcb->BaudRate) {
case 110:
case CBR_110:
port.c_cflag |= B110;
break;
case 300:
case CBR_300:
port.c_cflag |= B300;
break;
case 600:
case CBR_600:
port.c_cflag |= B600;
break;
case 1200:
case CBR_1200:
port.c_cflag |= B1200;
break;
case 2400:
case CBR_2400:
port.c_cflag |= B2400;
break;
case 4800:
case CBR_4800:
port.c_cflag |= B4800;
break;
case 9600:
case CBR_9600:
port.c_cflag |= B9600;
break;
case 19200:
case CBR_19200:
port.c_cflag |= B19200;
break;
case 38400:
case CBR_38400:
port.c_cflag |= B38400;
break;
#ifdef B57600
case 57600:
port.c_cflag |= B57600;
break;
#endif
#ifdef B115200
case 57601:
port.c_cflag |= B115200;
break;
#endif
default:
ptr->commerror = IE_BAUDRATE;
fail=1;
}
#elif !defined(__EMX__)
switch (lpdcb->BaudRate) {
case 110:
case CBR_110:
port.c_ospeed = B110;
break;
case 300:
case CBR_300:
port.c_ospeed = B300;
break;
case 600:
case CBR_600:
port.c_ospeed = B600;
break;
case 1200:
case CBR_1200:
port.c_ospeed = B1200;
break;
case 2400:
case CBR_2400:
port.c_ospeed = B2400;
break;
case 4800:
case CBR_4800:
port.c_ospeed = B4800;
break;
case 9600:
case CBR_9600:
port.c_ospeed = B9600;
break;
case 19200:
case CBR_19200:
port.c_ospeed = B19200;
break;
case 38400:
case CBR_38400:
port.c_ospeed = B38400;
break;
default:
ptr->commerror = IE_BAUDRATE;
fail=1;
}
port.c_ispeed = port.c_ospeed;
#endif
bytesize=lpdcb->ByteSize;
stopbits=lpdcb->StopBits;
TRACE("fParity %d Parity %d\n",lpdcb->fParity, lpdcb->Parity);
#ifdef CMSPAR
port.c_cflag &= ~(PARENB | PARODD | CMSPAR);
#else
port.c_cflag &= ~(PARENB | PARODD);
#endif
if (lpdcb->fParity)
port.c_iflag |= INPCK;
else else
port.c_iflag &= ~INPCK; dcb.BaudRate = lpdcb->BaudRate;
switch (lpdcb->Parity) {
case NOPARITY:
break;
case ODDPARITY:
port.c_cflag |= (PARENB | PARODD);
break;
case EVENPARITY:
port.c_cflag |= PARENB;
break;
#ifdef CMSPAR
/* Linux defines mark/space (stick) parity */
case MARKPARITY:
port.c_cflag |= (PARENB | CMSPAR);
break;
case SPACEPARITY:
port.c_cflag |= (PARENB | PARODD | CMSPAR);
break;
#else
/* try the POSIX way */
case MARKPARITY:
if( stopbits == ONESTOPBIT) {
stopbits = TWOSTOPBITS;
port.c_iflag &= ~INPCK;
} else {
ptr->commerror = IE_BYTESIZE;
fail=1;
}
break;
case SPACEPARITY:
if( bytesize < 8) {
bytesize +=1;
port.c_iflag &= ~INPCK;
} else {
ptr->commerror = IE_BYTESIZE;
fail=1;
}
break;
#endif
default:
ptr->commerror = IE_BYTESIZE;
fail=1;
}
TRACE("bytesize %d\n",bytesize); dcb.ByteSize=lpdcb->ByteSize;
port.c_cflag &= ~CSIZE; dcb.StopBits=lpdcb->StopBits;
switch (bytesize) {
case 5:
port.c_cflag |= CS5;
break;
case 6:
port.c_cflag |= CS6;
break;
case 7:
port.c_cflag |= CS7;
break;
case 8:
port.c_cflag |= CS8;
break;
default:
ptr->commerror = IE_BYTESIZE;
fail=1;
}
TRACE("stopbits %d\n",stopbits); dcb.fParity=lpdcb->fParity;
dcb.Parity=lpdcb->Parity;
switch (stopbits) { dcb.fOutxCtsFlow = lpdcb->fOutxCtsFlow;
case ONESTOPBIT:
port.c_cflag &= ~CSTOPB;
break;
case ONE5STOPBITS: /* wil be selected if bytesize is 5 */
case TWOSTOPBITS:
port.c_cflag |= CSTOPB;
break;
default:
ptr->commerror = IE_BYTESIZE;
fail=1;
}
#ifdef CRTSCTS
if (lpdcb->fDtrflow || lpdcb->fRtsflow || lpdcb->fOutxCtsFlow) if (lpdcb->fDtrflow || lpdcb->fRtsflow)
port.c_cflag |= CRTSCTS; dcb.fRtsControl = TRUE;
if (lpdcb->fDtrDisable) if (lpdcb->fDtrDisable)
port.c_cflag &= ~CRTSCTS; dcb.fDtrControl = TRUE;
#endif
if (lpdcb->fInX)
port.c_iflag |= IXON;
else
port.c_iflag &= ~IXON;
if (lpdcb->fOutX)
port.c_iflag |= IXOFF;
else
port.c_iflag &= ~IXOFF;
ptr->evtchar = lpdcb->EvtChar; ptr->evtchar = lpdcb->EvtChar;
if(!fail) dcb.fInX = lpdcb->fInX;
r = tcsetattr(fd, TCSADRAIN, &port); dcb.fOutX = lpdcb->fOutX;
close(fd);
if(fail)
return -1;
if (r == -1) { if (!SetCommState(ptr->handle,&dcb)) {
ptr->commerror = WinError(); ptr->commerror = WinError();
return -1; return -1;
} else { } else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment