1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1982-2012 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                 Eclipse Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *          http://www.eclipse.org/org/documents/epl-v10.html           *
11 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12 *                                                                      *
13 *              Information and Software Systems Research               *
14 *                            AT&T Research                             *
15 *                           Florham Park NJ                            *
16 *                                                                      *
17 *                  David Korn <dgk@research.att.com>                   *
18 *                                                                      *
19 ***********************************************************************/
20 #pragma prototyped
21 
22 #ifndef _terminal_
23 #define _terminal_	1
24 
25 #include	"FEATURE/ttys"
26 /*
27  * terminal interface
28  * complicated by the fact that there are so many variations
29  * This will use POSIX <termios.h> interface where available
30  */
31 
32 #ifdef _hdr_termios
33 #   include	<termios.h>
34 #   if __sgi__ || sgi	/* special hack to eliminate ^M problem */
35 #	ifndef ECHOCTL
36 #	    define ECHOCTL	ECHOE
37 #	endif /* ECHOCTL */
38 #	ifndef CNSUSP
39 #	    define CNSUSP	CNSWTCH
40 #	endif /* CNSUSP */
41 #   endif /* sgi */
42 #   ifdef _NEXT_SOURCE
43 #	define _lib_tcgetattr	1
44 #	define _lib_tcgetpgrp	1
45 #   endif /* _NEXT_SOURCE */
46 #else
47 #   if defined(_sys_termios) && defined(_lib_tcgetattr)
48 #	include	<sys/termios.h>
49 #	define _hdr_termios
50 #   else
51 #	undef _sys_termios
52 #   endif /* _sys_termios */
53 #endif /* _hdr_termios */
54 
55 #ifdef _hdr_termios
56 #   undef _hdr_sgtty
57 #   undef tcgetattr
58 #   undef tcsetattr
59 #   undef tcgetpgrp
60 #   undef tcsetpgrp
61 #   undef cfgetospeed
62 #   ifndef TCSANOW
63 #	define TCSANOW		TCSETS
64 #	define TCSADRAIN	TCSETSW
65 #	define TCSAFLUSH	TCSETSF
66 #   endif /* TCSANOW */
67     /* The following corrects bugs in some implementations */
68 #   if defined(TCSADFLUSH) && !defined(TCSAFLUSH)
69 #	define TCSAFLUSH	TCSADFLUSH
70 #   endif /* TCSADFLUSH */
71 #   ifndef _lib_tcgetattr
72 #	undef  tcgetattr
73 #	define tcgetattr(fd,tty)	ioctl(fd, TCGETS, tty)
74 #	undef  tcsetattr
75 #	define tcsetattr(fd,action,tty)	ioctl(fd, action, tty)
76 #	undef  cfgetospeed
77 #	define cfgetospeed(tp)		((tp)->c_cflag & CBAUD)
78 #   endif /* _lib_tcgetattr */
79 #   undef TIOCGETC
80 #   if SHOPT_OLDTERMIO  /* use both termios and termio */
81 #	ifdef _hdr_termio
82 #	    include	<termio.h>
83 #	else
84 #	    ifdef _sys_termio
85 #		include	<sys/termio.h>
86 #		define _hdr_termio 1
87 #	    else
88 #		undef SHOPT_OLDTERMIO
89 #	    endif /* _sys_termio */
90 #	endif /* _hdr_termio */
91 #   endif /* SHOPT_OLDTERMIO */
92 #else
93 #   define cfgetospeed(tp)	((tp)->c_cflag & CBAUD)
94 #   undef SHOPT_OLDTERMIO
95 #   ifdef _hdr_termio
96 #	include	<termio.h>
97 #   else
98 #	ifdef _sys_termio
99 #	    include	<sys/termio.h>
100 #	    define _hdr_termio 1
101 #	endif /* _sys_termio */
102 #   endif /* _hdr_termio */
103 #   ifdef _hdr_termio
104 #	define termios termio
105 #	undef TIOCGETC
106 #	define tcgetattr(fd,tty)		ioctl(fd, TCGETA, tty)
107 #	define tcsetattr(fd,action,tty)	ioctl(fd, action, tty)
108 
109 #	ifdef _sys_bsdtty
110 #	   include	<sys/bsdtty.h>
111 #	endif /* _sys_bsdtty */
112 #   else
113 #	ifdef _hdr_sgtty
114 #	    include	<sgtty.h>
115 #	    ifndef LPENDIN
116 #	        ifdef _sys_nttyio
117 #		    include	<sys/nttyio.h>
118 #	        endif /* _sys_nttyio */
119 #	    endif /* LPENDIN */
120 #	    define termios sgttyb
121 #	    ifdef TIOCSETN
122 #	 	undef TCSETAW
123 #	    endif /* TIOCSETN */
124 #	    ifdef TIOCGETP
125 #		define tcgetattr(fd,tty)		ioctl(fd, TIOCGETP, tty)
126 #		define tcsetattr(fd,action,tty)	ioctl(fd, action, tty)
127 #	    else
128 #		define tcgetattr(fd,tty)	gtty(fd, tty)
129 #		define tcsetattr(fd,action,tty)	stty(fd, tty)
130 #	    endif /* TIOCGETP */
131 #	endif /* _hdr_sgtty */
132 #   endif /* hdr_termio */
133 
134 #   ifndef TCSANOW
135 #	ifdef TCSETAW
136 #	    define TCSANOW	TCSETA
137 #	    ifdef u370
138 	    /* delays are too long, don't wait for output to drain */
139 #		define TCSADRAIN	TCSETA
140 #	    else
141 #		define TCSADRAIN	TCSETAW
142 #	    endif /* u370 */
143 #	    define TCSAFLUSH	TCSETAF
144 #	else
145 #	    ifdef TIOCSETN
146 #		define TCSANOW	TIOCSETN
147 #		define TCSADRAIN	TIOCSETN
148 #		define TCSAFLUSH	TIOCSETP
149 #	    endif /* TIOCSETN */
150 #	endif /* TCSETAW */
151 #   endif /* TCSANOW */
152 #endif /* _hdr_termios */
153 
154 /* set ECHOCTL if driver can echo control charaters as ^c */
155 #ifdef LCTLECH
156 #   ifndef ECHOCTL
157 #	define ECHOCTL	LCTLECH
158 #   endif /* !ECHOCTL */
159 #endif /* LCTLECH */
160 #ifdef LNEW_CTLECH
161 #   ifndef ECHOCTL
162 #	define ECHOCTL  LNEW_CTLECH
163 #   endif /* !ECHOCTL */
164 #endif /* LNEW_CTLECH */
165 #ifdef LNEW_PENDIN
166 #   ifndef PENDIN
167 #	define PENDIN LNEW_PENDIN
168 #  endif /* !PENDIN */
169 #endif /* LNEW_PENDIN */
170 #ifndef ECHOCTL
171 #   ifndef VEOL
172 #	define RAWONLY	1
173 #   endif /* !VEOL */
174 #endif /* !ECHOCTL */
175 
176 #ifdef _sys_filio
177 #   ifndef FIONREAD
178 #	include	<sys/filio.h>
179 #   endif /* FIONREAD */
180 #endif /* _sys_filio */
181 /* set FIORDCHK if you can check for characters in input queue */
182 #ifdef FIONREAD
183 #   ifndef FIORDCHK
184 #	define FIORDCHK	FIONREAD
185 #   endif /* !FIORDCHK */
186 #endif /* FIONREAD */
187 
188 extern int	tty_alt(int);
189 extern void	tty_cooked(int);
190 extern int	tty_get(int,struct termios*);
191 extern int	tty_raw(int,int);
192 extern int	tty_check(int);
193 extern int	tty_set(int, int, struct termios*);
194 extern int	sh_ioctl(int,int,void*,int);
195 #define ioctl(a,b,c)	sh_ioctl(a,b,c,sizeof(c))
196 #ifdef _lib_tcgetattr
197     extern int	sh_tcgetattr(int,struct termios*);
198     extern int	sh_tcsetattr(int,int,struct termios*);
199 #   define tcgetattr(a,b)	sh_tcgetattr(a,b)
200 #   define tcsetattr(a,b,c)	sh_tcsetattr(a,b,c)
201 #endif
202 
203 #endif /* _terminal_ */
204