From 28cd4fae3b200a3880c9f430703cc90d8efa8c1e Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Sun, 7 May 2006 14:10:55 +0200 Subject: [PATCH] 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 de17f34dfb..7d8e6da7b0 100644 --- a/dlls/kernel/comm.c +++ b/dlls/kernel/comm.c @@ -1080,6 +1080,7 @@ BOOL WINAPI GetCommState(HANDLE handle, LPDCB lpdcb) 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, LPDCB lpdcb) !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, LPDCB lpdcb) 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 65eafd2dca..9b56c6ba87 100644 --- a/dlls/ntdll/serial.c +++ b/dlls/ntdll/serial.c @@ -319,6 +319,25 @@ static NTSTATUS get_modem_status(int fd, DWORD* lpModemStat) 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 hDevice, 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)) { -- 2.32.0.93.g670b81a890