diff options
Diffstat (limited to 'lib/libcurses/tty.c')
-rw-r--r-- | lib/libcurses/tty.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/lib/libcurses/tty.c b/lib/libcurses/tty.c index d0345bfba9937..3f9eabdb3a989 100644 --- a/lib/libcurses/tty.c +++ b/lib/libcurses/tty.c @@ -36,10 +36,12 @@ static char sccsid[] = "@(#)tty.c 8.2 (Berkeley) 1/2/94"; #endif /* not lint */ #include <sys/ioctl.h> +#include <sys/file.h> #include <curses.h> #include <termios.h> #include <unistd.h> +#include <paths.h> /* * In general, curses should leave tty hardware settings alone (speed, parity, @@ -54,6 +56,7 @@ int __tcaction = 1; /* Ignore hardware settings. */ int __tcaction = 0; #endif +int __tty_fileno; struct termios __orig_termios, __baset; static struct termios cbreakt, rawt, *curt; static int useraw; @@ -75,8 +78,12 @@ gettmode() { useraw = 0; - if (tcgetattr(STDIN_FILENO, &__orig_termios)) - return (ERR); + if (tcgetattr(__tty_fileno = STDIN_FILENO, &__orig_termios)) { + if ((__tty_fileno = open(_PATH_TTY, O_RDONLY, 0)) < 0) + return (ERR); + else if (tcgetattr(__tty_fileno, &__orig_termios)) + return (ERR); + } __baset = __orig_termios; __baset.c_oflag &= ~OXTABS; @@ -116,7 +123,7 @@ gettmode() } curt = &__baset; - return (tcsetattr(STDIN_FILENO, __tcaction ? + return (tcsetattr(__tty_fileno, __tcaction ? TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK); } @@ -125,7 +132,7 @@ raw() { useraw = __pfast = __rawmode = 1; curt = &rawt; - return (tcsetattr(STDIN_FILENO, __tcaction ? + return (tcsetattr(__tty_fileno, __tcaction ? TCSASOFT | TCSADRAIN : TCSADRAIN, curt)); } @@ -134,7 +141,7 @@ noraw() { useraw = __pfast = __rawmode = 0; curt = &__baset; - return (tcsetattr(STDIN_FILENO, __tcaction ? + return (tcsetattr(__tty_fileno, __tcaction ? TCSASOFT | TCSADRAIN : TCSADRAIN, curt)); } @@ -144,7 +151,7 @@ cbreak() __rawmode = 1; curt = useraw ? &rawt : &cbreakt; - return (tcsetattr(STDIN_FILENO, __tcaction ? + return (tcsetattr(__tty_fileno, __tcaction ? TCSASOFT | TCSADRAIN : TCSADRAIN, curt)); } @@ -154,7 +161,7 @@ nocbreak() __rawmode = 0; curt = useraw ? &rawt : &__baset; - return (tcsetattr(STDIN_FILENO, __tcaction ? + return (tcsetattr(__tty_fileno, __tcaction ? TCSASOFT | TCSADRAIN : TCSADRAIN, curt)); } @@ -166,7 +173,7 @@ echo() __baset.c_lflag |= ECHO; __echoit = 1; - return (tcsetattr(STDIN_FILENO, __tcaction ? + return (tcsetattr(__tty_fileno, __tcaction ? TCSASOFT | TCSADRAIN : TCSADRAIN, curt)); } @@ -178,7 +185,7 @@ noecho() __baset.c_lflag &= ~ECHO; __echoit = 0; - return (tcsetattr(STDIN_FILENO, __tcaction ? + return (tcsetattr(__tty_fileno, __tcaction ? TCSASOFT | TCSADRAIN : TCSADRAIN, curt)); } @@ -193,7 +200,7 @@ nl() __baset.c_oflag |= ONLCR; __pfast = __rawmode; - return (tcsetattr(STDIN_FILENO, __tcaction ? + return (tcsetattr(__tty_fileno, __tcaction ? TCSASOFT | TCSADRAIN : TCSADRAIN, curt)); } @@ -208,7 +215,7 @@ nonl() __baset.c_oflag &= ~ONLCR; __pfast = 1; - return (tcsetattr(STDIN_FILENO, __tcaction ? + return (tcsetattr(__tty_fileno, __tcaction ? TCSASOFT | TCSADRAIN : TCSADRAIN, curt)); } @@ -216,9 +223,9 @@ void __set_scroll_region(top, bot) int top, bot; { - tputs(SC, 0, __cputchar); - tputs(tgoto(CS, bot, top), 0, __cputchar); - tputs(RC, 0, __cputchar); + tputs(SC, 1, __cputchar); + tputs(tgoto(CS, bot, top), 1, __cputchar); + tputs(RC, 1, __cputchar); } void @@ -253,7 +260,7 @@ endwin() (void)fflush(stdout); (void)setvbuf(stdout, NULL, _IOLBF, 0); - return (tcsetattr(STDIN_FILENO, __tcaction ? + return (tcsetattr(__tty_fileno, __tcaction ? TCSASOFT | TCSADRAIN : TCSADRAIN, &__orig_termios)); } @@ -266,12 +273,12 @@ static struct termios savedtty; int savetty() { - return (tcgetattr(STDIN_FILENO, &savedtty)); + return (tcgetattr(__tty_fileno, &savedtty)); } int resetty() { - return (tcsetattr(STDIN_FILENO, __tcaction ? + return (tcsetattr(__tty_fileno, __tcaction ? TCSASOFT | TCSADRAIN : TCSADRAIN, &savedtty)); } |