reopen /dev/tty as stdin and stderr at interaction time - iomenu - interactive terminal-based selection menu
(HTM) git clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
(DIR) LICENSE
---
(DIR) commit 1035fe68e4071585215a146fd1d31a914534c89d
(DIR) parent 99385dc242897b4bb94f0ab0c402bcbb7bea6b9f
(HTM) Author: Josuah Demangeonā ā µ <mail@josuah.net>
Date: Thu, 30 Mar 2017 22:54:50 +0200
reopen /dev/tty as stdin and stderr at interaction time
Diffstat:
M iomenu.c | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
---
(DIR) diff --git a/iomenu.c b/iomenu.c
@@ -21,7 +21,6 @@
static struct winsize ws;
static struct termios termios;
-FILE *tty_fp = NULL;
int tty_fd;
static int current = 0, offset = 0, prev = 0, next = 0;
@@ -48,8 +47,7 @@ static void
die(const char *s)
{
tcsetattr(tty_fd, TCSANOW, &termios);
- fclose(tty_fp);
- close(tty_fd);
+ close(tty_fd);
free_all();
perror(s);
exit(EXIT_FAILURE);
@@ -337,7 +335,7 @@ print_selection(void)
static int
input_key(void)
{
- wchar_t key = fgetwc(tty_fp);
+ wchar_t key = fgetwc(stdin);
switch (key) {
@@ -401,8 +399,6 @@ input_get(void)
input[0] = '\0';
- set_terminal();
-
while ((exit_code = input_key()) == CONTINUE)
print_screen();
@@ -443,16 +439,18 @@ main(int argc, char *argv[])
setlocale(LC_ALL, "");
read_lines();
- tty_fp = fopen("/dev/tty", "r");
+ if (!freopen("/dev/tty", "r", stdin) || !freopen("/dev/tty", "w", stderr))
+ die("freopen");
tty_fd = open("/dev/tty", O_RDWR);
+ set_terminal();
+
print_screen();
exit_code = input_get();
tcsetattr(tty_fd, TCSANOW, &termios);
clear(opt_l);
- fclose(tty_fp);
- close(tty_fd);
+ close(tty_fd);
free_all();
return exit_code;