Module: wine Branch: refs/heads/master Commit: a6d339c6560c2d371dc856c8ab2c1b25d216abe9 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=a6d339c6560c2d371dc856c8...
Author: Eric Pouech eric.pouech@wanadoo.fr Date: Mon Feb 27 22:22:06 2006 +0100
ntdll: Implemented serial IOCTL for status: GET_COMM_STATUS.
---
dlls/ntdll/serial.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 files changed, 38 insertions(+), 0 deletions(-)
diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c index 04f9534..879f6f1 100644 --- a/dlls/ntdll/serial.c +++ b/dlls/ntdll/serial.c @@ -168,6 +168,36 @@ static NTSTATUS get_modem_status(int fd, return status; }
+static NTSTATUS get_status(int fd, SERIAL_STATUS* ss) +{ + NTSTATUS status = STATUS_SUCCESS; + + ss->Errors = 0; + ss->HoldReasons = 0; + ss->EofReceived = FALSE; + ss->WaitForImmediate = FALSE; +#ifdef TIOCOUTQ + if (ioctl(fd, TIOCOUTQ, &ss->AmountInOutQueue) == -1) + { + WARN("ioctl returned error\n"); + status = FILE_GetNtStatus(); + } +#else + ss->AmountInOutQueue = 0; /* FIXME: find a different way to find out */ +#endif + +#ifdef TIOCINQ + if (ioctl(fd, TIOCINQ, &ss->AmountInInQueue)) + { + WARN("ioctl returned error\n"); + status = FILE_GetNtStatus(); + } +#else + ss->AmountInInQueue = 0; /* FIXME: find a different way to find out */ +#endif + return status; +} + static NTSTATUS get_wait_mask(HANDLE hDevice, DWORD* mask) { NTSTATUS status; @@ -247,6 +277,14 @@ NTSTATUS COMM_DeviceIoControl(HANDLE hDe
switch (dwIoControlCode) { + case IOCTL_SERIAL_GET_COMMSTATUS: + if (lpOutBuffer && nOutBufferSize == sizeof(SERIAL_STATUS)) + { + if (!(status = get_status(fd, (SERIAL_STATUS*)lpOutBuffer))) + sz = sizeof(SERIAL_STATUS); + } + else status = STATUS_INVALID_PARAMETER; + break; case IOCTL_SERIAL_GET_MODEMSTATUS: if (lpOutBuffer && nOutBufferSize == sizeof(DWORD)) {