mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-25 22:18:07 +00:00 
			
		
		
		
	git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@555 65c4cc65-6c06-0410-ace0-fbb531ad65f3
		
			
				
	
	
		
			485 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			485 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /*	$NetBSD: tty.h,v 1.9 2002/03/18 16:01:01 christos Exp $	*/
 | |
| 
 | |
| /*-
 | |
|  * Copyright (c) 1992, 1993
 | |
|  *	The Regents of the University of California.  All rights reserved.
 | |
|  *
 | |
|  * This code is derived from software contributed to Berkeley by
 | |
|  * Christos Zoulas of Cornell University.
 | |
|  *
 | |
|  * Redistribution and use in source and binary forms, with or without
 | |
|  * modification, are permitted provided that the following conditions
 | |
|  * are met:
 | |
|  * 1. Redistributions of source code must retain the above copyright
 | |
|  *    notice, this list of conditions and the following disclaimer.
 | |
|  * 2. Redistributions in binary form must reproduce the above copyright
 | |
|  *    notice, this list of conditions and the following disclaimer in the
 | |
|  *    documentation and/or other materials provided with the distribution.
 | |
|  * 3. All advertising materials mentioning features or use of this software
 | |
|  *    must display the following acknowledgement:
 | |
|  *	This product includes software developed by the University of
 | |
|  *	California, Berkeley and its contributors.
 | |
|  * 4. Neither the name of the University nor the names of its contributors
 | |
|  *    may be used to endorse or promote products derived from this software
 | |
|  *    without specific prior written permission.
 | |
|  *
 | |
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | |
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | |
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | |
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | |
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | |
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | |
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | |
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | |
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | |
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | |
|  * SUCH DAMAGE.
 | |
|  *
 | |
|  *	@(#)tty.h	8.1 (Berkeley) 6/4/93
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * el.tty.h: Local terminal header
 | |
|  */
 | |
| #ifndef _h_el_tty
 | |
| #define	_h_el_tty
 | |
| 
 | |
| #include "histedit.h"
 | |
| #include <termios.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| /* Define our own since everyone gets it wrong! */
 | |
| #define	CONTROL(A)	((A) & 037)
 | |
| 
 | |
| /*
 | |
|  * Aix compatible names
 | |
|  */
 | |
| # if defined(VWERSE) && !defined(VWERASE)
 | |
| #  define VWERASE VWERSE
 | |
| # endif /* VWERSE && !VWERASE */
 | |
| 
 | |
| # if defined(VDISCRD) && !defined(VDISCARD)
 | |
| #  define VDISCARD VDISCRD
 | |
| # endif /* VDISCRD && !VDISCARD */
 | |
| 
 | |
| # if defined(VFLUSHO) && !defined(VDISCARD)
 | |
| #  define VDISCARD VFLUSHO
 | |
| # endif  /* VFLUSHO && VDISCARD */
 | |
| 
 | |
| # if defined(VSTRT) && !defined(VSTART)
 | |
| #  define VSTART VSTRT
 | |
| # endif /* VSTRT && ! VSTART */
 | |
| 
 | |
| # if defined(VSTAT) && !defined(VSTATUS)
 | |
| #  define VSTATUS VSTAT
 | |
| # endif /* VSTAT && ! VSTATUS */
 | |
| 
 | |
| # ifndef ONLRET
 | |
| #  define ONLRET 0
 | |
| # endif /* ONLRET */
 | |
| 
 | |
| # ifndef TAB3
 | |
| #  ifdef OXTABS
 | |
| #   define TAB3 OXTABS
 | |
| #  else
 | |
| #   define TAB3 0
 | |
| #  endif /* OXTABS */
 | |
| # endif /* !TAB3 */
 | |
| 
 | |
| # if defined(OXTABS) && !defined(XTABS)
 | |
| #  define XTABS OXTABS
 | |
| # endif /* OXTABS && !XTABS */
 | |
| 
 | |
| # ifndef ONLCR
 | |
| #  define ONLCR 0
 | |
| # endif /* ONLCR */
 | |
| 
 | |
| # ifndef IEXTEN
 | |
| #  define IEXTEN 0
 | |
| # endif /* IEXTEN */
 | |
| 
 | |
| # ifndef ECHOCTL
 | |
| #  define ECHOCTL 0
 | |
| # endif /* ECHOCTL */
 | |
