+static struct termios g_kbd_termios_saved;
+static int g_kbdfd;
+
+static void hidecon_start(void)
+{
+ struct termios kbd_termios;
+ FILE *tios_f;
+ int mode;
+
+ g_kbdfd = open("/dev/tty", O_RDWR);
+ if (g_kbdfd == -1) {
+ perror(PFX "open /dev/tty");
+ return;
+ }
+
+ if (ioctl(g_kbdfd, KDGETMODE, &mode) == -1) {
+ perror(PFX "(not hiding FB): KDGETMODE");
+ goto fail;
+ }
+
+ if (tcgetattr(g_kbdfd, &kbd_termios) == -1) {
+ perror(PFX "tcgetattr");
+ goto fail;
+ }
+
+ /* dump for picorestore */
+ g_kbd_termios_saved = kbd_termios;
+ tios_f = fopen(TERMIOS_DUMP_FILE, "wb");
+ if (tios_f) {
+ fwrite(&kbd_termios, sizeof(kbd_termios), 1, tios_f);
+ fclose(tios_f);
+ }
+
+ kbd_termios.c_lflag &= ~(ICANON | ECHO); // | ISIG);
+ kbd_termios.c_iflag &= ~(ISTRIP | IGNCR | ICRNL | INLCR | IXOFF | IXON);
+ kbd_termios.c_cc[VMIN] = 0;
+ kbd_termios.c_cc[VTIME] = 0;
+
+ if (tcsetattr(g_kbdfd, TCSAFLUSH, &kbd_termios) == -1) {
+ perror(PFX "tcsetattr");
+ goto fail;
+ }
+
+ if (ioctl(g_kbdfd, KDSETMODE, KD_GRAPHICS) == -1) {
+ perror(PFX "KDSETMODE KD_GRAPHICS");
+ tcsetattr(g_kbdfd, TCSAFLUSH, &g_kbd_termios_saved);
+ goto fail;
+ }
+
+ return;
+
+fail:
+ close(g_kbdfd);
+ g_kbdfd = -1;
+}
+
+static void hidecon_end(void)
+{
+ if (g_kbdfd < 0)
+ return;
+
+ if (ioctl(g_kbdfd, KDSETMODE, KD_TEXT) == -1)
+ perror(PFX "KDSETMODE KD_TEXT");
+
+ if (tcsetattr(g_kbdfd, TCSAFLUSH, &g_kbd_termios_saved) == -1)
+ perror(PFX "tcsetattr");
+
+ remove(TERMIOS_DUMP_FILE);
+
+ close(g_kbdfd);
+ g_kbdfd = -1;
+}
+
+int oshide_init(void)