1*4887Schin /***********************************************************************
2*4887Schin *                                                                      *
3*4887Schin *               This software is part of the ast package               *
4*4887Schin *           Copyright (c) 1982-2007 AT&T Knowledge Ventures            *
5*4887Schin *                      and is licensed under the                       *
6*4887Schin *                  Common Public License, Version 1.0                  *
7*4887Schin *                      by AT&T Knowledge Ventures                      *
8*4887Schin *                                                                      *
9*4887Schin *                A copy of the License is available at                 *
10*4887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
11*4887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12*4887Schin *                                                                      *
13*4887Schin *              Information and Software Systems Research               *
14*4887Schin *                            AT&T Research                             *
15*4887Schin *                           Florham Park NJ                            *
16*4887Schin *                                                                      *
17*4887Schin *                  David Korn <dgk@research.att.com>                   *
18*4887Schin *                                                                      *
19*4887Schin ***********************************************************************/
20*4887Schin #pragma prototyped
21*4887Schin #ifndef SH_INTERACTIVE
22*4887Schin /*
23*4887Schin  * David Korn
24*4887Schin  * AT&T Labs
25*4887Schin  *
26*4887Schin  * Interface definitions for shell command language
27*4887Schin  *
28*4887Schin  */
29*4887Schin 
30*4887Schin #include	<cmd.h>
31*4887Schin #include	<cdt.h>
32*4887Schin #ifdef _SH_PRIVATE
33*4887Schin #   include	"name.h"
34*4887Schin #else
35*4887Schin #   include	<nval.h>
36*4887Schin #endif /* _SH_PRIVATE */
37*4887Schin 
38*4887Schin #define SH_VERSION	20060510
39*4887Schin 
40*4887Schin #undef NOT_USED
41*4887Schin #define NOT_USED(x)	(&x,1)
42*4887Schin 
43*4887Schin /* options */
44*4887Schin typedef struct
45*4887Schin {
46*4887Schin 	unsigned long v[4];
47*4887Schin }
48*4887Schin Shopt_t;
49*4887Schin 
50*4887Schin typedef void	(*Shinit_f)(int);
51*4887Schin typedef int     (*Shbltin_f)(int, char*[], void*);
52*4887Schin typedef int	(*Shwait_f)(int, long, int);
53*4887Schin 
54*4887Schin union Shnode_u;
55*4887Schin typedef union Shnode_u Shnode_t;
56*4887Schin 
57*4887Schin #define SH_CFLAG	0
58*4887Schin #define SH_HISTORY	1	/* used also as a state */
59*4887Schin #define	SH_ERREXIT	2	/* used also as a state */
60*4887Schin #define	SH_VERBOSE	3	/* used also as a state */
61*4887Schin #define SH_MONITOR	4	/* used also as a state */
62*4887Schin #define	SH_INTERACTIVE	5	/* used also as a state */
63*4887Schin #define	SH_RESTRICTED	6
64*4887Schin #define	SH_XTRACE	7
65*4887Schin #define	SH_KEYWORD	8
66*4887Schin #define SH_NOUNSET	9
67*4887Schin #define SH_NOGLOB	10
68*4887Schin #define SH_ALLEXPORT	11
69*4887Schin #define SH_PFSH		12
70*4887Schin #define SH_IGNOREEOF	13
71*4887Schin #define SH_NOCLOBBER	14
72*4887Schin #define SH_MARKDIRS	15
73*4887Schin #define SH_BGNICE	16
74*4887Schin #define SH_VI		17
75*4887Schin #define SH_VIRAW	18
76*4887Schin #define	SH_TFLAG	19
77*4887Schin #define SH_TRACKALL	20
78*4887Schin #define	SH_SFLAG	21
79*4887Schin #define	SH_NOEXEC	22
80*4887Schin #define SH_GMACS	24
81*4887Schin #define SH_EMACS	25
82*4887Schin #define SH_PRIVILEGED	26
83*4887Schin #define SH_SUBSHARE	27	/* subshell shares state with parent */
84*4887Schin #define SH_NOLOG	28
85*4887Schin #define SH_NOTIFY	29
86*4887Schin #define SH_DICTIONARY	30
87*4887Schin #define SH_PIPEFAIL	32
88*4887Schin #define SH_GLOBSTARS	33
89*4887Schin #define SH_XARGS	34
90*4887Schin #define SH_RC		35
91*4887Schin #define SH_SHOWME	36
92*4887Schin 
93*4887Schin /*
94*4887Schin  * passed as flags to builtins in Nambltin_t struct when BLT_OPTIM is on
95*4887Schin  */
96*4887Schin #define SH_BEGIN_OPTIM	0x1
97*4887Schin #define SH_END_OPTIM	0x2
98*4887Schin 
99*4887Schin /* The following type is used for error messages */
100*4887Schin 
101*4887Schin /* error messages */
102*4887Schin extern const char	e_defpath[];
103*4887Schin extern const char	e_found[];
104*4887Schin extern const char	e_nospace[];
105*4887Schin extern const char	e_format[];
106*4887Schin extern const char 	e_number[];
107*4887Schin extern const char	e_restricted[];
108*4887Schin extern const char	e_recursive[];
109*4887Schin extern char		e_version[];
110*4887Schin 
111*4887Schin typedef struct sh_scope
112*4887Schin {
113*4887Schin 	struct sh_scope	*par_scope;
114*4887Schin 	int		argc;
115*4887Schin 	char		**argv;
116*4887Schin 	char		*cmdname;
117*4887Schin 	char		*filename;
118*4887Schin 	int		lineno;
119*4887Schin 	Dt_t		*var_tree;
120*4887Schin 	struct sh_scope	*self;
121*4887Schin } Shscope_t;
122*4887Schin 
123*4887Schin /*
124*4887Schin  * Saves the state of the shell
125*4887Schin  */
126*4887Schin 
127*4887Schin typedef struct sh_static
128*4887Schin {
129*4887Schin 	Shopt_t		options;	/* set -o options */
130*4887Schin 	Dt_t		*var_tree;	/* for shell variables */
131*4887Schin 	Dt_t		*fun_tree;	/* for shell functions */
132*4887Schin 	Dt_t		*alias_tree;	/* for alias names */
133*4887Schin 	Dt_t		*bltin_tree;    /* for builtin commands */
134*4887Schin 	Shscope_t	*topscope;	/* pointer to top-level scope */
135*4887Schin 	int		inlineno;	/* line number of current input file */
136*4887Schin 	int		exitval;	/* most recent exit value */
137*4887Schin 	unsigned char	trapnote;	/* set when trap/signal is pending */
138*4887Schin 	char		subshell;	/* set for virtual subshell */
139*4887Schin #ifdef _SH_PRIVATE
140*4887Schin 	_SH_PRIVATE
141*4887Schin #endif /* _SH_PRIVATE */
142*4887Schin } Shell_t;
143*4887Schin 
144*4887Schin /* flags for sh_parse */
145*4887Schin #define SH_NL		1	/* Treat new-lines as ; */
146*4887Schin #define SH_EOF		2	/* EOF causes syntax error */
147*4887Schin 
148*4887Schin /* symbolic values for sh_iogetiop */
149*4887Schin #define SH_IOCOPROCESS	(-2)
150*4887Schin #define SH_IOHISTFILE	(-3)
151*4887Schin 
152*4887Schin /* symbolic value for sh_fdnotify */
153*4887Schin #define SH_FDCLOSE	(-1)
154*4887Schin 
155*4887Schin #if defined(__EXPORT__) && defined(_DLL)
156*4887Schin #   ifdef _BLD_shell
157*4887Schin #	define extern __EXPORT__
158*4887Schin #   endif /* _BLD_shell */
159*4887Schin #endif /* _DLL */
160*4887Schin 
161*4887Schin extern Dt_t		*sh_bltin_tree(void);
162*4887Schin extern void		sh_subfork(void);
163*4887Schin extern Shell_t		*sh_init(int,char*[],Shinit_f);
164*4887Schin extern int		sh_reinit(char*[]);
165*4887Schin extern int 		sh_eval(Sfio_t*,int);
166*4887Schin extern void 		sh_delay(double);
167*4887Schin extern void		*sh_parse(Shell_t*, Sfio_t*,int);
168*4887Schin extern int 		sh_trap(const char*,int);
169*4887Schin extern int 		sh_fun(Namval_t*,Namval_t*, char*[]);
170*4887Schin extern int 		sh_funscope(int,char*[],int(*)(void*),void*,int);
171*4887Schin extern Sfio_t		*sh_iogetiop(int,int);
172*4887Schin extern int		sh_main(int, char*[], void(*)(int));
173*4887Schin extern void		sh_menu(Sfio_t*, int, char*[]);
174*4887Schin extern Namval_t		*sh_addbuiltin(const char*, int(*)(int, char*[],void*), void*);
175*4887Schin extern char		*sh_fmtq(const char*);
176*4887Schin extern char		*sh_fmtqf(const char*, int, int);
177*4887Schin extern Sfdouble_t	sh_strnum(const char*, char**, int);
178*4887Schin extern int		sh_access(const char*,int);
179*4887Schin extern int 		sh_close(int);
180*4887Schin extern int 		sh_dup(int);
181*4887Schin extern void 		sh_exit(int);
182*4887Schin extern int		sh_fcntl(int, int, ...);
183*4887Schin extern Sfio_t		*sh_fd2sfio(int);
184*4887Schin extern int		(*sh_fdnotify(int(*)(int,int)))(int,int);
185*4887Schin extern Shell_t		*sh_getinterp(void);
186*4887Schin extern int		sh_open(const char*, int, ...);
187*4887Schin extern int		sh_openmax(void);
188*4887Schin extern Sfio_t		*sh_pathopen(const char*);
189*4887Schin extern ssize_t 		sh_read(int, void*, size_t);
190*4887Schin extern ssize_t 		sh_write(int, const void*, size_t);
191*4887Schin extern off_t		sh_seek(int, off_t, int);
192*4887Schin extern int 		sh_pipe(int[]);
193*4887Schin extern mode_t 		sh_umask(mode_t);
194*4887Schin extern void		*sh_waitnotify(Shwait_f);
195*4887Schin extern Shscope_t	*sh_getscope(int,int);
196*4887Schin extern Shscope_t	*sh_setscope(Shscope_t*);
197*4887Schin extern void		sh_sigcheck(void);
198*4887Schin extern unsigned long	sh_isoption(int);
199*4887Schin extern unsigned long	sh_onoption(int);
200*4887Schin extern unsigned long	sh_offoption(int);
201*4887Schin extern int 		sh_waitsafe(void);
202*4887Schin extern int		sh_exec(const Shnode_t*,int);
203*4887Schin 
204*4887Schin #if SHOPT_DYNAMIC
205*4887Schin     extern void		**sh_getliblist(void);
206*4887Schin #endif /* SHOPT_DYNAMIC */
207*4887Schin 
208*4887Schin /*
209*4887Schin  * direct access to sh is obsolete, use sh_getinterp() instead
210*4887Schin  */
211*4887Schin #if !defined(_SH_PRIVATE) && defined(__IMPORT__) && !defined(_BLD_shell)
212*4887Schin 	extern __IMPORT__  Shell_t sh;
213*4887Schin #else
214*4887Schin 	extern Shell_t sh;
215*4887Schin #endif
216*4887Schin 
217*4887Schin #ifdef _DLL
218*4887Schin #   undef extern
219*4887Schin #endif /* _DLL */
220*4887Schin 
221*4887Schin #ifndef _SH_PRIVATE
222*4887Schin #   define access(a,b)	sh_access(a,b)
223*4887Schin #   define close(a)	sh_close(a)
224*4887Schin #   define exit(a)	sh_exit(a)
225*4887Schin #   define fcntl(a,b,c)	sh_fcntl(a,b,c)
226*4887Schin #   define pipe(a)	sh_pipe(a)
227*4887Schin #   define read(a,b,c)	sh_read(a,b,c)
228*4887Schin #   define write(a,b,c)	sh_write(a,b,c)
229*4887Schin #   define umask(a)	sh_umask(a)
230*4887Schin #   define dup		sh_dup
231*4887Schin #   if _lib_lseek64
232*4887Schin #	define open64	sh_open
233*4887Schin #	define lseek64	sh_seek
234*4887Schin #   else
235*4887Schin #	define open	sh_open
236*4887Schin #	define lseek	sh_seek
237*4887Schin #   endif
238*4887Schin #endif /* !_SH_PRIVATE */
239*4887Schin 
240*4887Schin #define SH_SIGSET	4
241*4887Schin #define SH_EXITSIG	0400	/* signal exit bit */
242*4887Schin #define SH_EXITMASK	(SH_EXITSIG-1)	/* normal exit status bits */
243*4887Schin #define SH_RUNPROG	-1022	/* needs to be negative and < 256 */
244*4887Schin 
245*4887Schin #endif /* SH_INTERACTIVE */
246