| 
 | |
| # ifndef PARENB
 | |
| #  define PARENB 0
 | |
| # endif /* PARENB */
 | |
| 
 | |
| # ifndef EXTPROC
 | |
| #  define EXTPROC 0
 | |
| # endif /* EXTPROC */
 | |
| 
 | |
| # ifndef FLUSHO
 | |
| #  define FLUSHO  0
 | |
| # endif /* FLUSHO */
 | |
| 
 | |
| 
 | |
| # if defined(VDISABLE) && !defined(_POSIX_VDISABLE)
 | |
| #  define _POSIX_VDISABLE VDISABLE
 | |
| # endif /* VDISABLE && ! _POSIX_VDISABLE */
 | |
| 
 | |
| /*
 | |
|  * Work around ISC's definition of IEXTEN which is
 | |
|  * XCASE!
 | |
|  */
 | |
| # ifdef ISC
 | |
| #  if defined(IEXTEN) && defined(XCASE)
 | |
| #   if IEXTEN == XCASE
 | |
| #    undef IEXTEN
 | |
| #    define IEXTEN 0
 | |
| #   endif /* IEXTEN == XCASE */
 | |
| #  endif /* IEXTEN && XCASE */
 | |
| #  if defined(IEXTEN) && !defined(XCASE)
 | |
| #   define XCASE IEXTEN
 | |
| #   undef IEXTEN
 | |
| #   define IEXTEN 0
 | |
| #  endif /* IEXTEN && !XCASE */
 | |
| # endif /* ISC */
 | |
| 
 | |
| /*
 | |
|  * Work around convex weirdness where turning off IEXTEN makes us
 | |
|  * lose all postprocessing!
 | |
|  */
 | |
| #if defined(convex) || defined(__convex__)
 | |
| # if defined(IEXTEN) && IEXTEN != 0
 | |
| #  undef IEXTEN
 | |
| #  define IEXTEN 0
 | |
| # endif /* IEXTEN != 0 */
 | |
| #endif /* convex || __convex__ */
 | |
| 
 | |
| /*
 | |
|  * So that we don't lose job control.
 | |
|  */
 | |
| #ifdef __SVR4
 | |
| # undef CSWTCH
 | |
| #endif
 | |
| 
 | |
| #ifndef _POSIX_VDISABLE
 | |
| # define _POSIX_VDISABLE ((unsigned char) -1)
 | |
| #endif /* _POSIX_VDISABLE */
 | |
| 
 | |
| #if !defined(CREPRINT) && defined(CRPRNT)
 | |
| # define CREPRINT CRPRNT
 | |
| #endif /* !CREPRINT && CRPRNT */
 | |
| #if !defined(CDISCARD) && defined(CFLUSH)
 | |
| # define CDISCARD CFLUSH
 | |
| #endif /* !CDISCARD && CFLUSH */
 | |
| 
 | |
| #ifndef CINTR
 | |
| # define CINTR		CONTROL('c')
 | |
| #endif /* CINTR */
 | |
| #ifndef CQUIT
 | |
| # define CQUIT		034	/* ^\ */
 | |
| #endif /* CQUIT */
 | |
| #ifndef CERASE
 | |
| # define CERASE		0177	/* ^? */
 | |
| #endif /* CERASE */
 | |
| #ifndef CKILL
 | |
| # define CKILL		CONTROL('u')
 | |
| #endif /* CKILL */
 | |
| #ifndef CEOF
 | |
| # define CEOF		CONTROL('d')
 | |
| #endif /* CEOF */
 | |
| #ifndef CEOL
 | |
| # define CEOL		_POSIX_VDISABLE
 | |
| #endif /* CEOL */
 | |
| #ifndef CEOL2
 | |
| # define CEOL2		_POSIX_VDISABLE
 | |
| #endif /* CEOL2 */
 | |
| #ifndef CSWTCH
 | |
| # define CSWTCH		_POSIX_VDISABLE
 | |
| #endif /* CSWTCH */
 | |
| #ifndef CDSWTCH
 | |
| # define CDSWTCH	_POSIX_VDISABLE
 | |
| #endif /* CDSWTCH */
 | |
| #ifndef CERASE2
 | |
| # define CERASE2	_POSIX_VDISABLE
 | |
| #endif /* CERASE2 */
 | |
| #ifndef CSTART
 | |
| # define CSTART		CONTROL('q')
 | |
