2 * DEC 93 Erik Bos <erik@xs4all.nl>
4 * Copyright 1996 Marcus Meissner
5 * FIXME: use HFILEs instead of unixfds
6 * the win32 functions here get HFILEs already.
8 * May 26, 1997. Fixes and comments by Rick Richardson <rick@dgii.com> [RER]
9 * - ptr->fd wasn't getting cleared on close.
10 * - GetCommEventMask() and GetCommError() didn't do much of anything.
11 * IMHO, they are still wrong, but they at least implement the RXCHAR
12 * event and return I/O queue sizes, which makes the app I'm interested
13 * in (analog devices EZKIT DSP development system) work.
15 * August 12, 1997. Take a bash at SetCommEventMask - Lawson Whitney
16 * <lawson_whitney@juno.com>
27 #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__svr4__)
28 #include <sys/filio.h>
30 #include <sys/ioctl.h>
41 #define TIOCINQ FIONREAD
43 #define msr 35 /* offset in unknown structure commMask */
45 * [RER] These are globals are wrong. They should be in DosDeviceStruct
46 * on a per port basis.
48 int commerror
= 0, eventmask
= 0;
50 struct DosDeviceStruct COM
[MAX_PORTS
];
51 struct DosDeviceStruct LPT
[MAX_PORTS
];
52 LPCVOID
*unknown
[MAX_PORTS
];
57 char option
[10], temp
[256], *btemp
;
60 for (x
=0; x
!=MAX_PORTS
; x
++) {
61 strcpy(option
,"COMx");
65 PROFILE_GetWineIniString( "serialports", option
, "*",
67 if (!strcmp(temp
, "*") || *temp
== '\0')
68 COM
[x
].devicename
= NULL
;
70 btemp
= strchr(temp
,',');
73 COM
[x
].baudrate
= atoi(btemp
);
78 if (!S_ISCHR(st
.st_mode
))
79 fprintf(stderr
,"comm: can't use `%s' as %s !\n", temp
, option
);
81 if ((COM
[x
].devicename
= malloc(strlen(temp
)+1)) == NULL
)
82 fprintf(stderr
,"comm: can't malloc for device info!\n");
85 strcpy(COM
[x
].devicename
, temp
);
88 "Comm_Init: %s = %s\n", option
, COM
[x
].devicename
);
91 strcpy(option
, "LPTx");
95 PROFILE_GetWineIniString( "parallelports", option
, "*",
97 if (!strcmp(temp
, "*") || *temp
== '\0')
98 LPT
[x
].devicename
= NULL
;
101 if (!S_ISCHR(st
.st_mode
))
102 fprintf(stderr
,"comm: can't use `%s' as %s !\n", temp
, option
);
104 if ((LPT
[x
].devicename
= malloc(strlen(temp
)+1)) == NULL
)
105 fprintf(stderr
,"comm: can't malloc for device info!\n");
108 strcpy(LPT
[x
].devicename
, temp
);
111 "Comm_Init: %s = %s\n", option
, LPT
[x
].devicename
);
118 struct DosDeviceStruct
*GetDeviceStruct(int fd
)
122 for (x
=0; x
!=MAX_PORTS
; x
++) {
132 int GetCommPort(int fd
)
136 for (x
=0; x
<MAX_PORTS
; x
++) {
144 int ValidCOMPort(int x
)
146 return(x
< MAX_PORTS
? (int) COM
[x
].devicename
: 0);
149 int ValidLPTPort(int x
)
151 return(x
< MAX_PORTS
? (int) LPT
[x
].devicename
: 0);
156 dprintf_comm(stddeb
, "WinError: errno = %d\n", errno
);
163 /**************************************************************************
164 * BuildCommDCB (USER.213)
166 BOOL16 WINAPI
BuildCommDCB16(LPCSTR device
, LPDCB16 lpdcb
)
168 /* "COM1:9600,n,8,1" */
171 char *ptr
, temp
[256];
174 "BuildCommDCB: (%s), ptr %p\n", device
, lpdcb
);
177 if (!lstrncmpi32A(device
,"COM",3)) {
178 port
= device
[3] - '0';
182 fprintf(stderr
, "comm: BUG ! COM0 can't exists!.\n");
183 commerror
= IE_BADID
;
186 if (!ValidCOMPort(port
)) {
187 commerror
= IE_BADID
;
191 memset(lpdcb
, 0, sizeof(DCB16
)); /* initialize */
194 OpenComm(device
, 0, 0);
196 lpdcb
->Id
= COM
[port
].fd
;
201 if (*(device
+4) != ':')
204 strcpy(temp
,device
+5);
205 ptr
= strtok(temp
, ", ");
207 if (COM
[port
].baudrate
> 0)
208 lpdcb
->BaudRate
= COM
[port
].baudrate
;
210 lpdcb
->BaudRate
= atoi(ptr
);
211 dprintf_comm(stddeb
,"BuildCommDCB: baudrate (%d)\n", lpdcb
->BaudRate
);
213 ptr
= strtok(NULL
, ", ");
215 *ptr
= toupper(*ptr
);
217 dprintf_comm(stddeb
,"BuildCommDCB: parity (%c)\n", *ptr
);
221 lpdcb
->Parity
= NOPARITY
;
225 lpdcb
->Parity
= EVENPARITY
;
228 lpdcb
->Parity
= MARKPARITY
;
231 lpdcb
->Parity
= ODDPARITY
;
234 fprintf(stderr
,"comm: unknown parity `%c'!\n", *ptr
);
238 ptr
= strtok(NULL
, ", ");
239 dprintf_comm(stddeb
, "BuildCommDCB: charsize (%c)\n", *ptr
);
240 lpdcb
->ByteSize
= *ptr
- '0';
242 ptr
= strtok(NULL
, ", ");
243 dprintf_comm(stddeb
, "BuildCommDCB: stopbits (%c)\n", *ptr
);
246 lpdcb
->StopBits
= ONESTOPBIT
;
249 lpdcb
->StopBits
= TWOSTOPBITS
;
252 fprintf(stderr
,"comm: unknown # of stopbits `%c'!\n", *ptr
);
260 /**************************************************************************
261 * BuildCommDCBA (KERNEL32.14)
263 BOOL32 WINAPI
BuildCommDCB32A(LPCSTR device
,LPDCB32 lpdcb
)
265 return BuildCommDCBAndTimeouts32A(device
,lpdcb
,NULL
);
268 /**************************************************************************
269 * BuildCommDCBAndTimeoutsA (KERNEL32.15)
271 BOOL32 WINAPI
BuildCommDCBAndTimeouts32A(LPCSTR device
, LPDCB32 lpdcb
,
272 LPCOMMTIMEOUTS lptimeouts
)
277 dprintf_comm(stddeb
,"BuildCommDCBAndTimeouts32A(%s,%p,%p)\n",device
,lpdcb
,lptimeouts
);
280 if (!lstrncmpi32A(device
,"COM",3)) {
283 fprintf(stderr
,"comm:BUG! COM0 can't exists!.\n");
286 if (!ValidCOMPort(port
))
288 if (*(device
+4)!=':')
290 temp
=(LPSTR
)(device
+5);
294 memset(lpdcb
, 0, sizeof(DCB32
)); /* initialize */
296 lpdcb
->DCBlength
= sizeof(DCB32
);
297 if (strchr(temp
,',')) { /* old style */
300 char last
=temp
[strlen(temp
)-1];
302 ret
=BuildCommDCB16(device
,&dcb16
);
305 lpdcb
->BaudRate
= dcb16
.BaudRate
;
306 lpdcb
->ByteSize
= dcb16
.ByteSize
;
307 lpdcb
->fBinary
= dcb16
.fBinary
;
308 lpdcb
->Parity
= dcb16
.Parity
;
309 lpdcb
->fParity
= dcb16
.fParity
;
310 lpdcb
->fNull
= dcb16
.fNull
;
311 lpdcb
->StopBits
= dcb16
.StopBits
;
315 lpdcb
->fOutxCtsFlow
= FALSE
;
316 lpdcb
->fOutxDsrFlow
= FALSE
;
317 lpdcb
->fDtrControl
= DTR_CONTROL_ENABLE
;
318 lpdcb
->fRtsControl
= RTS_CONTROL_ENABLE
;
319 } else if (last
=='p') {
321 lpdcb
->fOutX
= FALSE
;
322 lpdcb
->fOutxCtsFlow
= TRUE
;
323 lpdcb
->fOutxDsrFlow
= TRUE
;
324 lpdcb
->fDtrControl
= DTR_CONTROL_HANDSHAKE
;
325 lpdcb
->fRtsControl
= RTS_CONTROL_HANDSHAKE
;
328 lpdcb
->fOutX
= FALSE
;
329 lpdcb
->fOutxCtsFlow
= FALSE
;
330 lpdcb
->fOutxDsrFlow
= FALSE
;
331 lpdcb
->fDtrControl
= DTR_CONTROL_ENABLE
;
332 lpdcb
->fRtsControl
= RTS_CONTROL_ENABLE
;
334 lpdcb
->XonChar
= dcb16
.XonChar
;
335 lpdcb
->XoffChar
= dcb16
.XoffChar
;
336 lpdcb
->ErrorChar
= dcb16
.PeChar
;
337 lpdcb
->fErrorChar
= dcb16
.fPeChar
;
338 lpdcb
->EofChar
= dcb16
.EofChar
;
339 lpdcb
->EvtChar
= dcb16
.EvtChar
;
340 lpdcb
->XonLim
= dcb16
.XonLim
;
341 lpdcb
->XoffLim
= dcb16
.XoffLim
;
344 ptr
=strtok(temp
," ");
349 if (!strncmp("baud=",ptr
,5)) {
350 if (!sscanf(ptr
+5,"%ld",&x
))
351 fprintf(stderr
,"BuildCommDCB32A:Couldn't parse %s\n",ptr
);
355 if (!strncmp("stop=",ptr
,5)) {
356 if (!sscanf(ptr
+5,"%ld",&x
))
357 fprintf(stderr
,"BuildCommDCB32A:Couldn't parse %s\n",ptr
);
361 if (!strncmp("data=",ptr
,5)) {
362 if (!sscanf(ptr
+5,"%ld",&x
))
363 fprintf(stderr
,"BuildCommDCB32A:Couldn't parse %s\n",ptr
);
367 if (!strncmp("parity=",ptr
,7)) {
368 lpdcb
->fParity
= TRUE
;
371 lpdcb
->fParity
= FALSE
;
372 lpdcb
->Parity
= NOPARITY
;
375 lpdcb
->Parity
= EVENPARITY
;
378 lpdcb
->Parity
= ODDPARITY
;
381 lpdcb
->Parity
= MARKPARITY
;
387 fprintf(stderr
,"BuildCommDCB32A: Unhandled specifier '%s', please report.\n",ptr
);
388 ptr
=strtok(NULL
," ");
390 if (lpdcb
->BaudRate
==110)
395 /**************************************************************************
396 * BuildCommDCBAndTimeoutsW (KERNEL32.16)
398 BOOL32 WINAPI
BuildCommDCBAndTimeouts32W( LPCWSTR devid
, LPDCB32 lpdcb
,
399 LPCOMMTIMEOUTS lptimeouts
)
404 dprintf_comm(stddeb
,"BuildCommDCBAndTimeouts32W(%p,%p,%p)\n",devid
,lpdcb
,lptimeouts
);
405 devidA
= HEAP_strdupWtoA( GetProcessHeap(), 0, devid
);
406 ret
=BuildCommDCBAndTimeouts32A(devidA
,lpdcb
,lptimeouts
);
407 HeapFree( GetProcessHeap(), 0, devidA
);
411 /**************************************************************************
412 * BuildCommDCBW (KERNEL32.17)
414 BOOL32 WINAPI
BuildCommDCB32W(LPCWSTR devid
,LPDCB32 lpdcb
)
416 return BuildCommDCBAndTimeouts32W(devid
,lpdcb
,NULL
);
419 /*****************************************************************************
420 * OpenComm (USER.200)
422 INT16 WINAPI
OpenComm(LPCSTR device
,UINT16 cbInQueue
,UINT16 cbOutQueue
)
427 "OpenComm: %s, %d, %d\n", device
, cbInQueue
, cbOutQueue
);
430 if (!lstrncmpi32A(device
,"COM",3)) {
431 port
= device
[3] - '0';
434 fprintf(stderr
, "comm: BUG ! COM0 doesn't exist !\n");
435 commerror
= IE_BADID
;
439 "OpenComm: %s = %s\n", device
, COM
[port
].devicename
);
441 if (!ValidCOMPort(port
)) {
442 commerror
= IE_BADID
;
449 fd
= open(COM
[port
].devicename
, O_RDWR
| O_NONBLOCK
);
451 commerror
= WinError();
454 unknown
[port
] = SEGPTR_ALLOC(40);
455 bzero(unknown
[port
],40);
461 if (!lstrncmpi32A(device
,"LPT",3)) {
462 port
= device
[3] - '0';
464 if (!ValidLPTPort(port
)) {
465 commerror
= IE_BADID
;
473 fd
= open(LPT
[port
].devicename
, O_RDWR
| O_NONBLOCK
, 0);
475 commerror
= WinError();
485 /*****************************************************************************
486 * CloseComm (USER.207)
488 INT16 WINAPI
CloseComm(INT16 fd
)
491 dprintf_comm(stddeb
,"CloseComm: fd %d\n", fd
);
492 if ((port
= GetCommPort(fd
)) !=-1) { /* [LW] */
493 SEGPTR_FREE(unknown
[port
]);
494 COM
[port
].fd
= 0; /* my adaptation of RER's fix */
496 commerror
= IE_BADID
;
500 if (close(fd
) == -1) {
501 commerror
= WinError();
509 /*****************************************************************************
510 * SetCommBreak (USER.210)
512 INT16 WINAPI
SetCommBreak16(INT16 fd
)
514 struct DosDeviceStruct
*ptr
;
516 dprintf_comm(stddeb
,"SetCommBreak: fd: %d\n", fd
);
517 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
518 commerror
= IE_BADID
;
527 /*****************************************************************************
528 * SetCommBreak (KERNEL32.449)
530 BOOL32 WINAPI
SetCommBreak32(INT32 fd
)
533 struct DosDeviceStruct
*ptr
;
535 dprintf_comm(stddeb
,"SetCommBreak: fd: %d\n", fd
);
536 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
537 commerror
= IE_BADID
;
546 /*****************************************************************************
547 * ClearCommBreak (USER.211)
549 INT16 WINAPI
ClearCommBreak16(INT16 fd
)
551 struct DosDeviceStruct
*ptr
;
553 dprintf_comm(stddeb
,"ClearCommBreak: fd: %d\n", fd
);
554 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
555 commerror
= IE_BADID
;
564 /*****************************************************************************
565 * ClearCommBreak (KERNEL32.20)
567 BOOL32 WINAPI
ClearCommBreak32(INT32 fd
)
569 struct DosDeviceStruct
*ptr
;
571 dprintf_comm(stddeb
,"ClearCommBreak: fd: %d\n", fd
);
572 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
573 commerror
= IE_BADID
;
582 /*****************************************************************************
583 * EscapeCommFunction (USER.214)
585 LONG WINAPI
EscapeCommFunction16(UINT16 fd
,UINT16 nFunction
)
590 dprintf_comm(stddeb
,"EscapeCommFunction fd: %d, function: %d\n", fd
, nFunction
);
591 if (tcgetattr(fd
,&port
) == -1) {
592 commerror
=WinError();
601 for (max
= MAX_PORTS
;!COM
[max
].devicename
;max
--)
607 for (max
= MAX_PORTS
;!LPT
[max
].devicename
;max
--)
614 port
.c_cflag
&= TIOCM_DTR
;
620 port
.c_cflag
&= TIOCM_RTS
;
626 port
.c_cflag
|= CRTSCTS
;
630 port
.c_cflag
|= CRTSCTS
;
635 port
.c_iflag
|= IXOFF
;
639 port
.c_iflag
|= IXON
;
644 "EscapeCommFunction fd: %d, unknown function: %d\n",
649 if (tcsetattr(fd
, TCSADRAIN
, &port
) == -1) {
650 commerror
= WinError();
658 /*****************************************************************************
659 * EscapeCommFunction (KERNEL32.214)
661 BOOL32 WINAPI
EscapeCommFunction32(INT32 fd
,UINT32 nFunction
)
664 struct DosDeviceStruct
*ptr
;
666 dprintf_comm(stddeb
,"EscapeCommFunction fd: %d, function: %d\n", fd
, nFunction
);
667 if (tcgetattr(fd
,&port
) == -1) {
668 commerror
=WinError();
671 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
672 commerror
= IE_BADID
;
682 port
.c_cflag
&= TIOCM_DTR
;
688 port
.c_cflag
&= TIOCM_RTS
;
694 port
.c_cflag
|= CRTSCTS
;
698 port
.c_cflag
|= CRTSCTS
;
703 port
.c_iflag
|= IXOFF
;
707 port
.c_iflag
|= IXON
;
717 "EscapeCommFunction32 fd: %d, unknown function: %d\n",
722 if (tcsetattr(fd
, TCSADRAIN
, &port
) == -1) {
723 commerror
= WinError();
731 /*****************************************************************************
732 * FlushComm (USER.215)
734 INT16 WINAPI
FlushComm(INT16 fd
,INT16 fnQueue
)
738 dprintf_comm(stddeb
,"FlushComm fd: %d, queue: %d\n", fd
, fnQueue
);
740 case 0: queue
= TCOFLUSH
;
742 case 1: queue
= TCIFLUSH
;
744 default:fprintf(stderr
,
745 "FlushComm fd: %d, UNKNOWN queue: %d\n",
749 if (tcflush(fd
, queue
)) {
750 commerror
= WinError();
758 /********************************************************************
759 * PurgeComm (KERNEL32.557)
761 BOOL32 WINAPI
PurgeComm( HANDLE32 hFile
, DWORD flags
)
763 dprintf_comm(stdnimp
, "PurgeComm(%08x %08lx) unimplemented stub\n",
768 /********************************************************************
769 * GetCommError (USER.203)
771 INT16 WINAPI
GetCommError(INT16 fd
,LPCOMSTAT lpStat
)
780 rc
= ioctl(fd
, TIOCOUTQ
, &cnt
);
781 if (rc
) fprintf(stderr
, "Error !\n");
782 lpStat
->cbOutQue
= cnt
;
784 rc
= ioctl(fd
, TIOCINQ
, &cnt
);
785 if (rc
) fprintf(stderr
, "Error !\n");
786 lpStat
->cbInQue
= cnt
;
789 "GetCommError: fd %d, error %d, lpStat %d %d %d\n",
791 lpStat
->status
, lpStat
->cbInQue
, lpStat
->cbOutQue
);
795 "GetCommError: fd %d, error %d, lpStat NULL\n",
799 * [RER] I have no idea what the following is trying to accomplish.
800 * [RER] It is certainly not what the reference manual suggests.
802 temperror
= commerror
;
807 /*****************************************************************************
808 * ClearCommError (KERNEL32.21)
810 BOOL32 WINAPI
ClearCommError(INT32 fd
,LPDWORD errors
,LPCOMSTAT lpStat
)
815 "ClearCommError: fd %d (current error %d)\n", fd
, commerror
);
816 temperror
= commerror
;
821 /*****************************************************************************
822 * SetCommEventMask (USER.208)
824 SEGPTR WINAPI
SetCommEventMask(INT16 fd
,UINT16 fuEvtMask
)
830 dprintf_comm(stddeb
,"SetCommEventMask:fd %d,mask %d\n",fd
,fuEvtMask
);
831 eventmask
|= fuEvtMask
;
832 if ((act
= GetCommPort(fd
)) == -1) {
833 dprintf_comm(stddeb
," fd %d not comm port\n",act
);
837 repid
= ioctl(fd
,TIOCMGET
,&mstat
);
839 " ioctl %d, msr %x at %p %p\n",repid
,mstat
,stol
,unknown
[act
]);
840 if ((mstat
&TIOCM_CAR
)) {*stol
|= 0x80;}
842 dprintf_comm(stddeb
," modem dcd construct %x\n",*stol
);
843 return SEGPTR_GET(unknown
[act
]);
846 /*****************************************************************************
847 * GetCommEventMask (USER.209)
849 UINT16 WINAPI
GetCommEventMask(INT16 fd
,UINT16 fnEvtClear
)
854 "GetCommEventMask: fd %d, mask %d\n", fd
, fnEvtClear
);
857 * Determine if any characters are available
859 if (fnEvtClear
& EV_RXCHAR
)
864 rc
= ioctl(fd
, TIOCINQ
, &cnt
);
865 if (cnt
) events
|= EV_RXCHAR
;
868 "GetCommEventMask: rxchar %ld\n", cnt
);
872 * There are other events that need to be checked for
877 "GetCommEventMask: return events %d\n", events
);
881 * [RER] The following was gibberish
884 tempmask
= eventmask
;
885 eventmask
&= ~fnEvtClear
;
890 /*****************************************************************************
891 * SetupComm (KERNEL32.676)
893 BOOL32 WINAPI
SetupComm( HANDLE32 hFile
, DWORD insize
, DWORD outsize
)
895 dprintf_comm(stdnimp
, "SetupComm: insize %ld outsize %ld unimplemented stub\n", insize
, outsize
);
899 /*****************************************************************************
900 * GetCommMask (KERNEL32.156)
902 BOOL32 WINAPI
GetCommMask(INT32 fd
,LPDWORD evtmask
)
905 "GetCommMask: fd %d, mask %p\n", fd
, evtmask
);
906 *evtmask
= eventmask
;
910 /*****************************************************************************
911 * SetCommMask (KERNEL32.451)
913 BOOL32 WINAPI
SetCommMask(INT32 fd
,DWORD evtmask
)
916 "SetCommMask: fd %d, mask %lx\n", fd
, evtmask
);
921 /*****************************************************************************
922 * SetCommState16 (USER.201)
924 INT16 WINAPI
SetCommState16(LPDCB16 lpdcb
)
927 struct DosDeviceStruct
*ptr
;
930 "SetCommState16: fd %d, ptr %p\n", lpdcb
->Id
, lpdcb
);
931 if (tcgetattr(lpdcb
->Id
, &port
) == -1) {
932 commerror
= WinError();
937 port
.c_cc
[VTIME
] = 1;
940 port
.c_iflag
&= ~(ISTRIP
|BRKINT
|IGNCR
|ICRNL
|INLCR
|IMAXBEL
);
942 port
.c_iflag
&= ~(ISTRIP
|BRKINT
|IGNCR
|ICRNL
|INLCR
);
944 port
.c_iflag
|= (IGNBRK
);
946 port
.c_oflag
&= ~(OPOST
);
948 port
.c_cflag
&= ~(HUPCL
);
949 port
.c_cflag
|= CLOCAL
| CREAD
;
951 port
.c_lflag
&= ~(ICANON
|ECHO
|ISIG
);
952 port
.c_lflag
|= NOFLSH
;
954 if ((ptr
= GetDeviceStruct(lpdcb
->Id
)) == NULL
) {
955 commerror
= IE_BADID
;
958 if (ptr
->baudrate
> 0)
959 lpdcb
->BaudRate
= ptr
->baudrate
;
960 dprintf_comm(stddeb
,"SetCommState: baudrate %d\n",lpdcb
->BaudRate
);
962 port
.c_cflag
&= ~CBAUD
;
963 switch (lpdcb
->BaudRate
) {
966 port
.c_cflag
|= B110
;
970 port
.c_cflag
|= B300
;
974 port
.c_cflag
|= B600
;
978 port
.c_cflag
|= B1200
;
982 port
.c_cflag
|= B2400
;
986 port
.c_cflag
|= B4800
;
990 port
.c_cflag
|= B9600
;
994 port
.c_cflag
|= B19200
;
998 port
.c_cflag
|= B38400
;
1001 port
.c_cflag
|= B57600
;
1004 port
.c_cflag
|= B115200
;
1007 commerror
= IE_BAUDRATE
;
1010 #elif !defined(__EMX__)
1011 switch (lpdcb
->BaudRate
) {
1014 port
.c_ospeed
= B110
;
1018 port
.c_ospeed
= B300
;
1022 port
.c_ospeed
= B600
;
1026 port
.c_ospeed
= B1200
;
1030 port
.c_ospeed
= B2400
;
1034 port
.c_ospeed
= B4800
;
1038 port
.c_ospeed
= B9600
;
1042 port
.c_ospeed
= B19200
;
1046 port
.c_ospeed
= B38400
;
1049 commerror
= IE_BAUDRATE
;
1052 port
.c_ispeed
= port
.c_ospeed
;
1054 dprintf_comm(stddeb
,"SetCommState: bytesize %d\n",lpdcb
->ByteSize
);
1055 port
.c_cflag
&= ~CSIZE
;
1056 switch (lpdcb
->ByteSize
) {
1058 port
.c_cflag
|= CS5
;
1061 port
.c_cflag
|= CS6
;
1064 port
.c_cflag
|= CS7
;
1067 port
.c_cflag
|= CS8
;
1070 commerror
= IE_BYTESIZE
;
1074 dprintf_comm(stddeb
,"SetCommState: parity %d\n",lpdcb
->Parity
);
1075 port
.c_cflag
&= ~(PARENB
| PARODD
);
1077 switch (lpdcb
->Parity
) {
1079 port
.c_iflag
&= ~INPCK
;
1082 port
.c_cflag
|= (PARENB
| PARODD
);
1083 port
.c_iflag
|= INPCK
;
1086 port
.c_cflag
|= PARENB
;
1087 port
.c_iflag
|= INPCK
;
1090 commerror
= IE_BYTESIZE
;
1095 dprintf_comm(stddeb
,"SetCommState: stopbits %d\n",lpdcb
->StopBits
);
1097 switch (lpdcb
->StopBits
) {
1099 port
.c_cflag
&= ~CSTOPB
;
1102 port
.c_cflag
|= CSTOPB
;
1105 commerror
= IE_BYTESIZE
;
1110 if (lpdcb
->fDtrflow
|| lpdcb
->fRtsflow
|| lpdcb
->fOutxCtsFlow
)
1111 port
.c_cflag
|= CRTSCTS
;
1113 if (lpdcb
->fDtrDisable
)
1114 port
.c_cflag
&= ~CRTSCTS
;
1117 port
.c_iflag
|= IXON
;
1119 port
.c_iflag
&= ~IXON
;
1121 port
.c_iflag
|= IXOFF
;
1123 port
.c_iflag
&= ~IXOFF
;
1125 if (tcsetattr(lpdcb
->Id
, TCSADRAIN
, &port
) == -1) {
1126 commerror
= WinError();
1134 /*****************************************************************************
1135 * SetCommState32 (KERNEL32.452)
1137 BOOL32 WINAPI
SetCommState32(INT32 fd
,LPDCB32 lpdcb
)
1139 struct termios port
;
1140 struct DosDeviceStruct
*ptr
;
1142 dprintf_comm(stddeb
,"SetCommState32: fd %d, ptr %p\n",fd
,lpdcb
);
1143 if (tcgetattr(fd
,&port
) == -1) {
1144 commerror
= WinError();
1148 port
.c_cc
[VMIN
] = 0;
1149 port
.c_cc
[VTIME
] = 1;
1152 port
.c_iflag
&= ~(ISTRIP
|BRKINT
|IGNCR
|ICRNL
|INLCR
|IMAXBEL
);
1154 port
.c_iflag
&= ~(ISTRIP
|BRKINT
|IGNCR
|ICRNL
|INLCR
);
1156 port
.c_iflag
|= (IGNBRK
);
1158 port
.c_oflag
&= ~(OPOST
);
1160 port
.c_cflag
&= ~(HUPCL
);
1161 port
.c_cflag
|= CLOCAL
| CREAD
;
1163 port
.c_lflag
&= ~(ICANON
|ECHO
|ISIG
);
1164 port
.c_lflag
|= NOFLSH
;
1166 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
1167 commerror
= IE_BADID
;
1170 if (ptr
->baudrate
> 0)
1171 lpdcb
->BaudRate
= ptr
->baudrate
;
1172 dprintf_comm(stddeb
,"SetCommState: baudrate %ld\n",lpdcb
->BaudRate
);
1174 port
.c_cflag
&= ~CBAUD
;
1175 switch (lpdcb
->BaudRate
) {
1178 port
.c_cflag
|= B110
;
1182 port
.c_cflag
|= B300
;
1186 port
.c_cflag
|= B600
;
1190 port
.c_cflag
|= B1200
;
1194 port
.c_cflag
|= B2400
;
1198 port
.c_cflag
|= B4800
;
1202 port
.c_cflag
|= B9600
;
1206 port
.c_cflag
|= B19200
;
1210 port
.c_cflag
|= B38400
;
1213 commerror
= IE_BAUDRATE
;
1216 #elif !defined(__EMX__)
1217 switch (lpdcb
->BaudRate
) {
1220 port
.c_ospeed
= B110
;
1224 port
.c_ospeed
= B300
;
1228 port
.c_ospeed
= B600
;
1232 port
.c_ospeed
= B1200
;
1236 port
.c_ospeed
= B2400
;
1240 port
.c_ospeed
= B4800
;
1244 port
.c_ospeed
= B9600
;
1248 port
.c_ospeed
= B19200
;
1252 port
.c_ospeed
= B38400
;
1255 commerror
= IE_BAUDRATE
;
1258 port
.c_ispeed
= port
.c_ospeed
;
1260 dprintf_comm(stddeb
,"SetCommState: bytesize %d\n",lpdcb
->ByteSize
);
1261 port
.c_cflag
&= ~CSIZE
;
1262 switch (lpdcb
->ByteSize
) {
1264 port
.c_cflag
|= CS5
;
1267 port
.c_cflag
|= CS6
;
1270 port
.c_cflag
|= CS7
;
1273 port
.c_cflag
|= CS8
;
1276 commerror
= IE_BYTESIZE
;
1280 dprintf_comm(stddeb
,"SetCommState: parity %d\n",lpdcb
->Parity
);
1281 port
.c_cflag
&= ~(PARENB
| PARODD
);
1283 switch (lpdcb
->Parity
) {
1285 port
.c_iflag
&= ~INPCK
;
1288 port
.c_cflag
|= (PARENB
| PARODD
);
1289 port
.c_iflag
|= INPCK
;
1292 port
.c_cflag
|= PARENB
;
1293 port
.c_iflag
|= INPCK
;
1296 commerror
= IE_BYTESIZE
;
1301 dprintf_comm(stddeb
,"SetCommState: stopbits %d\n",lpdcb
->StopBits
);
1302 switch (lpdcb
->StopBits
) {
1304 port
.c_cflag
&= ~CSTOPB
;
1307 port
.c_cflag
|= CSTOPB
;
1310 commerror
= IE_BYTESIZE
;
1314 if ( lpdcb
->fOutxCtsFlow
||
1315 lpdcb
->fDtrControl
== DTR_CONTROL_ENABLE
||
1316 lpdcb
->fRtsControl
== RTS_CONTROL_ENABLE
1318 port
.c_cflag
|= CRTSCTS
;
1319 if (lpdcb
->fDtrControl
== DTR_CONTROL_DISABLE
)
1320 port
.c_cflag
&= ~CRTSCTS
;
1324 port
.c_iflag
|= IXON
;
1326 port
.c_iflag
&= ~IXON
;
1328 port
.c_iflag
|= IXOFF
;
1330 port
.c_iflag
&= ~IXOFF
;
1332 if (tcsetattr(fd
,TCSADRAIN
,&port
)==-1) {
1333 commerror
= WinError();
1342 /*****************************************************************************
1343 * GetCommState (USER.202)
1345 INT16 WINAPI
GetCommState16(INT16 fd
, LPDCB16 lpdcb
)
1347 struct termios port
;
1349 dprintf_comm(stddeb
,"GetCommState16: fd %d, ptr %p\n", fd
, lpdcb
);
1350 if (tcgetattr(fd
, &port
) == -1) {
1351 commerror
= WinError();
1357 switch (port
.c_cflag
& CBAUD
) {
1359 switch (port
.c_ospeed
) {
1362 lpdcb
->BaudRate
= 110;
1365 lpdcb
->BaudRate
= 300;
1368 lpdcb
->BaudRate
= 600;
1371 lpdcb
->BaudRate
= 1200;
1374 lpdcb
->BaudRate
= 2400;
1377 lpdcb
->BaudRate
= 4800;
1380 lpdcb
->BaudRate
= 9600;
1383 lpdcb
->BaudRate
= 19200;
1386 lpdcb
->BaudRate
= 38400;
1389 lpdcb
->BaudRate
= 57600;
1392 lpdcb
->BaudRate
= 57601;
1396 switch (port
.c_cflag
& CSIZE
) {
1398 lpdcb
->ByteSize
= 5;
1401 lpdcb
->ByteSize
= 6;
1404 lpdcb
->ByteSize
= 7;
1407 lpdcb
->ByteSize
= 8;
1411 switch (port
.c_cflag
& ~(PARENB
| PARODD
)) {
1413 lpdcb
->fParity
= NOPARITY
;
1416 lpdcb
->fParity
= EVENPARITY
;
1418 case (PARENB
| PARODD
):
1419 lpdcb
->fParity
= ODDPARITY
;
1423 if (port
.c_cflag
& CSTOPB
)
1424 lpdcb
->StopBits
= TWOSTOPBITS
;
1426 lpdcb
->StopBits
= ONESTOPBIT
;
1428 lpdcb
->RlsTimeout
= 50;
1429 lpdcb
->CtsTimeout
= 50;
1430 lpdcb
->DsrTimeout
= 50;
1434 lpdcb
->fDtrDisable
= 0;
1438 if (port
.c_cflag
& CRTSCTS
) {
1439 lpdcb
->fDtrflow
= 1;
1440 lpdcb
->fRtsflow
= 1;
1441 lpdcb
->fOutxCtsFlow
= 1;
1442 lpdcb
->fOutxDsrFlow
= 1;
1445 lpdcb
->fDtrDisable
= 1;
1447 if (port
.c_iflag
& IXON
)
1452 if (port
.c_iflag
& IXOFF
)
1461 lpdcb
->XoffLim
= 10;
1467 /*****************************************************************************
1468 * GetCommState (KERNEL32.159)
1470 BOOL32 WINAPI
GetCommState32(INT32 fd
, LPDCB32 lpdcb
)
1472 struct termios port
;
1474 dprintf_comm(stddeb
,"GetCommState32: fd %d, ptr %p\n", fd
, lpdcb
);
1475 if (GetDeviceStruct(fd
) == NULL
) return FALSE
;
1476 if (tcgetattr(fd
, &port
) == -1) {
1477 commerror
= WinError();
1482 switch (port
.c_cflag
& CBAUD
) {
1484 switch (port
.c_ospeed
) {
1487 lpdcb
->BaudRate
= 110;
1490 lpdcb
->BaudRate
= 300;
1493 lpdcb
->BaudRate
= 600;
1496 lpdcb
->BaudRate
= 1200;
1499 lpdcb
->BaudRate
= 2400;
1502 lpdcb
->BaudRate
= 4800;
1505 lpdcb
->BaudRate
= 9600;
1508 lpdcb
->BaudRate
= 19200;
1511 lpdcb
->BaudRate
= 38400;
1515 switch (port
.c_cflag
& CSIZE
) {
1517 lpdcb
->ByteSize
= 5;
1520 lpdcb
->ByteSize
= 6;
1523 lpdcb
->ByteSize
= 7;
1526 lpdcb
->ByteSize
= 8;
1530 switch (port
.c_cflag
& ~(PARENB
| PARODD
)) {
1532 lpdcb
->fParity
= NOPARITY
;
1535 lpdcb
->fParity
= EVENPARITY
;
1537 case (PARENB
| PARODD
):
1538 lpdcb
->fParity
= ODDPARITY
;
1542 if (port
.c_cflag
& CSTOPB
)
1543 lpdcb
->StopBits
= TWOSTOPBITS
;
1545 lpdcb
->StopBits
= ONESTOPBIT
;
1552 if (port
.c_cflag
& CRTSCTS
) {
1553 lpdcb
->fDtrControl
= DTR_CONTROL_ENABLE
;
1554 lpdcb
->fRtsControl
= RTS_CONTROL_ENABLE
;
1555 lpdcb
->fOutxCtsFlow
= 1;
1556 lpdcb
->fOutxDsrFlow
= 1;
1560 lpdcb
->fDtrControl
= DTR_CONTROL_DISABLE
;
1561 lpdcb
->fRtsControl
= RTS_CONTROL_DISABLE
;
1563 if (port
.c_iflag
& IXON
)
1568 if (port
.c_iflag
& IXOFF
)
1577 lpdcb
->XoffLim
= 10;
1583 /*****************************************************************************
1584 * TransmitCommChar (USER.206)
1586 INT16 WINAPI
TransmitCommChar16(INT16 fd
,CHAR chTransmit
)
1588 struct DosDeviceStruct
*ptr
;
1590 dprintf_comm(stddeb
,
1591 "TransmitCommChar: fd %d, data %d \n", fd
, chTransmit
);
1592 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
1593 commerror
= IE_BADID
;
1597 if (ptr
->suspended
) {
1598 commerror
= IE_HARDWARE
;
1602 if (write(fd
, (void *) &chTransmit
, 1) == -1) {
1603 commerror
= WinError();
1611 /*****************************************************************************
1612 * TransmitCommChar (KERNEL32.535)
1614 BOOL32 WINAPI
TransmitCommChar32(INT32 fd
,CHAR chTransmit
)
1616 struct DosDeviceStruct
*ptr
;
1618 dprintf_comm(stddeb
,"TransmitCommChar32(%d,'%c')\n",fd
,chTransmit
);
1619 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
1620 commerror
= IE_BADID
;
1624 if (ptr
->suspended
) {
1625 commerror
= IE_HARDWARE
;
1628 if (write(fd
, (void *) &chTransmit
, 1) == -1) {
1629 commerror
= WinError();
1637 /*****************************************************************************
1638 * UngetCommChar (USER.212)
1640 INT16 WINAPI
UngetCommChar(INT16 fd
,CHAR chUnget
)
1642 struct DosDeviceStruct
*ptr
;
1644 dprintf_comm(stddeb
,"UngetCommChar: fd %d (char %d)\n", fd
, chUnget
);
1645 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
1646 commerror
= IE_BADID
;
1650 if (ptr
->suspended
) {
1651 commerror
= IE_HARDWARE
;
1656 ptr
->unget_byte
= chUnget
;
1661 /*****************************************************************************
1662 * ReadComm (USER.204)
1664 INT16 WINAPI
ReadComm(INT16 fd
,LPSTR lpvBuf
,INT16 cbRead
)
1666 int status
, x
, length
;
1667 struct DosDeviceStruct
*ptr
;
1669 dprintf_comm(stddeb
,
1670 "ReadComm: fd %d, ptr %p, length %d\n", fd
, lpvBuf
, cbRead
);
1671 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
1672 commerror
= IE_BADID
;
1676 if (ptr
->suspended
) {
1677 commerror
= IE_HARDWARE
;
1682 *lpvBuf
= ptr
->unget_byte
;
1690 status
= read(fd
, (void *) lpvBuf
, cbRead
);
1693 if (errno
!= EAGAIN
) {
1694 commerror
= WinError();
1701 for (x
=0; x
< length
+status
; x
++)
1702 dprintf_comm(stddeb
,"%c",*(lpvBuf
+x
));
1703 dprintf_comm(stddeb
,"\nthus endeth\n");
1705 return length
+ status
;
1709 /*****************************************************************************
1710 * WriteComm (USER.205)
1712 INT16 WINAPI
WriteComm(INT16 fd
, LPSTR lpvBuf
, INT16 cbWrite
)
1715 struct DosDeviceStruct
*ptr
;
1717 dprintf_comm(stddeb
,"WriteComm: fd %d, ptr %p, length %d\n",
1718 fd
, lpvBuf
, cbWrite
);
1719 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
1720 commerror
= IE_BADID
;
1724 if (ptr
->suspended
) {
1725 commerror
= IE_HARDWARE
;
1729 for (x
=0; x
!= cbWrite
; x
++)
1730 dprintf_comm(stddeb
,"%c", *(lpvBuf
+ x
) );
1731 dprintf_comm(stddeb
,"\n");
1732 length
= write(fd
, (void *) lpvBuf
, cbWrite
);
1735 commerror
= WinError();
1744 /*****************************************************************************
1745 * GetCommTimeouts (KERNEL32.160)
1747 BOOL32 WINAPI
GetCommTimeouts(INT32 fd
,LPCOMMTIMEOUTS lptimeouts
)
1749 fprintf(stderr
,"GetCommTimeouts(%x,%p), empty stub.\n",
1755 /*****************************************************************************
1756 * SetCommTimeouts (KERNEL32.453)
1758 BOOL32 WINAPI
SetCommTimeouts(INT32 fd
,LPCOMMTIMEOUTS lptimeouts
) {
1759 fprintf(stderr
,"SetCommTimeouts(%x,%p), empty stub.\n",
1765 /***********************************************************************
1766 * EnableCommNotification (USER.246)
1768 BOOL16 WINAPI
EnableCommNotification( INT16 fd
, HWND16 hwnd
,
1769 INT16 cbWriteNotify
, INT16 cbOutQueue
)
1771 fprintf(stderr
, "EnableCommNotification(%d, %x, %d, %d), empty stub.\n", fd
, hwnd
, cbWriteNotify
, cbOutQueue
);