From 071ff801eebdc5e7c0b4acfd861cceead5174336 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Tue, 9 May 2023 16:53:23 -0400 Subject: [PATCH] BSerialPort: Implement WaitForInput() using wait_for_objects. Fixes #17867. Change-Id: Ib59781128d5d21317c4042f250333b177a0ed91b Reviewed-on: https://review.haiku-os.org/c/haiku/+/6432 Reviewed-by: waddlesplash --- src/kits/device/SerialPort.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/kits/device/SerialPort.cpp b/src/kits/device/SerialPort.cpp index 37f4c36063..b84899d4d1 100644 --- a/src/kits/device/SerialPort.cpp +++ b/src/kits/device/SerialPort.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -469,10 +470,18 @@ BSerialPort::IsDCD(void) ssize_t BSerialPort::WaitForInput(void) { - ssize_t size; - int err = ioctl(ffd, TCWAITEVENT, &size, sizeof size); + object_wait_info info[1]; + info[0].type = B_OBJECT_TYPE_FD; + info[0].object = ffd; + info[0].events = B_EVENT_READ | B_EVENT_ERROR | B_EVENT_DISCONNECTED; + status_t status = wait_for_objects_etc(info, 1, B_RELATIVE_TIMEOUT, fTimeout); + if (status < 0) + return status; - return (err < B_OK) ? errno : size; + int size; + if (ioctl(ffd, FIONREAD, &size, sizeof(size)) < 0) + return errno; + return size; }