| #endif /* CSTART */
 | |
| #ifndef CSTOP
 | |
| # define CSTOP		CONTROL('s')
 | |
| #endif /* CSTOP */
 | |
| #ifndef CSUSP
 | |
| # define CSUSP		CONTROL('z')
 | |
| #endif /* CSUSP */
 | |
| #ifndef CDSUSP
 | |
| # define CDSUSP		CONTROL('y')
 | |
| #endif /* CDSUSP */
 | |
| 
 | |
| #ifdef hpux
 | |
| 
 | |
| # ifndef CREPRINT
 | |
| #  define CREPRINT	_POSIX_VDISABLE
 | |
| # endif /* CREPRINT */
 | |
| # ifndef CDISCARD
 | |
| #  define CDISCARD	_POSIX_VDISABLE
 | |
| # endif /* CDISCARD */
 | |
| # ifndef CLNEXT
 | |
| #  define CLNEXT	_POSIX_VDISABLE
 | |
| # endif /* CLNEXT */
 | |
| # ifndef CWERASE
 | |
| #  define CWERASE	_POSIX_VDISABLE
 | |
| # endif /* CWERASE */
 | |
| 
 | |
| #else /* !hpux */
 | |
| 
 | |
| # ifndef CREPRINT
 | |
| #  define CREPRINT	CONTROL('r')
 | |
| # endif /* CREPRINT */
 | |
| # ifndef CDISCARD
 | |
| #  define CDISCARD	CONTROL('o')
 | |
| # endif /* CDISCARD */
 | |
| # ifndef CLNEXT
 | |
| #  define CLNEXT	CONTROL('v')
 | |
| # endif /* CLNEXT */
 | |
| # ifndef CWERASE
 | |
| #  define CWERASE	CONTROL('w')
 | |
| # endif /* CWERASE */
 | |
| 
 | |
| #endif /* hpux */
 | |
| 
 | |
| #ifndef CSTATUS
 | |
| # define CSTATUS	CONTROL('t')
 | |
| #endif /* CSTATUS */
 | |
| #ifndef CPAGE
 | |
| # define CPAGE		' '
 | |
| #endif /* CPAGE */
 | |
| #ifndef CPGOFF
 | |
| # define CPGOFF		CONTROL('m')
 | |
| #endif /* CPGOFF */
 | |
| #ifndef CKILL2
 | |
| # define CKILL2		_POSIX_VDISABLE
 | |
| #endif /* CKILL2 */
 | |
| #ifndef CBRK
 | |
| # ifndef masscomp
 | |
| #  define CBRK		0377
 | |
| # else
 | |
| #  define CBRK		'\0'
 | |
| # endif /* masscomp */
 | |
| #endif /* CBRK */
 | |
| #ifndef CMIN
 | |
| # define CMIN		CEOF
 | |
| #endif /* CMIN */
 | |
| #ifndef CTIME
 | |
| # define CTIME		CEOL
 | |
| #endif /* CTIME */
 | |
| 
 | |
| /*
 | |
|  * Fix for sun inconsistency. On termio VSUSP and the rest of the
 | |
|  * ttychars > NCC are defined. So we undefine them.
 | |
|  */
 | |
| #if defined(TERMIO) || defined(POSIX)
 | |
| # if defined(POSIX) && defined(NCCS)
 | |
| #  define NUMCC		NCCS
 | |
| # else
 | |
| #  ifdef NCC
 | |
| #   define NUMCC	NCC
 | |
| #  endif /* NCC */
 | |
| # endif /* POSIX && NCCS */
 | |
| # ifdef NUMCC
 | |
| #  ifdef VINTR
 | |
| #   if NUMCC <= VINTR
 | |
| #    undef VINTR
 | |
| #   endif /* NUMCC <= VINTR */
 | |
| #  endif /* VINTR */
 | |
| #  ifdef VQUIT
 | |
| #   if NUMCC <= VQUIT
 | |
| #    undef VQUIT
 | |
| #   endif /* NUMCC <= VQUIT */
 | |
| #  endif /* VQUIT */
 | |
| #  ifdef VERASE
 | |
| #   if NUMCC <= VERASE
 | |
| #    undef VERASE
 | |
| #   endif /* NUMCC <= VERASE */
 | |
| #  endif /* VERASE */
 | |
| #  ifdef VKILL
 | |
