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.
17 #if defined(__NetBSD__) || defined(__FreeBSD__)
18 #include <sys/ioctl.h>
30 int commerror
= 0, eventmask
= 0;
32 struct DosDeviceStruct COM
[MAX_PORTS
];
33 struct DosDeviceStruct LPT
[MAX_PORTS
];
38 char option
[10], temp
[256], *btemp
;
41 for (x
=0; x
!=MAX_PORTS
; x
++) {
42 strcpy(option
,"COMx");
46 PROFILE_GetWineIniString( "serialports", option
, "*",
48 if (!strcmp(temp
, "*") || *temp
== '\0')
49 COM
[x
].devicename
= NULL
;
51 btemp
= strchr(temp
,',');
54 COM
[x
].baudrate
= atoi(btemp
);
59 if (!S_ISCHR(st
.st_mode
))
60 fprintf(stderr
,"comm: can't use `%s' as %s !\n", temp
, option
);
62 if ((COM
[x
].devicename
= malloc(strlen(temp
)+1)) == NULL
)
63 fprintf(stderr
,"comm: can't malloc for device info!\n");
66 strcpy(COM
[x
].devicename
, temp
);
69 "Comm_Init: %s = %s\n", option
, COM
[x
].devicename
);
72 strcpy(option
, "LPTx");
76 PROFILE_GetWineIniString( "parallelports", option
, "*",
78 if (!strcmp(temp
, "*") || *temp
== '\0')
79 LPT
[x
].devicename
= NULL
;
82 if (!S_ISCHR(st
.st_mode
))
83 fprintf(stderr
,"comm: can't use `%s' as %s !\n", temp
, option
);
85 if ((LPT
[x
].devicename
= malloc(strlen(temp
)+1)) == NULL
)
86 fprintf(stderr
,"comm: can't malloc for device info!\n");
89 strcpy(LPT
[x
].devicename
, temp
);
92 "Comm_Init: %s = %s\n", option
, LPT
[x
].devicename
);
99 struct DosDeviceStruct
*GetDeviceStruct(int fd
)
103 for (x
=0; x
!=MAX_PORTS
; x
++) {
113 int ValidCOMPort(int x
)
115 return(x
< MAX_PORTS
? (int) COM
[x
].devicename
: 0);
118 int ValidLPTPort(int x
)
120 return(x
< MAX_PORTS
? (int) LPT
[x
].devicename
: 0);
125 dprintf_comm(stddeb
, "WinError: errno = %d\n", errno
);
132 /**************************************************************************
133 * BuildCommDCB (USER.213)
135 BOOL16
BuildCommDCB16(LPCSTR device
, LPDCB16 lpdcb
)
137 /* "COM1:9600,n,8,1" */
140 char *ptr
, temp
[256];
143 "BuildCommDCB: (%s), ptr %p\n", device
, lpdcb
);
146 if (!lstrncmpi32A(device
,"COM",3)) {
147 port
= device
[3] - '0';
151 fprintf(stderr
, "comm: BUG ! COM0 can't exists!.\n");
152 commerror
= IE_BADID
;
155 if (!ValidCOMPort(port
)) {
156 commerror
= IE_BADID
;
161 OpenComm(device
, 0, 0);
163 lpdcb
->Id
= COM
[port
].fd
;
168 if (*(device
+4) != ':')
171 strcpy(temp
,device
+5);
172 ptr
= strtok(temp
, ", ");
174 if (COM
[port
].baudrate
> 0)
175 lpdcb
->BaudRate
= COM
[port
].baudrate
;
177 lpdcb
->BaudRate
= atoi(ptr
);
178 dprintf_comm(stddeb
,"BuildCommDCB: baudrate (%d)\n", lpdcb
->BaudRate
);
180 ptr
= strtok(NULL
, ", ");
182 *ptr
= toupper(*ptr
);
184 dprintf_comm(stddeb
,"BuildCommDCB: parity (%c)\n", *ptr
);
188 lpdcb
->Parity
= NOPARITY
;
192 lpdcb
->Parity
= EVENPARITY
;
195 lpdcb
->Parity
= MARKPARITY
;
198 lpdcb
->Parity
= ODDPARITY
;
201 fprintf(stderr
,"comm: unknown parity `%c'!\n", *ptr
);
205 ptr
= strtok(NULL
, ", ");
206 dprintf_comm(stddeb
, "BuildCommDCB: charsize (%c)\n", *ptr
);
207 lpdcb
->ByteSize
= *ptr
- '0';
209 ptr
= strtok(NULL
, ", ");
210 dprintf_comm(stddeb
, "BuildCommDCB: stopbits (%c)\n", *ptr
);
213 lpdcb
->StopBits
= ONESTOPBIT
;
216 lpdcb
->StopBits
= TWOSTOPBITS
;
219 fprintf(stderr
,"comm: unknown # of stopbits `%c'!\n", *ptr
);
227 /**************************************************************************
228 * BuildCommDCBA (KERNEL32.14)
230 BOOL32
BuildCommDCB32A(LPCSTR device
,LPDCB32 lpdcb
) {
231 return BuildCommDCBAndTimeouts32A(device
,lpdcb
,NULL
);
234 /**************************************************************************
235 * BuildCommDCBAndTimeoutsA (KERNEL32.15)
237 BOOL32
BuildCommDCBAndTimeouts32A(LPCSTR device
, LPDCB32 lpdcb
,LPCOMMTIMEOUTS lptimeouts
) {
241 dprintf_comm(stddeb
,"BuildCommDCBAndTimeouts32A(%s,%p,%p)\n",device
,lpdcb
,lptimeouts
);
244 if (!lstrncmpi32A(device
,"COM",3)) {
247 fprintf(stderr
,"comm:BUG! COM0 can't exists!.\n");
250 if (!ValidCOMPort(port
))
252 if (*(device
+4)!=':')
254 temp
=(LPSTR
)(device
+5);
257 lpdcb
->DCBlength
= sizeof(DCB32
);
258 if (strchr(temp
,',')) { /* old style */
261 char last
=temp
[strlen(temp
)-1];
263 ret
=BuildCommDCB16(device
,&dcb16
);
266 lpdcb
->BaudRate
= dcb16
.BaudRate
;
267 lpdcb
->ByteSize
= dcb16
.ByteSize
;
268 lpdcb
->fBinary
= dcb16
.fBinary
;
269 lpdcb
->Parity
= dcb16
.Parity
;
270 lpdcb
->fParity
= dcb16
.fParity
;
271 lpdcb
->fNull
= dcb16
.fNull
;
272 lpdcb
->StopBits
= dcb16
.StopBits
;
276 lpdcb
->fOutxCtsFlow
= FALSE
;
277 lpdcb
->fOutxDsrFlow
= FALSE
;
278 lpdcb
->fDtrControl
= DTR_CONTROL_ENABLE
;
279 lpdcb
->fRtsControl
= RTS_CONTROL_ENABLE
;
280 } else if (last
=='p') {
282 lpdcb
->fOutX
= FALSE
;
283 lpdcb
->fOutxCtsFlow
= TRUE
;
284 lpdcb
->fOutxDsrFlow
= TRUE
;
285 lpdcb
->fDtrControl
= DTR_CONTROL_HANDSHAKE
;
286 lpdcb
->fRtsControl
= RTS_CONTROL_HANDSHAKE
;
289 lpdcb
->fOutX
= FALSE
;
290 lpdcb
->fOutxCtsFlow
= FALSE
;
291 lpdcb
->fOutxDsrFlow
= FALSE
;
292 lpdcb
->fDtrControl
= DTR_CONTROL_ENABLE
;
293 lpdcb
->fRtsControl
= RTS_CONTROL_ENABLE
;
295 lpdcb
->XonChar
= dcb16
.XonChar
;
296 lpdcb
->XoffChar
= dcb16
.XoffChar
;
297 lpdcb
->ErrorChar
= dcb16
.PeChar
;
298 lpdcb
->fErrorChar
= dcb16
.fPeChar
;
299 lpdcb
->EofChar
= dcb16
.EofChar
;
300 lpdcb
->EvtChar
= dcb16
.EvtChar
;
301 lpdcb
->XonLim
= dcb16
.XonLim
;
302 lpdcb
->XoffLim
= dcb16
.XoffLim
;
305 ptr
=strtok(temp
," ");
310 if (!strncmp("baud=",ptr
,5)) {
311 if (!sscanf(ptr
+5,"%ld",&x
))
312 fprintf(stderr
,"BuildCommDCB32A:Couldn't parse %s\n",ptr
);
316 if (!strncmp("stop=",ptr
,5)) {
317 if (!sscanf(ptr
+5,"%ld",&x
))
318 fprintf(stderr
,"BuildCommDCB32A:Couldn't parse %s\n",ptr
);
322 if (!strncmp("data=",ptr
,5)) {
323 if (!sscanf(ptr
+5,"%ld",&x
))
324 fprintf(stderr
,"BuildCommDCB32A:Couldn't parse %s\n",ptr
);
328 if (!strncmp("parity=",ptr
,7)) {
329 lpdcb
->fParity
= TRUE
;
332 lpdcb
->fParity
= FALSE
;
333 lpdcb
->Parity
= NOPARITY
;
336 lpdcb
->Parity
= EVENPARITY
;
339 lpdcb
->Parity
= ODDPARITY
;
342 lpdcb
->Parity
= MARKPARITY
;
348 fprintf(stderr
,"BuildCommDCB32A: Unhandled specifier '%s', please report.\n",ptr
);
349 ptr
=strtok(NULL
," ");
351 if (lpdcb
->BaudRate
==110)
356 /**************************************************************************
357 * BuildCommDCBAndTimeoutsW (KERNEL32.16)
359 BOOL32
BuildCommDCBAndTimeouts32W(
360 LPCWSTR devid
,LPDCB32 lpdcb
,LPCOMMTIMEOUTS lptimeouts
365 dprintf_comm(stddeb
,"BuildCommDCBAndTimeouts32W(%p,%p,%p)\n",devid
,lpdcb
,lptimeouts
);
366 devidA
= STRING32_DupUniToAnsi(devid
);
367 ret
=BuildCommDCBAndTimeouts32A(devidA
,lpdcb
,lptimeouts
);
372 /**************************************************************************
373 * BuildCommDCBW (KERNEL32.17)
375 BOOL32
BuildCommDCB32W(LPCWSTR devid
,LPDCB32 lpdcb
) {
376 return BuildCommDCBAndTimeouts32W(devid
,lpdcb
,NULL
);
379 /*****************************************************************************
380 * OpenComm (USER.200)
382 INT16
OpenComm(LPCSTR device
,UINT16 cbInQueue
,UINT16 cbOutQueue
)
387 "OpenComm: %s, %d, %d\n", device
, cbInQueue
, cbOutQueue
);
390 if (!lstrncmpi32A(device
,"COM",3)) {
391 port
= device
[3] - '0';
394 fprintf(stderr
, "comm: BUG ! COM0 doesn't exists!.\n");
395 commerror
= IE_BADID
;
399 "OpenComm: %s = %s\n", device
, COM
[port
].devicename
);
401 if (!ValidCOMPort(port
)) {
402 commerror
= IE_BADID
;
409 fd
= open(COM
[port
].devicename
, O_RDWR
| O_NONBLOCK
);
411 commerror
= WinError();
419 if (!lstrncmpi32A(device
,"LPT",3)) {
420 port
= device
[3] - '0';
422 if (!ValidLPTPort(port
)) {
423 commerror
= IE_BADID
;
431 fd
= open(LPT
[port
].devicename
, O_RDWR
| O_NONBLOCK
, 0);
433 commerror
= WinError();
443 /*****************************************************************************
444 * CloseComm (USER.207)
446 INT16
CloseComm(INT16 fd
)
448 dprintf_comm(stddeb
,"CloseComm: fd %d\n", fd
);
449 if (close(fd
) == -1) {
450 commerror
= WinError();
458 /*****************************************************************************
459 * SetCommBreak (USER.210)
461 INT16
SetCommBreak16(INT16 fd
)
463 struct DosDeviceStruct
*ptr
;
465 dprintf_comm(stddeb
,"SetCommBreak: fd: %d\n", fd
);
466 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
467 commerror
= IE_BADID
;
476 /*****************************************************************************
477 * SetCommBreak (KERNEL32.449)
479 BOOL32
SetCommBreak32(INT32 fd
)
482 struct DosDeviceStruct
*ptr
;
484 dprintf_comm(stddeb
,"SetCommBreak: fd: %d\n", fd
);
485 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
486 commerror
= IE_BADID
;
495 /*****************************************************************************
496 * ClearCommBreak (USER.211)
498 INT16
ClearCommBreak16(INT16 fd
)
500 struct DosDeviceStruct
*ptr
;
502 dprintf_comm(stddeb
,"ClearCommBreak: fd: %d\n", fd
);
503 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
504 commerror
= IE_BADID
;
513 /*****************************************************************************
514 * ClearCommBreak (KERNEL32.20)
516 BOOL32
ClearCommBreak32(INT32 fd
)
518 struct DosDeviceStruct
*ptr
;
520 dprintf_comm(stddeb
,"ClearCommBreak: fd: %d\n", fd
);
521 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
522 commerror
= IE_BADID
;
531 /*****************************************************************************
532 * EscapeCommFunction (USER.214)
534 LONG
EscapeCommFunction16(UINT16 fd
,UINT16 nFunction
)
539 dprintf_comm(stddeb
,"EscapeCommFunction fd: %d, function: %d\n", fd
, nFunction
);
540 if (tcgetattr(fd
,&port
) == -1) {
541 commerror
=WinError();
550 for (max
= MAX_PORTS
;!COM
[max
].devicename
;max
--)
556 for (max
= MAX_PORTS
;!LPT
[max
].devicename
;max
--)
563 port
.c_cflag
&= TIOCM_DTR
;
569 port
.c_cflag
&= TIOCM_RTS
;
575 port
.c_cflag
|= CRTSCTS
;
579 port
.c_cflag
|= CRTSCTS
;
584 port
.c_iflag
|= IXOFF
;
588 port
.c_iflag
|= IXON
;
593 "EscapeCommFunction fd: %d, unknown function: %d\n",
598 if (tcsetattr(fd
, TCSADRAIN
, &port
) == -1) {
599 commerror
= WinError();
607 /*****************************************************************************
608 * EscapeCommFunction (KERNEL32.214)
610 BOOL32
EscapeCommFunction32(INT32 fd
,UINT32 nFunction
)
613 struct DosDeviceStruct
*ptr
;
615 dprintf_comm(stddeb
,"EscapeCommFunction fd: %d, function: %d\n", fd
, nFunction
);
616 if (tcgetattr(fd
,&port
) == -1) {
617 commerror
=WinError();
620 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
621 commerror
= IE_BADID
;
631 port
.c_cflag
&= TIOCM_DTR
;
637 port
.c_cflag
&= TIOCM_RTS
;
643 port
.c_cflag
|= CRTSCTS
;
647 port
.c_cflag
|= CRTSCTS
;
652 port
.c_iflag
|= IXOFF
;
656 port
.c_iflag
|= IXON
;
666 "EscapeCommFunction32 fd: %d, unknown function: %d\n",
671 if (tcsetattr(fd
, TCSADRAIN
, &port
) == -1) {
672 commerror
= WinError();
680 /*****************************************************************************
681 * FlushComm (USER.215)
683 INT16
FlushComm(INT16 fd
,INT16 fnQueue
)
687 dprintf_comm(stddeb
,"FlushComm fd: %d, queue: %d\n", fd
, fnQueue
);
689 case 0: queue
= TCOFLUSH
;
691 case 1: queue
= TCIFLUSH
;
693 default:fprintf(stderr
,
694 "FlushComm fd: %d, UNKNOWN queue: %d\n",
698 if (tcflush(fd
, fnQueue
)) {
699 commerror
= WinError();
707 /*****************************************************************************
708 * GetCommError (USER.203)
710 INT16
GetCommError(INT16 fd
,LPCOMSTAT lpStat
)
715 "GetCommError: fd %d (current error %d)\n", fd
, commerror
);
716 temperror
= commerror
;
721 /*****************************************************************************
722 * ClearCommError (KERNEL32.21)
724 BOOL32
ClearCommError(INT32 fd
,LPDWORD errors
,LPCOMSTAT lpStat
)
729 "ClearCommError: fd %d (current error %d)\n", fd
, commerror
);
730 temperror
= commerror
;
735 /*****************************************************************************
736 * SetCommEventMask (USER.208)
738 UINT16
*SetCommEventMask(INT16 fd
,UINT16 fuEvtMask
)
740 dprintf_comm(stddeb
,"SetCommEventMask:fd %d,mask %d\n",fd
,fuEvtMask
);
741 eventmask
|= fuEvtMask
;
742 return (UINT
*)&eventmask
; /* FIXME, should be SEGPTR */
745 /*****************************************************************************
746 * GetCommEventMask (USER.209)
748 UINT16
GetCommEventMask(INT16 fd
,UINT16 fnEvtClear
)
751 "GetCommEventMask: fd %d, mask %d\n", fd
, fnEvtClear
);
752 eventmask
&= ~fnEvtClear
;
756 /*****************************************************************************
757 * GetCommMask (KERNEL32.156)
759 BOOL32
GetCommMask(INT32 fd
,LPDWORD evtmask
)
762 "GetCommMask: fd %d, mask %p\n", fd
, evtmask
);
763 *evtmask
= eventmask
;
767 /*****************************************************************************
768 * SetCommMask (KERNEL32.451)
770 BOOL32
SetCommMask(INT32 fd
,DWORD evtmask
)
773 "SetCommMask: fd %d, mask %lx\n", fd
, evtmask
);
778 /*****************************************************************************
779 * SetCommState16 (USER.201)
781 INT16
SetCommState16(LPDCB16 lpdcb
)
784 struct DosDeviceStruct
*ptr
;
787 "SetCommState: fd %d, ptr %p\n", lpdcb
->Id
, lpdcb
);
788 if (tcgetattr(lpdcb
->Id
, &port
) == -1) {
789 commerror
= WinError();
794 port
.c_cc
[VTIME
] = 1;
797 port
.c_iflag
&= ~(ISTRIP
|BRKINT
|IGNCR
|ICRNL
|INLCR
|IMAXBEL
);
799 port
.c_iflag
&= ~(ISTRIP
|BRKINT
|IGNCR
|ICRNL
|INLCR
);
801 port
.c_iflag
|= (IGNBRK
);
803 port
.c_oflag
&= ~(OPOST
);
805 port
.c_cflag
&= ~(HUPCL
);
806 port
.c_cflag
|= CLOCAL
| CREAD
;
808 port
.c_lflag
&= ~(ICANON
|ECHO
|ISIG
);
809 port
.c_lflag
|= NOFLSH
;
811 if ((ptr
= GetDeviceStruct(lpdcb
->Id
)) == NULL
) {
812 commerror
= IE_BADID
;
815 if (ptr
->baudrate
> 0)
816 lpdcb
->BaudRate
= ptr
->baudrate
;
817 dprintf_comm(stddeb
,"SetCommState: baudrate %d\n",lpdcb
->BaudRate
);
819 port
.c_cflag
&= ~CBAUD
;
820 switch (lpdcb
->BaudRate
) {
823 port
.c_cflag
|= B110
;
827 port
.c_cflag
|= B300
;
831 port
.c_cflag
|= B600
;
835 port
.c_cflag
|= B1200
;
839 port
.c_cflag
|= B2400
;
843 port
.c_cflag
|= B4800
;
847 port
.c_cflag
|= B9600
;
851 port
.c_cflag
|= B19200
;
855 port
.c_cflag
|= B38400
;
858 commerror
= IE_BAUDRATE
;
862 switch (lpdcb
->BaudRate
) {
865 port
.c_ospeed
= B110
;
869 port
.c_ospeed
= B300
;
873 port
.c_ospeed
= B600
;
877 port
.c_ospeed
= B1200
;
881 port
.c_ospeed
= B2400
;
885 port
.c_ospeed
= B4800
;
889 port
.c_ospeed
= B9600
;
893 port
.c_ospeed
= B19200
;
897 port
.c_ospeed
= B38400
;
900 commerror
= IE_BAUDRATE
;
903 port
.c_ispeed
= port
.c_ospeed
;
905 dprintf_comm(stddeb
,"SetCommState: bytesize %d\n",lpdcb
->ByteSize
);
906 port
.c_cflag
&= ~CSIZE
;
907 switch (lpdcb
->ByteSize
) {
921 commerror
= IE_BYTESIZE
;
925 dprintf_comm(stddeb
,"SetCommState: parity %d\n",lpdcb
->Parity
);
926 port
.c_cflag
&= ~(PARENB
| PARODD
);
928 switch (lpdcb
->Parity
) {
930 port
.c_iflag
&= ~INPCK
;
933 port
.c_cflag
|= (PARENB
| PARODD
);
934 port
.c_iflag
|= INPCK
;
937 port
.c_cflag
|= PARENB
;
938 port
.c_iflag
|= INPCK
;
941 commerror
= IE_BYTESIZE
;
946 dprintf_comm(stddeb
,"SetCommState: stopbits %d\n",lpdcb
->StopBits
);
947 switch (lpdcb
->StopBits
) {
949 port
.c_cflag
&= ~CSTOPB
;
952 port
.c_cflag
|= CSTOPB
;
955 commerror
= IE_BYTESIZE
;
960 if (lpdcb
->fDtrflow
|| lpdcb
->fRtsflow
|| lpdcb
->fOutxCtsFlow
)
961 port
.c_cflag
|= CRTSCTS
;
963 if (lpdcb
->fDtrDisable
)
964 port
.c_cflag
&= ~CRTSCTS
;
967 port
.c_iflag
|= IXON
;
969 port
.c_iflag
|= IXOFF
;
971 if (tcsetattr(lpdcb
->Id
, TCSADRAIN
, &port
) == -1) {
972 commerror
= WinError();
980 /*****************************************************************************
981 * SetCommState32 (KERNEL32.452)
983 BOOL32
SetCommState32(INT32 fd
,LPDCB32 lpdcb
)
986 struct DosDeviceStruct
*ptr
;
988 dprintf_comm(stddeb
,"SetCommState: fd %d, ptr %p\n",fd
,lpdcb
);
989 if (tcgetattr(fd
,&port
) == -1) {
990 commerror
= WinError();
995 port
.c_cc
[VTIME
] = 1;
998 port
.c_iflag
&= ~(ISTRIP
|BRKINT
|IGNCR
|ICRNL
|INLCR
|IMAXBEL
);
1000 port
.c_iflag
&= ~(ISTRIP
|BRKINT
|IGNCR
|ICRNL
|INLCR
);
1002 port
.c_iflag
|= (IGNBRK
);
1004 port
.c_oflag
&= ~(OPOST
);
1006 port
.c_cflag
&= ~(HUPCL
);
1007 port
.c_cflag
|= CLOCAL
| CREAD
;
1009 port
.c_lflag
&= ~(ICANON
|ECHO
|ISIG
);
1010 port
.c_lflag
|= NOFLSH
;
1012 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
1013 commerror
= IE_BADID
;
1016 if (ptr
->baudrate
> 0)
1017 lpdcb
->BaudRate
= ptr
->baudrate
;
1018 dprintf_comm(stddeb
,"SetCommState: baudrate %ld\n",lpdcb
->BaudRate
);
1020 port
.c_cflag
&= ~CBAUD
;
1021 switch (lpdcb
->BaudRate
) {
1024 port
.c_cflag
|= B110
;
1028 port
.c_cflag
|= B300
;
1032 port
.c_cflag
|= B600
;
1036 port
.c_cflag
|= B1200
;
1040 port
.c_cflag
|= B2400
;
1044 port
.c_cflag
|= B4800
;
1048 port
.c_cflag
|= B9600
;
1052 port
.c_cflag
|= B19200
;
1056 port
.c_cflag
|= B38400
;
1059 commerror
= IE_BAUDRATE
;
1063 switch (lpdcb
->BaudRate
) {
1066 port
.c_ospeed
= B110
;
1070 port
.c_ospeed
= B300
;
1074 port
.c_ospeed
= B600
;
1078 port
.c_ospeed
= B1200
;
1082 port
.c_ospeed
= B2400
;
1086 port
.c_ospeed
= B4800
;
1090 port
.c_ospeed
= B9600
;
1094 port
.c_ospeed
= B19200
;
1098 port
.c_ospeed
= B38400
;
1101 commerror
= IE_BAUDRATE
;
1104 port
.c_ispeed
= port
.c_ospeed
;
1106 dprintf_comm(stddeb
,"SetCommState: bytesize %d\n",lpdcb
->ByteSize
);
1107 port
.c_cflag
&= ~CSIZE
;
1108 switch (lpdcb
->ByteSize
) {
1110 port
.c_cflag
|= CS5
;
1113 port
.c_cflag
|= CS6
;
1116 port
.c_cflag
|= CS7
;
1119 port
.c_cflag
|= CS8
;
1122 commerror
= IE_BYTESIZE
;
1126 dprintf_comm(stddeb
,"SetCommState: parity %d\n",lpdcb
->Parity
);
1127 port
.c_cflag
&= ~(PARENB
| PARODD
);
1129 switch (lpdcb
->Parity
) {
1131 port
.c_iflag
&= ~INPCK
;
1134 port
.c_cflag
|= (PARENB
| PARODD
);
1135 port
.c_iflag
|= INPCK
;
1138 port
.c_cflag
|= PARENB
;
1139 port
.c_iflag
|= INPCK
;
1142 commerror
= IE_BYTESIZE
;
1147 dprintf_comm(stddeb
,"SetCommState: stopbits %d\n",lpdcb
->StopBits
);
1148 switch (lpdcb
->StopBits
) {
1150 port
.c_cflag
&= ~CSTOPB
;
1153 port
.c_cflag
|= CSTOPB
;
1156 commerror
= IE_BYTESIZE
;
1160 if ( lpdcb
->fOutxCtsFlow
||
1161 lpdcb
->fDtrControl
== DTR_CONTROL_ENABLE
||
1162 lpdcb
->fRtsControl
== RTS_CONTROL_ENABLE
1164 port
.c_cflag
|= CRTSCTS
;
1165 if (lpdcb
->fDtrControl
== DTR_CONTROL_DISABLE
)
1166 port
.c_cflag
&= ~CRTSCTS
;
1170 port
.c_iflag
|= IXON
;
1172 port
.c_iflag
|= IXOFF
;
1174 if (tcsetattr(fd
,TCSADRAIN
,&port
)==-1) {
1175 commerror
= WinError();
1184 /*****************************************************************************
1185 * GetCommState (USER.202)
1187 INT16
GetCommState16(INT16 fd
, LPDCB16 lpdcb
)
1189 struct termios port
;
1191 dprintf_comm(stddeb
,"GetCommState: fd %d, ptr %p\n", fd
, lpdcb
);
1192 if (tcgetattr(fd
, &port
) == -1) {
1193 commerror
= WinError();
1198 switch (port
.c_cflag
& CBAUD
) {
1200 switch (port
.c_ospeed
) {
1203 lpdcb
->BaudRate
= 110;
1206 lpdcb
->BaudRate
= 300;
1209 lpdcb
->BaudRate
= 600;
1212 lpdcb
->BaudRate
= 1200;
1215 lpdcb
->BaudRate
= 2400;
1218 lpdcb
->BaudRate
= 4800;
1221 lpdcb
->BaudRate
= 9600;
1224 lpdcb
->BaudRate
= 19200;
1227 lpdcb
->BaudRate
= 38400;
1231 switch (port
.c_cflag
& CSIZE
) {
1233 lpdcb
->ByteSize
= 5;
1236 lpdcb
->ByteSize
= 6;
1239 lpdcb
->ByteSize
= 7;
1242 lpdcb
->ByteSize
= 8;
1246 switch (port
.c_cflag
& ~(PARENB
| PARODD
)) {
1248 lpdcb
->fParity
= NOPARITY
;
1251 lpdcb
->fParity
= EVENPARITY
;
1253 case (PARENB
| PARODD
):
1254 lpdcb
->fParity
= ODDPARITY
;
1258 if (port
.c_cflag
& CSTOPB
)
1259 lpdcb
->StopBits
= TWOSTOPBITS
;
1261 lpdcb
->StopBits
= ONESTOPBIT
;
1263 lpdcb
->RlsTimeout
= 50;
1264 lpdcb
->CtsTimeout
= 50;
1265 lpdcb
->DsrTimeout
= 50;
1269 lpdcb
->fDtrDisable
= 0;
1273 if (port
.c_cflag
& CRTSCTS
) {
1274 lpdcb
->fDtrflow
= 1;
1275 lpdcb
->fRtsflow
= 1;
1276 lpdcb
->fOutxCtsFlow
= 1;
1277 lpdcb
->fOutxDsrFlow
= 1;
1280 lpdcb
->fDtrDisable
= 1;
1282 if (port
.c_iflag
& IXON
)
1287 if (port
.c_iflag
& IXOFF
)
1296 lpdcb
->XoffLim
= 10;
1302 /*****************************************************************************
1303 * GetCommState (KERNEL32.159)
1305 BOOL32
GetCommState32(INT32 fd
, LPDCB32 lpdcb
)
1307 struct termios port
;
1310 dprintf_comm(stddeb
,"GetCommState32: fd %d, ptr %p\n", fd
, lpdcb
);
1311 if (tcgetattr(fd
, &port
) == -1) {
1312 commerror
= WinError();
1316 switch (port
.c_cflag
& CBAUD
) {
1318 switch (port
.c_ospeed
) {
1321 lpdcb
->BaudRate
= 110;
1324 lpdcb
->BaudRate
= 300;
1327 lpdcb
->BaudRate
= 600;
1330 lpdcb
->BaudRate
= 1200;
1333 lpdcb
->BaudRate
= 2400;
1336 lpdcb
->BaudRate
= 4800;
1339 lpdcb
->BaudRate
= 9600;
1342 lpdcb
->BaudRate
= 19200;
1345 lpdcb
->BaudRate
= 38400;
1349 switch (port
.c_cflag
& CSIZE
) {
1351 lpdcb
->ByteSize
= 5;
1354 lpdcb
->ByteSize
= 6;
1357 lpdcb
->ByteSize
= 7;
1360 lpdcb
->ByteSize
= 8;
1364 switch (port
.c_cflag
& ~(PARENB
| PARODD
)) {
1366 lpdcb
->fParity
= NOPARITY
;
1369 lpdcb
->fParity
= EVENPARITY
;
1371 case (PARENB
| PARODD
):
1372 lpdcb
->fParity
= ODDPARITY
;
1376 if (port
.c_cflag
& CSTOPB
)
1377 lpdcb
->StopBits
= TWOSTOPBITS
;
1379 lpdcb
->StopBits
= ONESTOPBIT
;
1386 if (port
.c_cflag
& CRTSCTS
) {
1387 lpdcb
->fDtrControl
= DTR_CONTROL_ENABLE
;
1388 lpdcb
->fRtsControl
= RTS_CONTROL_ENABLE
;
1389 lpdcb
->fOutxCtsFlow
= 1;
1390 lpdcb
->fOutxDsrFlow
= 1;
1394 lpdcb
->fDtrControl
= DTR_CONTROL_DISABLE
;
1395 lpdcb
->fRtsControl
= RTS_CONTROL_DISABLE
;
1397 if (port
.c_iflag
& IXON
)
1402 if (port
.c_iflag
& IXOFF
)
1411 lpdcb
->XoffLim
= 10;
1417 /*****************************************************************************
1418 * TransmitCommChar (USER.206)
1420 INT16
TransmitCommChar16(INT16 fd
,CHAR chTransmit
)
1422 struct DosDeviceStruct
*ptr
;
1424 dprintf_comm(stddeb
,
1425 "TransmitCommChar: fd %d, data %d \n", fd
, chTransmit
);
1426 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
1427 commerror
= IE_BADID
;
1431 if (ptr
->suspended
) {
1432 commerror
= IE_HARDWARE
;
1436 if (write(fd
, (void *) &chTransmit
, 1) == -1) {
1437 commerror
= WinError();
1445 /*****************************************************************************
1446 * TransmitCommChar (KERNEL32.535)
1448 BOOL32
TransmitCommChar32(INT32 fd
,CHAR chTransmit
)
1450 struct DosDeviceStruct
*ptr
;
1452 dprintf_comm(stddeb
,"TransmitCommChar32(%d,'%c')\n",fd
,chTransmit
);
1453 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
1454 commerror
= IE_BADID
;
1458 if (ptr
->suspended
) {
1459 commerror
= IE_HARDWARE
;
1462 if (write(fd
, (void *) &chTransmit
, 1) == -1) {
1463 commerror
= WinError();
1471 /*****************************************************************************
1472 * UngetCommChar (USER.212)
1474 INT16
UngetCommChar(INT16 fd
,CHAR chUnget
)
1476 struct DosDeviceStruct
*ptr
;
1478 dprintf_comm(stddeb
,"UngetCommChar: fd %d (char %d)\n", fd
, chUnget
);
1479 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
1480 commerror
= IE_BADID
;
1484 if (ptr
->suspended
) {
1485 commerror
= IE_HARDWARE
;
1490 ptr
->unget_byte
= chUnget
;
1495 /*****************************************************************************
1496 * ReadComm (USER.204)
1498 INT16
ReadComm(INT16 fd
,LPSTR lpvBuf
,INT16 cbRead
)
1501 struct DosDeviceStruct
*ptr
;
1503 dprintf_comm(stddeb
,
1504 "ReadComm: fd %d, ptr %p, length %d\n", fd
, lpvBuf
, cbRead
);
1505 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
1506 commerror
= IE_BADID
;
1510 if (ptr
->suspended
) {
1511 commerror
= IE_HARDWARE
;
1516 *lpvBuf
= ptr
->unget_byte
;
1524 status
= read(fd
, (void *) lpvBuf
, cbRead
);
1527 if (errno
!= EAGAIN
) {
1528 commerror
= WinError();
1536 return length
+ status
;
1540 /*****************************************************************************
1541 * WriteComm (USER.205)
1543 INT16
WriteComm(INT16 fd
, LPSTR lpvBuf
, INT16 cbWrite
)
1546 struct DosDeviceStruct
*ptr
;
1548 dprintf_comm(stddeb
,"WriteComm: fd %d, ptr %p, length %d\n",
1549 fd
, lpvBuf
, cbWrite
);
1550 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
1551 commerror
= IE_BADID
;
1555 if (ptr
->suspended
) {
1556 commerror
= IE_HARDWARE
;
1560 for (x
=0; x
!= cbWrite
; x
++)
1561 dprintf_comm(stddeb
,"%c", *(lpvBuf
+ x
) );
1563 length
= write(fd
, (void *) lpvBuf
, cbWrite
);
1566 commerror
= WinError();
1575 /*****************************************************************************
1576 * GetCommTimeouts (KERNEL32.160)
1578 BOOL32
GetCommTimeouts(INT32 fd
,LPCOMMTIMEOUTS lptimeouts
) {
1579 dprintf_comm(stddeb
,"GetCommTimeouts(%x,%p), empty stub.\n",
1585 /*****************************************************************************
1586 * SetCommTimeouts (KERNEL32.453)
1588 BOOL32
SetCommTimeouts(INT32 fd
,LPCOMMTIMEOUTS lptimeouts
) {
1589 dprintf_comm(stddeb
,"SetCommTimeouts(%x,%p), empty stub.\n",