summaryrefslogtreecommitdiffstats
path: root/lib/libcurses
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1994-10-03 12:58:05 +0000
committerache <ache@FreeBSD.org>1994-10-03 12:58:05 +0000
commit82086688f2212f11dc90fb9dd2cf531903dac59b (patch)
tree3699367f3b85ae3b79f16613498de97f9ad8203b /lib/libcurses
parent6af8c968d17bb9ac54b45ce0b88449750be06be1 (diff)
downloadFreeBSD-src-82086688f2212f11dc90fb9dd2cf531903dac59b.zip
FreeBSD-src-82086688f2212f11dc90fb9dd2cf531903dac59b.tar.gz
Disable direct ioctls to /dev/tty, search only stdin/stdout
and don't return error, if non-terminals. This fix allows curses to work into full duplex pipes under control of main program, like good old curses does.
Diffstat (limited to 'lib/libcurses')
-rw-r--r--lib/libcurses/tty.c39
1 files changed, 17 insertions, 22 deletions
diff --git a/lib/libcurses/tty.c b/lib/libcurses/tty.c
index 47826ba..f3db2aa 100644
--- a/lib/libcurses/tty.c
+++ b/lib/libcurses/tty.c
@@ -54,7 +54,7 @@ int __tcaction = 1; /* Ignore hardware settings. */
int __tcaction = 0;
#endif
-int __tty_fileno;
+int __tty_fileno, __noterm = 0;
struct termios __orig_termios, __baset;
static struct termios cbreakt, rawt, *curt;
static int useraw;
@@ -66,9 +66,6 @@ static int useraw;
#define OXTABS 0
#endif
#endif
-#ifndef _PATH_TTY
-#define _PATH_TTY "/dev/tty"
-#endif
/*
* gettmode --
@@ -79,12 +76,9 @@ gettmode()
{
useraw = 0;
- 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);
- }
+ if (tcgetattr(__tty_fileno = STDIN_FILENO, &__orig_termios))
+ if (tcgetattr(__tty_fileno = STDOUT_FILENO, &__orig_termios))
+ __noterm = 1;
__baset = __orig_termios;
__baset.c_oflag &= ~OXTABS;
@@ -124,8 +118,9 @@ gettmode()
}
curt = &__baset;
- return (tcsetattr(__tty_fileno, __tcaction ?
+ return (!__noterm && tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK);
+ return OK;
}
int
@@ -133,7 +128,7 @@ raw()
{
useraw = __pfast = __rawmode = 1;
curt = &rawt;
- return (tcsetattr(__tty_fileno, __tcaction ?
+ return (!__noterm && tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK);
}
@@ -142,7 +137,7 @@ noraw()
{
useraw = __pfast = __rawmode = 0;
curt = &__baset;
- return (tcsetattr(__tty_fileno, __tcaction ?
+ return (!__noterm && tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK);
}
@@ -152,7 +147,7 @@ cbreak()
__rawmode = 1;
curt = useraw ? &rawt : &cbreakt;
- return (tcsetattr(__tty_fileno, __tcaction ?
+ return (!__noterm && tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK);
}
@@ -162,7 +157,7 @@ nocbreak()
__rawmode = 0;
curt = useraw ? &rawt : &__baset;
- return (tcsetattr(__tty_fileno, __tcaction ?
+ return (!__noterm && tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK);
}
@@ -174,7 +169,7 @@ echo()
__baset.c_lflag |= ECHO;
__echoit = 1;
- return (tcsetattr(__tty_fileno, __tcaction ?
+ return (!__noterm && tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK);
}
@@ -186,7 +181,7 @@ noecho()
__baset.c_lflag &= ~ECHO;
__echoit = 0;
- return (tcsetattr(__tty_fileno, __tcaction ?
+ return (!__noterm && tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK);
}
@@ -201,7 +196,7 @@ nl()
__baset.c_oflag |= ONLCR;
__pfast = __rawmode;
- return (tcsetattr(__tty_fileno, __tcaction ?
+ return (!__noterm && tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK);
}
@@ -216,7 +211,7 @@ nonl()
__baset.c_oflag &= ~ONLCR;
__pfast = 1;
- return (tcsetattr(__tty_fileno, __tcaction ?
+ return (!__noterm && tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK);
}
@@ -267,7 +262,7 @@ endwin()
(void)fflush(stdout);
(void)setvbuf(stdout, NULL, _IOLBF, 0);
- return (tcsetattr(__tty_fileno, __tcaction ?
+ return (!__noterm && tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, &__orig_termios) ? ERR : OK);
}
@@ -280,12 +275,12 @@ static struct termios savedtty;
int
savetty()
{
- return (tcgetattr(__tty_fileno, &savedtty) ? ERR : OK);
+ return (!__noterm && tcgetattr(__tty_fileno, &savedtty) ? ERR : OK);
}
int
resetty()
{
- return (tcsetattr(__tty_fileno, __tcaction ?
+ return (!__noterm && tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, &savedtty) ? ERR : OK);
}
OpenPOWER on IntegriCloud