| #   if NUMCC <= VKILL
 | |
| #    undef VKILL
 | |
| #   endif /* NUMCC <= VKILL */
 | |
| #  endif /* VKILL */
 | |
| #  ifdef VEOF
 | |
| #   if NUMCC <= VEOF
 | |
| #    undef VEOF
 | |
| #   endif /* NUMCC <= VEOF */
 | |
| #  endif /* VEOF */
 | |
| #  ifdef VEOL
 | |
| #   if NUMCC <= VEOL
 | |
| #    undef VEOL
 | |
| #   endif /* NUMCC <= VEOL */
 | |
| #  endif /* VEOL */
 | |
| #  ifdef VEOL2
 | |
| #   if NUMCC <= VEOL2
 | |
| #    undef VEOL2
 | |
| #   endif /* NUMCC <= VEOL2 */
 | |
| #  endif /* VEOL2 */
 | |
| #  ifdef VSWTCH
 | |
| #   if NUMCC <= VSWTCH
 | |
| #    undef VSWTCH
 | |
| #   endif /* NUMCC <= VSWTCH */
 | |
| #  endif /* VSWTCH */
 | |
| #  ifdef VDSWTCH
 | |
| #   if NUMCC <= VDSWTCH
 | |
| #    undef VDSWTCH
 | |
| #   endif /* NUMCC <= VDSWTCH */
 | |
| #  endif /* VDSWTCH */
 | |
| #  ifdef VERASE2
 | |
| #   if NUMCC <= VERASE2
 | |
| #    undef VERASE2
 | |
| #   endif /* NUMCC <= VERASE2 */
 | |
| #  endif /* VERASE2 */
 | |
| #  ifdef VSTART
 | |
| #   if NUMCC <= VSTART
 | |
| #    undef VSTART
 | |
| #   endif /* NUMCC <= VSTART */
 | |
| #  endif /* VSTART */
 | |
| #  ifdef VSTOP
 | |
| #   if NUMCC <= VSTOP
 | |
| #    undef VSTOP
 | |
| #   endif /* NUMCC <= VSTOP */
 | |
| #  endif /* VSTOP */
 | |
| #  ifdef VWERASE
 | |
| #   if NUMCC <= VWERASE
 | |
| #    undef VWERASE
 | |
| #   endif /* NUMCC <= VWERASE */
 | |
| #  endif /* VWERASE */
 | |
| #  ifdef VSUSP
 | |
| #   if NUMCC <= VSUSP
 | |
| #    undef VSUSP
 | |
| #   endif /* NUMCC <= VSUSP */
 | |
| #  endif /* VSUSP */
 | |
| #  ifdef VDSUSP
 | |
| #   if NUMCC <= VDSUSP
 | |
| #    undef VDSUSP
 | |
| #   endif /* NUMCC <= VDSUSP */
 | |
| #  endif /* VDSUSP */
 | |
| #  ifdef VREPRINT
 | |
| #   if NUMCC <= VREPRINT
 | |
| #    undef VREPRINT
 | |
| #   endif /* NUMCC <= VREPRINT */
 | |
| #  endif /* VREPRINT */
 | |
| #  ifdef VDISCARD
 | |
| #   if NUMCC <= VDISCARD
 | |
| #    undef VDISCARD
 | |
| #   endif /* NUMCC <= VDISCARD */
 | |
| #  endif /* VDISCARD */
 | |
| #  ifdef VLNEXT
 | |
| #   if NUMCC <= VLNEXT
 | |
| #    undef VLNEXT
 | |
| #   endif /* NUMCC <= VLNEXT */
 | |
| #  endif /* VLNEXT */
 | |
| #  ifdef VSTATUS
 | |
| #   if NUMCC <= VSTATUS
 | |
| #    undef VSTATUS
 | |
| #   endif /* NUMCC <= VSTATUS */
 | |
| #  endif /* VSTATUS */
 | |
| #  ifdef VPAGE
 | |
| #   if NUMCC <= VPAGE
 | |
| #    undef VPAGE
 | |
| #   endif /* NUMCC <= VPAGE */
 | |
| #  endif /* VPAGE */
 | |
| #  ifdef VPGOFF
 | |
| #   if NUMCC <= VPGOFF
 | |
| #    undef VPGOFF
 | |
| #   endif /* NUMCC <= VPGOFF */
 | |
