diff --git a/headers/posix/termios.h b/headers/posix/termios.h index 90f1b0524d..bcf29847cd 100644 --- a/headers/posix/termios.h +++ b/headers/posix/termios.h @@ -188,6 +188,7 @@ struct termios { #define TIOCMBIS (TCGETA + 22) /* set bits in line state */ #define TIOCMBIC (TCGETA + 23) /* clear bits in line state */ #define TIOCGSID (TCGETA + 24) /* get session leader process group ID */ +#define TIOCOUTQ (TCGETA + 25) /* get output queue size */ /* Event codes. Returned from TCWAITEVENT */ #define EV_RING 0x0001 diff --git a/src/add-ons/kernel/generic/tty/tty.cpp b/src/add-ons/kernel/generic/tty/tty.cpp index e9b71d83ae..9318157656 100644 --- a/src/add-ons/kernel/generic/tty/tty.cpp +++ b/src/add-ons/kernel/generic/tty/tty.cpp @@ -1830,6 +1830,26 @@ tty_control(tty_cookie* cookie, uint32 op, void* buffer, size_t length) return B_OK; } + case TIOCOUTQ: + { + int toWrite = 0; + + // release the mutex and grab a write lock + locker.Unlock(); + WriterLocker writeLocker(cookie); + + status_t status = writeLocker.AcquireWriter(0, 1); + if (status == B_OK) + toWrite = line_buffer_readable(tty->input_buffer); + else if (status != B_WOULD_BLOCK) + return status; + + if (user_memcpy(buffer, &toWrite, sizeof(int)) != B_OK) + return B_BAD_ADDRESS; + + return B_OK; + } + case TCXONC: // Unix, but even Linux doesn't handle it //dprintf("tty: unsupported TCXONC\n"); break; diff --git a/src/bin/debug/strace/ioctl.cpp b/src/bin/debug/strace/ioctl.cpp index 5f0824f6a3..6bc4856b2b 100644 --- a/src/bin/debug/strace/ioctl.cpp +++ b/src/bin/debug/strace/ioctl.cpp @@ -136,6 +136,7 @@ static const ioctl_info kIOCtls[] = { IOCTL_INFO_ENTRY(TIOCCBRK), IOCTL_INFO_ENTRY(TIOCMBIS), IOCTL_INFO_ENTRY(TIOCMBIC), + IOCTL_INFO_ENTRY(TIOCOUTQ), // private termios IOCTL_INFO_ENTRY(B_IOCTL_GET_TTY_INDEX), IOCTL_INFO_ENTRY(B_IOCTL_GRANT_TTY),