2 * DEC 93 Erik Bos (erik@trashcan.hacktic.nl)
11 #if defined(__NetBSD__) || defined(__FreeBSD__)
13 #include <sys/ioctl.h>
22 int commerror
= 0, eventmask
= 0;
24 struct DosDeviceStruct
{
25 char *devicename
; /* /dev/cua1 */
32 struct DosDeviceStruct COM
[MAX_PORTS
];
33 struct DosDeviceStruct LPT
[MAX_PORTS
];
35 void Comm_DeInit(void);
39 int x
, serial
= 0, parallel
= 0;
40 char option
[10], temp
[256], *ptr
;
43 for (x
=0; x
!=MAX_PORTS
; x
++) {
44 strcpy(option
,"COMx");
48 GetPrivateProfileString("serialports", option
, "*", temp
, sizeof(temp
), WINE_INI
);
49 if (!strcmp(temp
, "*") || *temp
== '\0')
50 COM
[serial
].devicename
= NULL
;
53 if (!S_ISCHR(st
.st_mode
))
54 fprintf(stderr
,"comm: can 't use `%s' as COM%d !\n", temp
, x
);
56 if ((ptr
= malloc(strlen(temp
)+1)) == NULL
)
57 fprintf(stderr
,"comm: can't malloc for device info!\n");
60 COM
[serial
].devicename
= ptr
;
61 strcpy(COM
[serial
++].devicename
, temp
);
65 strcpy(option
, "LPTx");
69 GetPrivateProfileString("parallelports", option
, "*", temp
, sizeof(temp
), WINE_INI
);
70 if (!strcmp(temp
, "*") || *temp
== '\0')
71 LPT
[parallel
].devicename
= NULL
;
74 if (!S_ISCHR(st
.st_mode
))
75 fprintf(stderr
,"comm: can 't use `%s' as LPT%d !\n", temp
, x
);
77 if ((ptr
= malloc(strlen(temp
)+1)) == NULL
)
78 fprintf(stderr
,"comm: can't malloc for device info!\n");
81 LPT
[serial
].devicename
= ptr
;
82 strcpy(LPT
[serial
++].devicename
, temp
);
90 void Comm_DeInit(void)
94 for (x
=0; x
!=MAX_PORTS
; x
++) {
96 if (COM
[x
].devicename
) {
99 free(COM
[x
].devicename
);
101 if (LPT
[x
].devicename
) {
104 free(LPT
[x
].devicename
);
109 struct DosDeviceStruct
*GetDeviceStruct(int fd
)
113 for (x
=0; x
!=MAX_PORTS
; x
++) {
123 int ValidCOMPort(int x
)
125 return(x
< MAX_PORTS
? (int) COM
[x
].devicename
: 0);
128 int ValidLPTPort(int x
)
130 return(x
< MAX_PORTS
? (int) LPT
[x
].devicename
: 0);
142 int BuildCommDCB(LPSTR device
, DCB FAR
*lpdcb
)
144 /* "COM1:9600,n,8,1" */
148 char *ptr
, *ptr2
, temp
[256],temp2
[10];
151 fprintf(stderr
,"BuildCommDCB: (%s), ptr %d\n", device
, lpdcb
);
155 if (!strncmp(device
,"COM",3)) {
156 port
= device
[3] - '0';
158 if (!ValidCOMPort(port
)) {
159 commerror
= IE_BADID
;
164 commerror
= IE_NOPEN
;
167 lpdcb
->Id
= COM
[port
].fd
;
172 if (*(device
+4) != ':')
175 strcpy(temp
,device
+5);
176 ptr
= strtok(temp
, ",");
178 fprintf(stderr
,"BuildCommDCB: baudrate (%s)\n", ptr
);
179 lpdcb
->BaudRate
= atoi(ptr
);
181 ptr
= strtok(NULL
, ",");
183 *ptr
= toupper(*ptr
);
185 fprintf(stderr
,"BuildCommDCB: parity (%c)\n", *ptr
);
188 lpdcb
->Parity
= NOPARITY
;
195 lpdcb
->Parity
= EVENPARITY
;
198 lpdcb
->Parity
= MARKPARITY
;
201 lpdcb
->Parity
= ODDPARITY
;
204 fprintf(stderr
,"comm: unknown parity `%c'!\n", *ptr
);
208 ptr
= strtok(NULL
, ",");
209 fprintf(stderr
, "BuildCommDCB: charsize (%c)\n", *ptr
);
210 lpdcb
->ByteSize
= *ptr
- '0';
212 ptr
= strtok(NULL
, ",");
213 fprintf(stderr
, "BuildCommDCB: stopbits (%c)\n", *ptr
);
216 lpdcb
->StopBits
= ONESTOPBIT
;
219 lpdcb
->StopBits
= TWOSTOPBITS
;
222 fprintf(stderr
,"comm: unknown # of stopbits `%c'!\n", *ptr
);
230 int OpenComm(LPSTR device
, UINT cbInQueue
, UINT cbOutQueue
)
235 fprintf(stderr
,"OpenComm: %s, %d, %d\n", device
, cbInQueue
, cbOutQueue
);
240 if (!strncmp(device
,"COM",3)) {
241 port
= device
[3] - '0';
243 if (!ValidCOMPort(port
)) {
244 commerror
= IE_BADID
;
252 fd
= open(COM
[port
].devicename
, O_RDWR
| O_NONBLOCK
, 0);
254 commerror
= WinError();
262 if (!strncmp(device
,"LPT",3)) {
263 port
= device
[3] - '0';
265 if (!ValidLPTPort(port
)) {
266 commerror
= IE_BADID
;
274 fd
= open(LPT
[port
].devicename
, O_RDWR
| O_NONBLOCK
, 0);
276 commerror
= WinError();
286 int CloseComm(int fd
)
291 fprintf(stderr
,"CloseComm: fd %d\n", fd
);
294 if (close(fd
) == -1) {
295 commerror
= WinError();
303 int SetCommBreak(int fd
)
305 struct DosDeviceStruct
*ptr
;
308 fprintf(stderr
,"SetCommBreak: fd: %d\n", fd
);
311 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
312 commerror
= IE_BADID
;
321 int ClearCommBreak(int fd
)
323 struct DosDeviceStruct
*ptr
;
326 fprintf(stderr
,"ClearCommBreak: fd: %d\n", fd
);
329 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
330 commerror
= IE_BADID
;
339 LONG
EscapeCommFunction(int fd
, int nFunction
)
345 fprintf(stderr
,"EscapeCommFunction fd: %d, function: %d\n", fd
, nFunction
);
348 if (tcgetattr(fd
, &port
) == -1) {
349 commerror
= WinError();
358 for (max
= 0;COM
[max
].devicename
;max
++)
364 for (max
= 0;LPT
[max
].devicename
;max
++)
370 port
.c_cflag
&= TIOCM_DTR
;
374 port
.c_cflag
&= TIOCM_RTS
;
378 port
.c_cflag
|= CRTSCTS
;
382 port
.c_cflag
|= CRTSCTS
;
386 port
.c_iflag
|= IXOFF
;
390 port
.c_iflag
|= IXON
;
394 fprintf(stderr
,"EscapeCommFunction fd: %d, unknown function: %d\n", fd
, nFunction
);
398 if (tcsetattr(fd
, TCSADRAIN
, &port
) == -1) {
399 commerror
= WinError();
407 int FlushComm(int fd
, int fnQueue
)
412 fprintf(stderr
,"FlushComm fd: %d, queue: %d\n", fd
, fnQueue
);
423 fprintf(stderr
,"FlushComm fd: %d, UNKNOWN queue: %d\n", fd
, fnQueue
);
427 if (tcflush(fd
, fnQueue
)) {
428 commerror
= WinError();
436 int GetCommError(int fd
, COMSTAT FAR
*lpStat
)
439 fprintf(stderr
,"GetCommError: fd %d (current error %d)\n", fd
, commerror
);
445 UINT FAR
* SetCommEventMask(int fd
, UINT fuEvtMask
)
448 fprintf(stderr
,"SetCommEventMask: fd %d, mask %d\n", fd
, fuEvtMask
);
451 eventmask
|= fuEvtMask
;
452 return (UINT
*)&eventmask
;
455 UINT
GetCommEventMask(int fd
, int fnEvtClear
)
458 fprintf(stderr
,"GetCommEventMask: fd %d, mask %d\n", fd
, fnEvtClear
);
460 eventmask
&= ~fnEvtClear
;
464 int SetCommState(DCB FAR
*lpdcb
)
469 fprintf(stderr
,"SetCommState: fd %d, ptr %d\n", lpdcb
->Id
, lpdcb
);
472 if (tcgetattr(lpdcb
->Id
, &port
) == -1) {
473 commerror
= WinError();
478 port
.c_cc
[VTIME
] = 0;
480 fprintf(stderr
,"SetCommState: baudrate %d\n",lpdcb
->BaudRate
);
482 port
.c_cflag
&= ~CBAUD
;
483 switch (lpdcb
->BaudRate
) {
486 port
.c_cflag
|= B110
;
490 port
.c_cflag
|= B300
;
494 port
.c_cflag
|= B600
;
498 port
.c_cflag
|= B1200
;
502 port
.c_cflag
|= B2400
;
506 port
.c_cflag
|= B4800
;
510 port
.c_cflag
|= B9600
;
514 port
.c_cflag
|= B19200
;
518 port
.c_cflag
|= B38400
;
521 commerror
= IE_BAUDRATE
;
525 switch (lpdcb
->BaudRate
) {
528 port
.c_ospeed
= B110
;
532 port
.c_ospeed
= B300
;
536 port
.c_ospeed
= B600
;
540 port
.c_ospeed
= B1200
;
544 port
.c_ospeed
= B2400
;
548 port
.c_ospeed
= B4800
;
552 port
.c_ospeed
= B9600
;
556 port
.c_ospeed
= B19200
;
560 port
.c_ospeed
= B38400
;
563 commerror
= IE_BAUDRATE
;
566 port
.c_ispeed
= port
.c_ospeed
;
568 fprintf(stderr
,"SetCommState: bytesize %d\n",lpdcb
->ByteSize
);
569 port
.c_cflag
&= ~CSIZE
;
570 switch (lpdcb
->ByteSize
) {
584 commerror
= IE_BYTESIZE
;
588 fprintf(stderr
,"SetCommState: parity %d\n",lpdcb
->Parity
);
589 port
.c_cflag
&= ~(PARENB
| PARODD
);
591 switch (lpdcb
->Parity
) {
593 port
.c_iflag
&= ~INPCK
;
596 port
.c_cflag
|= (PARENB
| PARODD
);
597 port
.c_iflag
|= INPCK
;
600 port
.c_cflag
|= PARENB
;
601 port
.c_iflag
|= INPCK
;
604 commerror
= IE_BYTESIZE
;
609 fprintf(stderr
,"SetCommState: stopbits %d\n",lpdcb
->StopBits
);
610 switch (lpdcb
->StopBits
) {
612 port
.c_cflag
&= ~CSTOPB
;
615 port
.c_cflag
|= CSTOPB
;
618 commerror
= IE_BYTESIZE
;
622 if (lpdcb
->fDtrflow
|| lpdcb
->fRtsflow
|| lpdcb
->fOutxCtsFlow
)
623 port
.c_cflag
|= CRTSCTS
;
625 if (lpdcb
->fDtrDisable
)
626 port
.c_cflag
&= ~CRTSCTS
;
629 port
.c_iflag
|= IXON
;
631 port
.c_iflag
|= IXOFF
;
633 if (tcsetattr(lpdcb
->Id
, TCSADRAIN
, &port
) == -1) {
634 commerror
= WinError();
642 int GetCommState(int fd
, DCB FAR
*lpdcb
)
647 fprintf(stderr
,"GetCommState: fd %d, ptr %d\n", fd
, lpdcb
);
650 if (tcgetattr(fd
, &port
) == -1) {
651 commerror
= WinError();
658 switch (port
.c_cflag
& CBAUD
) {
660 switch (port
.c_ospeed
) {
663 lpdcb
->BaudRate
= 110;
666 lpdcb
->BaudRate
= 300;
669 lpdcb
->BaudRate
= 600;
672 lpdcb
->BaudRate
= 1200;
675 lpdcb
->BaudRate
= 2400;
678 lpdcb
->BaudRate
= 4800;
681 lpdcb
->BaudRate
= 9600;
684 lpdcb
->BaudRate
= 19200;
687 lpdcb
->BaudRate
= 38400;
691 switch (port
.c_cflag
& CSIZE
) {
706 switch (port
.c_cflag
& ~(PARENB
| PARODD
)) {
708 lpdcb
->fParity
= NOPARITY
;
711 lpdcb
->fParity
= EVENPARITY
;
713 case (PARENB
| PARODD
):
714 lpdcb
->fParity
= ODDPARITY
;
718 if (port
.c_cflag
& CSTOPB
)
719 lpdcb
->StopBits
= TWOSTOPBITS
;
721 lpdcb
->StopBits
= ONESTOPBIT
;
723 lpdcb
->RlsTimeout
= 50;
724 lpdcb
->CtsTimeout
= 50;
725 lpdcb
->DsrTimeout
= 50;
730 lpdcb
->fDtrDisable
= 0;
731 if (port
.c_cflag
& CRTSCTS
) {
734 lpdcb
->fOutxCtsFlow
= 1;
735 lpdcb
->fOutxDsrFlow
= 1;
737 lpdcb
->fDtrDisable
= 1;
739 if (port
.c_iflag
& IXON
)
744 if (port
.c_iflag
& IXOFF
)
759 int TransmitCommChar(int fd
, char chTransmit
)
761 struct DosDeviceStruct
*ptr
;
764 fprintf(stderr
,"TransmitCommChar: fd %d, data %d \n", fd
, chTransmit
);
767 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
768 commerror
= IE_BADID
;
772 if (ptr
->suspended
) {
773 commerror
= IE_HARDWARE
;
777 if (write(fd
, (void *) &chTransmit
, 1) == -1) {
778 commerror
= WinError();
786 int UngetCommChar(int fd
, char chUnget
)
788 struct DosDeviceStruct
*ptr
;
791 fprintf(stderr
,"UngetCommChar: fd %d (char %d)\n", fd
, chUnget
);
794 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
795 commerror
= IE_BADID
;
799 if (ptr
->suspended
) {
800 commerror
= IE_HARDWARE
;
805 ptr
->unget_byte
= chUnget
;
811 int ReadComm(int fd
, LPSTR lpvBuf
, int cbRead
)
814 struct DosDeviceStruct
*ptr
;
817 fprintf(stderr
,"ReadComm: fd %d, ptr %d, length %d\n", fd
, lpvBuf
, cbRead
);
820 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
821 commerror
= IE_BADID
;
825 if (ptr
->suspended
) {
826 commerror
= IE_HARDWARE
;
831 *lpvBuf
= ptr
->unget_byte
;
839 status
= read(fd
, (void *) lpvBuf
, cbRead
);
842 commerror
= WinError();
846 return length
+ status
;
850 int WriteComm(int fd
, LPSTR lpvBuf
, int cbWrite
)
853 struct DosDeviceStruct
*ptr
;
856 fprintf(stderr
,"WriteComm: fd %d, ptr %d, length %d\n", fd
, lpvBuf
, cbWrite
);
859 if ((ptr
= GetDeviceStruct(fd
)) == NULL
) {
860 commerror
= IE_BADID
;
864 if (ptr
->suspended
) {
865 commerror
= IE_HARDWARE
;
870 for (x
=0; x
!= cbWrite
; x
++)
871 fprintf(stderr
,"%c", *(lpvBuf
+ x
) );
874 length
= write(fd
, (void *) lpvBuf
, cbWrite
);
877 commerror
= WinError();