| #  endif /* VPGOFF */
 | |
| #  ifdef VKILL2
 | |
| #   if NUMCC <= VKILL2
 | |
| #    undef VKILL2
 | |
| #   endif /* NUMCC <= VKILL2 */
 | |
| #  endif /* VKILL2 */
 | |
| #  ifdef VBRK
 | |
| #   if NUMCC <= VBRK
 | |
| #    undef VBRK
 | |
| #   endif /* NUMCC <= VBRK */
 | |
| #  endif /* VBRK */
 | |
| #  ifdef VMIN
 | |
| #   if NUMCC <= VMIN
 | |
| #    undef VMIN
 | |
| #   endif /* NUMCC <= VMIN */
 | |
| #  endif /* VMIN */
 | |
| #  ifdef VTIME
 | |
| #   if NUMCC <= VTIME
 | |
| #    undef VTIME
 | |
| #   endif /* NUMCC <= VTIME */
 | |
| #  endif /* VTIME */
 | |
| # endif /* NUMCC */
 | |
| #endif /* !POSIX */
 | |
| 
 | |
| #define	C_INTR		 0
 | |
| #define	C_QUIT		 1
 | |
| #define	C_ERASE		 2
 | |
| #define	C_KILL		 3
 | |
| #define	C_EOF		 4
 | |
| #define	C_EOL		 5
 | |
| #define	C_EOL2		 6
 | |
| #define	C_SWTCH		 7
 | |
| #define	C_DSWTCH	 8
 | |
| #define	C_ERASE2	 9
 | |
| #define	C_START		10
 | |
| #define	C_STOP		11
 | |
| #define	C_WERASE	12
 | |
| #define	C_SUSP		13
 | |
| #define	C_DSUSP		14
 | |
| #define	C_REPRINT	15
 | |
| #define	C_DISCARD	16
 | |
| #define	C_LNEXT		17
 | |
| #define	C_STATUS	18
 | |
| #define	C_PAGE		19
 | |
| #define	C_PGOFF		20
 | |
| #define	C_KILL2		21
 | |
| #define	C_BRK		22
 | |
| #define	C_MIN		23
 | |
| #define	C_TIME		24
 | |
| #define	C_NCC		25
 | |
| #define	C_SH(A)		(1 << (A))
 | |
| 
 | |
| /*
 | |
|  * Terminal dependend data structures
 | |
|  */
 | |
| #define	EX_IO	0	/* while we are executing	*/
 | |
| #define	ED_IO	1	/* while we are editing		*/
 | |
| #define	TS_IO	2	/* new mode from terminal	*/
 | |
| #define	QU_IO	2	/* used only for quoted chars	*/
 | |
| #define	NN_IO	3	/* The number of entries	*/
 | |
| 
 | |
| #define	MD_INP	0
 | |
| #define	MD_OUT	1
 | |
| #define	MD_CTL	2
 | |
| #define	MD_LIN	3
 | |
| #define	MD_CHAR	4
 | |
| #define	MD_NN	5
 | |
| 
 | |
| typedef struct {
 | |
| 	const char	*t_name;
 | |
| 	u_int	 t_setmask;
 | |
| 	u_int	 t_clrmask;
 | |
| } ttyperm_t[NN_IO][MD_NN];
 | |
| 
 | |
| typedef unsigned char ttychar_t[NN_IO][C_NCC];
 | |
| 
 | |
| protected int	tty_init(EditLine *);
 | |
| protected void	tty_end(EditLine *);
 | |
| protected int	tty_stty(EditLine *, int, const char **);
 | |
| protected int	tty_rawmode(EditLine *);
 | |
| protected int	tty_cookedmode(EditLine *);
 | |
| protected int	tty_quotemode(EditLine *);
 | |
| protected int	tty_noquotemode(EditLine *);
 | |
| protected void	tty_bind_char(EditLine *, int);
 | |
| 
 | |
| typedef struct {
 | |
|     ttyperm_t t_t;
 | |
|     ttychar_t t_c;
 | |
|     struct termios t_ex, t_ed, t_ts;
 | |
|     int t_tabs;
 | |
|     int t_eight;
 | |
|     speed_t t_speed;
 | |
|     int t_mode;
 | |
|     unsigned char t_vdisable;
 | |
| } el_tty_t;
 | |
| 
 | |
| 
 | |
| #endif /* _h_el_tty */
 |