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