libcsupport/termios: Wake receiver when ICANON settings change

Closes #5307
This commit is contained in:
Chris Johns
2025-07-22 15:17:16 +10:00
committed by Kinsey Moore
parent 8d73c4914e
commit 3a2b37826f

View File

@@ -770,6 +770,9 @@ rtems_termios_ioctl (void *arg)
rtems_libio_ioctl_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer;
bool rawInBufSemaphoreWait;
int rawInBufSemaphoreTimeout;
int rawInBufSemaphoreFirstTimeout;
rtems_status_code sc;
int flags;
@@ -807,6 +810,10 @@ rtems_termios_ioctl (void *arg)
/* check for and process change in flow control options */
termios_set_flowctrl(tty);
rawInBufSemaphoreWait = tty->rawInBufSemaphoreWait;
rawInBufSemaphoreTimeout = tty->rawInBufSemaphoreTimeout;
rawInBufSemaphoreFirstTimeout = tty->rawInBufSemaphoreFirstTimeout;
if (tty->termios.c_lflag & ICANON) {
tty->rawInBufSemaphoreWait = true;
tty->rawInBufSemaphoreTimeout = 0;
@@ -835,6 +842,12 @@ rtems_termios_ioctl (void *arg)
sc = (*tty->handler.set_attributes)(tty->device_context, &tty->termios) ?
RTEMS_SUCCESSFUL : RTEMS_IO_ERROR;
}
if (rawInBufSemaphoreWait == tty->rawInBufSemaphoreWait ||
rawInBufSemaphoreTimeout == tty->rawInBufSemaphoreTimeout ||
rawInBufSemaphoreFirstTimeout ==
tty->rawInBufSemaphoreFirstTimeout) {
rtems_binary_semaphore_post (&tty->rawInBuf.Semaphore);
}
break;
case TIOCDRAIN: