Module: wine Branch: refs/heads/master Commit: 28cd4fae3b200a3880c9f430703cc90d8efa8c1e URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=28cd4fae3b200a3880c9f430...
Author: Eric Pouech eric.pouech@wanadoo.fr Date: Sun May 7 14:10:55 2006 +0200
ntdll/kernel32: GetCommState & IOCTL_GET_CHARS
- implemented SERIAL_GET_CHARS ioctl - made use of it in kernel32.GetCommState
---
dlls/kernel/comm.c | 14 +++++++++----- dlls/ntdll/serial.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-)
diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c index de17f34..7d8e6da 100644 --- a/dlls/kernel/comm.c +++ b/dlls/kernel/comm.c @@ -1080,6 +1080,7 @@ BOOL WINAPI GetCommState(HANDLE handle, SERIAL_BAUD_RATE sbr; SERIAL_LINE_CONTROL slc; SERIAL_HANDFLOW shf; + SERIAL_CHARS sc;
TRACE("handle %p, ptr %p\n", handle, lpdcb);
@@ -1094,7 +1095,9 @@ BOOL WINAPI GetCommState(HANDLE handle, !DeviceIoControl(handle, IOCTL_SERIAL_GET_LINE_CONTROL, NULL, 0, &slc, sizeof(slc), NULL, NULL) || !DeviceIoControl(handle, IOCTL_SERIAL_GET_HANDFLOW, - NULL, 0, &shf, sizeof(shf), NULL, NULL)) + NULL, 0, &shf, sizeof(shf), NULL, NULL) || + !DeviceIoControl(handle, IOCTL_SERIAL_GET_CHARS, + NULL, 0, &sc, sizeof(sc), NULL, NULL)) return FALSE;
memset(lpdcb, 0, sizeof(*lpdcb)); @@ -1137,10 +1140,11 @@ BOOL WINAPI GetCommState(HANDLE handle, if (shf.FlowReplace & SERIAL_AUTO_TRANSMIT) lpdcb->fOutX = 1; if (shf.FlowReplace & SERIAL_AUTO_RECEIVE) lpdcb->fInX = 1;
-/* - lpdcb->XonChar = - lpdcb->XoffChar = - */ + lpdcb->EofChar = sc.EofChar; + lpdcb->ErrorChar = sc.ErrorChar; + lpdcb->EvtChar = sc.EventChar; + lpdcb->XonChar = sc.XonChar; + lpdcb->XoffChar = sc.XoffChar;
TRACE("OK\n"); dump_dcb(lpdcb); diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c index 65eafd2..9b56c6b 100644 --- a/dlls/ntdll/serial.c +++ b/dlls/ntdll/serial.c @@ -319,6 +319,25 @@ #endif return status; }
+static NTSTATUS get_special_chars(int fd, SERIAL_CHARS* sc) +{ + struct termios port; + + if (tcgetattr(fd, &port) == -1) + { + ERR("tcgetattr error '%s'\n", strerror(errno)); + return FILE_GetNtStatus(); + } + sc->EofChar = port.c_cc[VEOF]; + sc->ErrorChar = 0xFF; + sc->BreakChar = 0; /* FIXME */ + sc->EventChar = 0; /* FIXME */ + sc->XonChar = port.c_cc[VSTART]; + sc->XoffChar = port.c_cc[VSTOP]; + + return STATUS_SUCCESS; +} + static NTSTATUS get_status(int fd, SERIAL_STATUS* ss) { NTSTATUS status = STATUS_SUCCESS; @@ -779,6 +798,15 @@ NTSTATUS COMM_DeviceIoControl(HANDLE hDe else status = STATUS_INVALID_PARAMETER; break; + case IOCTL_SERIAL_GET_CHARS: + if (lpOutBuffer && nOutBufferSize == sizeof(SERIAL_CHARS)) + { + if (!(status = get_special_chars(fd, (SERIAL_CHARS*)lpOutBuffer))) + sz = sizeof(SERIAL_CHARS); + } + else + status = STATUS_INVALID_PARAMETER; + break; case IOCTL_SERIAL_GET_COMMSTATUS: if (lpOutBuffer && nOutBufferSize == sizeof(SERIAL_STATUS)) {