bool linux_terminal_disable_input(void) { struct sigaction sa = {{0}}; /* Avoid accidentally typing stuff. */ if (!isatty(0)) return false; if (!linux_terminal_init()) return false; if (ioctl(0, KDSKBMODE, K_MEDIUMRAW) < 0) { linux_terminal_flush(); return false; } sa.sa_handler = linux_terminal_restore_signal; sa.sa_flags = SA_RESTART | SA_RESETHAND; sigemptyset(&sa.sa_mask); /* Trap some standard termination codes so we * can restore the keyboard before we lose control. */ sigaction(SIGABRT, &sa, NULL); sigaction(SIGBUS, &sa, NULL); sigaction(SIGFPE, &sa, NULL); sigaction(SIGILL, &sa, NULL); sigaction(SIGQUIT, &sa, NULL); sigaction(SIGSEGV, &sa, NULL); atexit(linux_terminal_restore_input); return true; }
void linux_terminal_restore_input(void) { if (oldKbmd == 0xffff) return; ioctl(0, KDSKBMODE, oldKbmd); linux_terminal_flush(); oldKbmd = 0xffff; linux_stdin_claimed = false; }