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 /*
22da2e3ebdSchin  * David Korn
23da2e3ebdSchin  * AT&T Labs
24da2e3ebdSchin  *
25da2e3ebdSchin  * Shell interface private definitions
26da2e3ebdSchin  *
27da2e3ebdSchin  */
287c2fbfb3SApril Chin #ifndef defs_h_defined
297c2fbfb3SApril Chin #define defs_h_defined
30da2e3ebdSchin 
31da2e3ebdSchin #include	<ast.h>
32da2e3ebdSchin #include	<sfio.h>
33da2e3ebdSchin #include	<error.h>
343e14f97fSRoger A. Faulkner #include	"FEATURE/externs"
35da2e3ebdSchin #include	"FEATURE/options"
36da2e3ebdSchin #include	<cdt.h>
37da2e3ebdSchin #include	<history.h>
38da2e3ebdSchin #include	"fault.h"
39da2e3ebdSchin #include	"argnod.h"
407c2fbfb3SApril Chin #include	"name.h"
4134f9b3eeSRoland Mainz #include	<ctype.h>
42da2e3ebdSchin 
43da2e3ebdSchin #ifndef pointerof
44da2e3ebdSchin #define pointerof(x)		((void*)((char*)0+(x)))
45da2e3ebdSchin #endif
46da2e3ebdSchin 
477c2fbfb3SApril Chin #define Empty			((char*)(e_sptbnl+3))
487c2fbfb3SApril Chin 
49da2e3ebdSchin #define	env_change()		(++ast.env_serial)
50da2e3ebdSchin #if SHOPT_ENV
51da2e3ebdSchin #   include	<env.h>
52da2e3ebdSchin #else
53da2e3ebdSchin #   define Env_t		void
54da2e3ebdSchin #   define sh_envput(e,p)	env_change()
55da2e3ebdSchin #   define env_delete(e,p)	env_change()
56da2e3ebdSchin #endif
57da2e3ebdSchin 
583e14f97fSRoger A. Faulkner extern char*	sh_getenv(const char*);
593e14f97fSRoger A. Faulkner extern char*	sh_setenviron(const char*);
603e14f97fSRoger A. Faulkner 
61da2e3ebdSchin /*
62da2e3ebdSchin  * note that the first few fields have to be the same as for
63da2e3ebdSchin  * Shscoped_t in <shell.h>
64da2e3ebdSchin  */
657c2fbfb3SApril Chin 
667c2fbfb3SApril Chin 
67da2e3ebdSchin struct sh_scoped
68da2e3ebdSchin {
69da2e3ebdSchin 	struct sh_scoped *prevst;	/* pointer to previous state */
70da2e3ebdSchin 	int		dolc;
71da2e3ebdSchin 	char		**dolv;
72da2e3ebdSchin 	char		*cmdname;
73da2e3ebdSchin 	char		*filename;
747c2fbfb3SApril Chin 	char		*funname;
75da2e3ebdSchin 	int		lineno;
76da2e3ebdSchin 	Dt_t		*save_tree;	/* var_tree for calling function */
77da2e3ebdSchin 	struct sh_scoped *self;		/* pointer to copy of this scope*/
78da2e3ebdSchin 	Dt_t		*var_local;	/* local level variables for name() */
79da2e3ebdSchin 	struct slnod	*staklist;	/* link list of function stacks */
80da2e3ebdSchin 	int		states;
81da2e3ebdSchin 	int		breakcnt;
82da2e3ebdSchin 	int		execbrk;
83da2e3ebdSchin 	int		loopcnt;
84da2e3ebdSchin 	int		firstline;
85da2e3ebdSchin 	int32_t		optindex;
86da2e3ebdSchin 	int32_t		optnum;
87da2e3ebdSchin 	int32_t		tmout;		/* value for TMOUT */
88da2e3ebdSchin 	short		optchar;
89da2e3ebdSchin 	short		opterror;
90da2e3ebdSchin 	int		ioset;
91da2e3ebdSchin 	unsigned short	trapmax;
92da2e3ebdSchin 	char		*trap[SH_DEBUGTRAP+1];
93*b30d1939SAndy Fiddaman 	char		**otrap;
94da2e3ebdSchin 	char		**trapcom;
95da2e3ebdSchin 	char		**otrapcom;
96da2e3ebdSchin 	void		*timetrap;
977c2fbfb3SApril Chin 	struct Ufunction *real_fun;	/* current 'function name' function */
98*b30d1939SAndy Fiddaman 	int             repl_index;
99*b30d1939SAndy Fiddaman 	char            *repl_arg;
100da2e3ebdSchin };
101da2e3ebdSchin 
102da2e3ebdSchin struct limits
103da2e3ebdSchin {
104da2e3ebdSchin 	long		arg_max;	/* max arg+env exec() size */
105da2e3ebdSchin 	int		open_max;	/* maximum number of file descriptors */
106da2e3ebdSchin 	int		clk_tck;	/* number of ticks per second */
107da2e3ebdSchin 	int		child_max;	/* maxumum number of children */
108da2e3ebdSchin 	int		ngroups_max;	/* maximum number of process groups */
109da2e3ebdSchin 	unsigned char	posix_version;	/* posix version number */
110da2e3ebdSchin 	unsigned char	posix_jobcontrol;/* non-zero for job control systems */
111da2e3ebdSchin 	unsigned char	fs3d;		/* non-zero for 3-d file system */
112da2e3ebdSchin };
113da2e3ebdSchin 
114*b30d1939SAndy Fiddaman #ifndef SH_wait_f_defined
115*b30d1939SAndy Fiddaman     typedef int (*Shwait_f)(int, long, int);
116*b30d1939SAndy Fiddaman #   define     SH_wait_f_defined
117*b30d1939SAndy Fiddaman #endif
118*b30d1939SAndy Fiddaman 
119*b30d1939SAndy Fiddaman 
120*b30d1939SAndy Fiddaman struct shared
121*b30d1939SAndy Fiddaman {
122*b30d1939SAndy Fiddaman 	struct limits	lim;
123*b30d1939SAndy Fiddaman 	uid_t		userid;
124*b30d1939SAndy Fiddaman 	uid_t		euserid;
125*b30d1939SAndy Fiddaman 	gid_t		groupid;
126*b30d1939SAndy Fiddaman 	gid_t		egroupid;
127*b30d1939SAndy Fiddaman 	pid_t		pid;
128*b30d1939SAndy Fiddaman 	int32_t		ppid;
129*b30d1939SAndy Fiddaman 	unsigned char	sigruntime[2];
130*b30d1939SAndy Fiddaman 	Namval_t	*bltin_nodes;
131*b30d1939SAndy Fiddaman 	Namval_t	*bltin_cmds;
132*b30d1939SAndy Fiddaman 	History_t	*hist_ptr;
133*b30d1939SAndy Fiddaman 	char		*shpath;
134*b30d1939SAndy Fiddaman 	char		*user;
135*b30d1939SAndy Fiddaman 	char		**sigmsg;
136*b30d1939SAndy Fiddaman 	char		*rcfile;
137*b30d1939SAndy Fiddaman 	char		**login_files;
138*b30d1939SAndy Fiddaman 	void		*ed_context;
139*b30d1939SAndy Fiddaman 	void		*init_context;
140*b30d1939SAndy Fiddaman 	void		*job_context;
141*b30d1939SAndy Fiddaman 	int		*stats;
142*b30d1939SAndy Fiddaman 	int		bltin_nnodes;	/* number of bltins nodes */
143*b30d1939SAndy Fiddaman 	int		sigmax;
144*b30d1939SAndy Fiddaman 	int		nforks;
145*b30d1939SAndy Fiddaman 	Shwait_f	waitevent;
146*b30d1939SAndy Fiddaman };
147*b30d1939SAndy Fiddaman 
148da2e3ebdSchin #define _SH_PRIVATE \
149*b30d1939SAndy Fiddaman 	struct shared	*gd;		/* global data */ \
150da2e3ebdSchin 	struct sh_scoped st;		/* scoped information */ \
1517c2fbfb3SApril Chin 	Stk_t		*stk;		/* stack poiter */ \
152da2e3ebdSchin 	Sfio_t		*heredocs;	/* current here-doc temp file */ \
153da2e3ebdSchin 	Sfio_t		*funlog;	/* for logging function definitions */ \
154da2e3ebdSchin 	int		**fdptrs;	/* pointer to file numbers */ \
155da2e3ebdSchin 	int		savexit; \
156da2e3ebdSchin 	char		*lastarg; \
157da2e3ebdSchin 	char		*lastpath;	/* last alsolute path found */ \
158da2e3ebdSchin 	int		path_err;	/* last error on path search */ \
159da2e3ebdSchin 	Dt_t		*track_tree;	/* for tracked aliases*/ \
160da2e3ebdSchin 	Dt_t		*var_base;	/* global level variables */ \
161*b30d1939SAndy Fiddaman 	Dt_t		*openmatch; \
162da2e3ebdSchin 	Namval_t	*namespace;	/* current active namespace*/ \
163da2e3ebdSchin 	Namval_t	*last_table;	/* last table used in last nv_open  */ \
1647c2fbfb3SApril Chin 	Namval_t	*prev_table;	/* previous table used in nv_open  */ \
165da2e3ebdSchin 	Sfio_t		*outpool;	/* ouput stream pool */ \
166da2e3ebdSchin 	long		timeout;	/* read timeout */ \
167da2e3ebdSchin 	short		curenv;		/* current subshell number */ \
168da2e3ebdSchin 	short		jobenv;		/* subshell number for jobs */ \
1697c2fbfb3SApril Chin 	int		infd;		/* input file descriptor */ \
170*b30d1939SAndy Fiddaman 	short		nextprompt;	/* next prompt is PS<nextprompt> */ \
171*b30d1939SAndy Fiddaman 	short		poolfiles; \
172da2e3ebdSchin 	Namval_t	*posix_fun;	/* points to last name() function */ \
173da2e3ebdSchin 	char		*outbuff;	/* pointer to output buffer */ \
174da2e3ebdSchin 	char		*errbuff;	/* pointer to stderr buffer */ \
175da2e3ebdSchin 	char		*prompt;	/* pointer to prompt string */ \
176da2e3ebdSchin 	char		*shname;	/* shell name */ \
177da2e3ebdSchin 	char		*comdiv;	/* points to sh -c argument */ \
178da2e3ebdSchin 	char		*prefix;	/* prefix for compound assignment */ \
179da2e3ebdSchin 	sigjmp_buf	*jmplist;	/* longjmp return stack */ \
180*b30d1939SAndy Fiddaman 	char		*fifo;		/* fifo name for process sub */ \
181da2e3ebdSchin 	int		oldexit; \
182da2e3ebdSchin 	pid_t		bckpid;		/* background process id */ \
183da2e3ebdSchin 	pid_t		cpid; \
1847c2fbfb3SApril Chin 	pid_t		spid; 		/* subshell process id */ \
18534f9b3eeSRoland Mainz 	pid_t		pipepid; \
186*b30d1939SAndy Fiddaman 	pid_t		outpipepid; \
187da2e3ebdSchin 	int		topfd; \
188da2e3ebdSchin 	int		savesig; \
189da2e3ebdSchin 	unsigned char	*sigflag;	/* pointer to signal states */ \
190da2e3ebdSchin 	char		intrap; \
191da2e3ebdSchin 	char		login_sh; \
192da2e3ebdSchin 	char		lastbase; \
193da2e3ebdSchin 	char		forked;	\
194da2e3ebdSchin 	char		binscript; \
195da2e3ebdSchin 	char		deftype; \
1967c2fbfb3SApril Chin 	char		funload; \
197da2e3ebdSchin 	char		used_pos;	/* used postional parameter */\
1987c2fbfb3SApril Chin 	char		universe; \
1997c2fbfb3SApril Chin 	char		winch; \
200*b30d1939SAndy Fiddaman 	char		inarith; 	/* set when in ((...)) */ \
2017c2fbfb3SApril Chin 	char		indebug; 	/* set when in debug trap */ \
202*b30d1939SAndy Fiddaman 	unsigned char	ignsig;		/* ignored signal in subshell */ \
203da2e3ebdSchin 	unsigned char	lastsig;	/* last signal received */ \
204*b30d1939SAndy Fiddaman 	char		pathinit;	/* pathinit called from subshell */ \
205*b30d1939SAndy Fiddaman 	char		comsub;		/* set when in $() comsub */ \
20681af778eSCasper H.S. Dik 	char		subshare;	/* set when in ${..} comsub */ \
20734f9b3eeSRoland Mainz 	char		toomany;	/* set when out of fd's */ \
2083e14f97fSRoger A. Faulkner 	char		instance;	/* in set_instance */ \
2093e14f97fSRoger A. Faulkner 	char		decomma;	/* decimal_point=',' */ \
210*b30d1939SAndy Fiddaman 	char		redir0;		/* redirect of 0 */ \
211da2e3ebdSchin 	char		*readscript;	/* set before reading a script */ \
212*b30d1939SAndy Fiddaman 	int		subdup;		/* bitmask for dups of 1 */ \
213da2e3ebdSchin 	int		*inpipe;	/* input pipe pointer */ \
214da2e3ebdSchin 	int		*outpipe;	/* output pipe pointer */ \
215*b30d1939SAndy Fiddaman 	int		cpipe[3]; \
216da2e3ebdSchin 	int		coutpipe; \
217da2e3ebdSchin 	int		inuse_bits; \
218da2e3ebdSchin 	struct argnod	*envlist; \
219da2e3ebdSchin 	struct dolnod	*arglist; \
220da2e3ebdSchin 	int		fn_depth; \
2217c2fbfb3SApril Chin 	int		fn_reset; \
222da2e3ebdSchin 	int		dot_depth; \
223da2e3ebdSchin 	int		hist_depth; \
224da2e3ebdSchin 	int		xargmin; \
225da2e3ebdSchin 	int		xargmax; \
226da2e3ebdSchin 	int		xargexit; \
2277c2fbfb3SApril Chin 	int		nenv; \
228da2e3ebdSchin 	mode_t		mask; \
229da2e3ebdSchin 	Env_t		*env; \
230da2e3ebdSchin 	void		*init_context; \
231da2e3ebdSchin 	void		*mac_context; \
232da2e3ebdSchin 	void		*lex_context; \
233da2e3ebdSchin 	void		*arg_context; \
234da2e3ebdSchin 	void		*job_context; \
235da2e3ebdSchin 	void		*pathlist; \
236da2e3ebdSchin 	void		*defpathlist; \
237da2e3ebdSchin 	void		*cdpathlist; \
238da2e3ebdSchin 	char		**argaddr; \
239da2e3ebdSchin 	void		*optlist; \
240da2e3ebdSchin 	struct sh_scoped global; \
241da2e3ebdSchin 	struct checkpt	checkbase; \
242da2e3ebdSchin 	Shinit_f	userinit; \
243da2e3ebdSchin 	Shbltin_f	bltinfun; \
2447c2fbfb3SApril Chin 	Shbltin_t	bltindata; \
245da2e3ebdSchin 	char		*cur_line; \
2467c2fbfb3SApril Chin 	int		offsets[10]; \
247da2e3ebdSchin 	Sfio_t		**sftable; \
248da2e3ebdSchin 	unsigned char	*fdstatus; \
249da2e3ebdSchin 	const char	*pwd; \
250da2e3ebdSchin 	void		*jmpbuffer; \
251da2e3ebdSchin 	void		*mktype; \
252da2e3ebdSchin 	Sfio_t		*strbuf; \
2537c2fbfb3SApril Chin 	Sfio_t		*strbuf2; \
254*b30d1939SAndy Fiddaman 	Dt_t		*first_root; \
255*b30d1939SAndy Fiddaman 	Dt_t		*prefix_root; \
256da2e3ebdSchin 	Dt_t		*last_root; \
2577c2fbfb3SApril Chin 	Dt_t		*prev_root; \
2587c2fbfb3SApril Chin 	Dt_t		*fpathdict; \
2597c2fbfb3SApril Chin 	Dt_t		*typedict; \
260*b30d1939SAndy Fiddaman 	Dt_t		*inpool; \
261*b30d1939SAndy Fiddaman 	Dt_t		*transdict; \
262da2e3ebdSchin 	char		ifstable[256]; \
2637c2fbfb3SApril Chin 	unsigned long	test; \
2647c2fbfb3SApril Chin 	Shopt_t		offoptions; \
2657c2fbfb3SApril Chin 	Shopt_t		glob_options; \
2667c2fbfb3SApril Chin 	Namval_t	*typeinit; \
26734f9b3eeSRoland Mainz 	Namfun_t	nvfun; \
268*b30d1939SAndy Fiddaman 	char		*mathnodes; \
269*b30d1939SAndy Fiddaman 	void		*coshell; \
270*b30d1939SAndy Fiddaman 	char		*bltin_dir; \
271*b30d1939SAndy Fiddaman 	struct Regress_s*regress; \
272*b30d1939SAndy Fiddaman 	char 		exittrap; \
273*b30d1939SAndy Fiddaman 	char 		errtrap; \
274*b30d1939SAndy Fiddaman 	char 		end_fn;
275da2e3ebdSchin 
276da2e3ebdSchin #include	<shell.h>
277da2e3ebdSchin 
278*b30d1939SAndy Fiddaman #include	"shtable.h"
27934f9b3eeSRoland Mainz #include	"regress.h"
280da2e3ebdSchin 
281da2e3ebdSchin /* error exits from various parts of shell */
282da2e3ebdSchin #define	NIL(type)	((type)0)
283da2e3ebdSchin 
284da2e3ebdSchin #define new_of(type,x)	((type*)malloc((unsigned)sizeof(type)+(x)))
285da2e3ebdSchin 
286da2e3ebdSchin #define exitset()	(sh.savexit=sh.exitval)
287da2e3ebdSchin 
288da2e3ebdSchin #ifndef SH_DICT
289da2e3ebdSchin #define SH_DICT		(void*)e_dict
290da2e3ebdSchin #endif
291da2e3ebdSchin 
292da2e3ebdSchin #ifndef SH_CMDLIB_DIR
293da2e3ebdSchin #define SH_CMDLIB_DIR	"/opt/ast/bin"
294da2e3ebdSchin #endif
295da2e3ebdSchin 
296da2e3ebdSchin /* states */
297da2e3ebdSchin /* low numbered states are same as options */
29834f9b3eeSRoland Mainz #define SH_NOFORK	0	/* set when fork not necessary */
299da2e3ebdSchin #define	SH_FORKED	7	/* set when process has been forked */
300da2e3ebdSchin #define	SH_PROFILE	8	/* set when processing profiles */
301da2e3ebdSchin #define SH_NOALIAS	9	/* do not expand non-exported aliases */
302da2e3ebdSchin #define SH_NOTRACK	10	/* set to disable sftrack() function */
303da2e3ebdSchin #define SH_STOPOK	11	/* set for stopable builtins */
304da2e3ebdSchin #define SH_GRACE	12	/* set for timeout grace period */
305da2e3ebdSchin #define SH_TIMING	13	/* set while timing pipelines */
306da2e3ebdSchin #define SH_DEFPATH	14	/* set when using default path */
307da2e3ebdSchin #define SH_INIT		15	/* set when initializing the shell */
308da2e3ebdSchin #define SH_TTYWAIT	16	/* waiting for keyboard input */
309da2e3ebdSchin #define	SH_FCOMPLETE	17	/* set for filename completion */
310da2e3ebdSchin #define	SH_PREINIT	18	/* set with SH_INIT before parsing options */
31134f9b3eeSRoland Mainz #define SH_COMPLETE	19	/* set for command completion */
312da2e3ebdSchin 
313da2e3ebdSchin #define SH_BASH			41
314da2e3ebdSchin #define SH_BRACEEXPAND		42
315da2e3ebdSchin #define SH_POSIX		46
316da2e3ebdSchin #define SH_MULTILINE    	47
317da2e3ebdSchin 
318da2e3ebdSchin #define SH_NOPROFILE		78
319da2e3ebdSchin #define SH_NOUSRPROFILE		79
320da2e3ebdSchin #define SH_LOGIN_SHELL		67
321da2e3ebdSchin #define SH_COMMANDLINE		0x100
322da2e3ebdSchin #define SH_BASHEXTRA		0x200
323da2e3ebdSchin #define SH_BASHOPT		0x400
324da2e3ebdSchin 
325da2e3ebdSchin #define SH_ID			"ksh"	/* ksh id */
326da2e3ebdSchin #define SH_STD			"sh"	/* standard sh id */
327da2e3ebdSchin 
328da2e3ebdSchin /* defines for sh_type() */
329da2e3ebdSchin 
330da2e3ebdSchin #define SH_TYPE_SH		001
331da2e3ebdSchin #define SH_TYPE_KSH		002
332da2e3ebdSchin #define SH_TYPE_BASH		004
333da2e3ebdSchin #define SH_TYPE_LOGIN		010
334da2e3ebdSchin #define SH_TYPE_PROFILE		020
335da2e3ebdSchin #define SH_TYPE_RESTRICTED	040
336da2e3ebdSchin 
337da2e3ebdSchin #if SHOPT_BASH
338da2e3ebdSchin #   ifndef SHOPT_HISTEXPAND
339da2e3ebdSchin #	define SHOPT_HISTEXPAND	1
340da2e3ebdSchin #   endif
341da2e3ebdSchin /*
342da2e3ebdSchin  *  define for all the bash options
343da2e3ebdSchin  */
344da2e3ebdSchin #   define SH_CDABLE_VARS	51
345da2e3ebdSchin #   define SH_CDSPELL		52
346da2e3ebdSchin #   define SH_CHECKHASH		53
347da2e3ebdSchin #   define SH_CHECKWINSIZE	54
348da2e3ebdSchin #   define SH_CMDHIST		55
349da2e3ebdSchin #   define SH_DOTGLOB		56
350da2e3ebdSchin #   define SH_EXECFAIL		57
351da2e3ebdSchin #   define SH_EXPAND_ALIASES	58
352da2e3ebdSchin #   define SH_EXTGLOB		59
353da2e3ebdSchin #   define SH_HOSTCOMPLETE	63
354da2e3ebdSchin #   define SH_HUPONEXIT		64
355da2e3ebdSchin #   define SH_INTERACTIVE_COMM	65
356da2e3ebdSchin #   define SH_LITHIST		66
357da2e3ebdSchin #   define SH_MAILWARN		68
358da2e3ebdSchin #   define SH_NOEMPTYCMDCOMPL	69
359da2e3ebdSchin #   define SH_NOCASEGLOB	70
360da2e3ebdSchin #   define SH_NULLGLOB		71
361da2e3ebdSchin #   define SH_PHYSICAL		45
362da2e3ebdSchin #   define SH_PROGCOMP		72
363da2e3ebdSchin #   define SH_PROMPTVARS	73
364da2e3ebdSchin #   define SH_RESTRICTED2	74
365da2e3ebdSchin #   define SH_SHIFT_VERBOSE	75
366da2e3ebdSchin #   define SH_SOURCEPATH	76
367da2e3ebdSchin #   define SH_XPG_ECHO		77
368da2e3ebdSchin #endif
369da2e3ebdSchin 
370da2e3ebdSchin #if SHOPT_HISTEXPAND
371da2e3ebdSchin #   define SH_HISTAPPEND	60
372da2e3ebdSchin #   define SH_HISTEXPAND	43
373da2e3ebdSchin #   define SH_HISTORY2		44
374da2e3ebdSchin #   define SH_HISTREEDIT	61
375da2e3ebdSchin #   define SH_HISTVERIFY	62
376da2e3ebdSchin #endif
377da2e3ebdSchin 
378da2e3ebdSchin #ifndef PIPE_BUF
379da2e3ebdSchin #   define PIPE_BUF		512
380da2e3ebdSchin #endif
381da2e3ebdSchin 
3823e14f97fSRoger A. Faulkner #if SHOPT_PFSH && ( !_lib_getexecuser || !_lib_free_execattr )
3833e14f97fSRoger A. Faulkner #   undef SHOPT_PFSH
3843e14f97fSRoger A. Faulkner #endif
3853e14f97fSRoger A. Faulkner 
386da2e3ebdSchin #define MATCH_MAX		64
387da2e3ebdSchin 
3887c2fbfb3SApril Chin #define SH_READEVAL		0x4000	/* for sh_eval */
38934f9b3eeSRoland Mainz #define SH_FUNEVAL		0x10000	/* for sh_eval for function load */
3907c2fbfb3SApril Chin 
391*b30d1939SAndy Fiddaman extern struct shared	*shgd;
3927c2fbfb3SApril Chin extern Shell_t		*nv_shell(Namval_t*);
3937c2fbfb3SApril Chin extern void		sh_applyopts(Shell_t*,Shopt_t);
3947c2fbfb3SApril Chin extern char 		**sh_argbuild(Shell_t*,int*,const struct comnod*,int);
3957c2fbfb3SApril Chin extern struct dolnod	*sh_argfree(Shell_t *, struct dolnod*,int);
3967c2fbfb3SApril Chin extern struct dolnod	*sh_argnew(Shell_t*,char*[],struct dolnod**);
397da2e3ebdSchin extern void 		*sh_argopen(Shell_t*);
39834f9b3eeSRoland Mainz extern struct argnod	*sh_argprocsub(Shell_t*,struct argnod*);
3997c2fbfb3SApril Chin extern void 		sh_argreset(Shell_t*,struct dolnod*,struct dolnod*);
400da2e3ebdSchin extern Namval_t		*sh_assignok(Namval_t*,int);
4017c2fbfb3SApril Chin extern struct dolnod	*sh_arguse(Shell_t*);
402da2e3ebdSchin extern char		*sh_checkid(char*,char*);
403*b30d1939SAndy Fiddaman extern void		sh_chktrap(Shell_t*);
404*b30d1939SAndy Fiddaman extern void		sh_deparse(Sfio_t*,const Shnode_t*,int);
4057c2fbfb3SApril Chin extern int		sh_debug(Shell_t *shp,const char*,const char*,const char*,char *const[],int);
406*b30d1939SAndy Fiddaman extern int 		sh_echolist(Shell_t*,Sfio_t*, int, char**);
4077c2fbfb3SApril Chin extern struct argnod	*sh_endword(Shell_t*,int);
408da2e3ebdSchin extern char 		**sh_envgen(void);
409da2e3ebdSchin #if SHOPT_ENV
410da2e3ebdSchin extern void 		sh_envput(Env_t*, Namval_t*);
411da2e3ebdSchin #endif
412da2e3ebdSchin extern void 		sh_envnolocal(Namval_t*,void*);
413*b30d1939SAndy Fiddaman extern Sfdouble_t	sh_arith(Shell_t*,const char*);
414*b30d1939SAndy Fiddaman extern void		*sh_arithcomp(Shell_t *,char*);
415*b30d1939SAndy Fiddaman extern pid_t 		sh_fork(Shell_t*,int,int*);
416*b30d1939SAndy Fiddaman extern pid_t		_sh_fork(Shell_t*,pid_t, int ,int*);
4177c2fbfb3SApril Chin extern char 		*sh_mactrim(Shell_t*,char*,int);
4187c2fbfb3SApril Chin extern int 		sh_macexpand(Shell_t*,struct argnod*,struct argnod**,int);
4197c2fbfb3SApril Chin extern int		sh_macfun(Shell_t*,const char*,int);
4207c2fbfb3SApril Chin extern void 		sh_machere(Shell_t*,Sfio_t*, Sfio_t*, char*);
421da2e3ebdSchin extern void 		*sh_macopen(Shell_t*);
4227c2fbfb3SApril Chin extern char 		*sh_macpat(Shell_t*,struct argnod*,int);
423*b30d1939SAndy Fiddaman extern Sfdouble_t	sh_mathfun(Shell_t*, void*, int, Sfdouble_t*);
424*b30d1939SAndy Fiddaman extern int		sh_outtype(Shell_t*, Sfio_t*);
4257c2fbfb3SApril Chin extern char 		*sh_mactry(Shell_t*,char*);
426*b30d1939SAndy Fiddaman extern int		sh_mathstd(const char*);
427da2e3ebdSchin extern void		sh_printopts(Shopt_t,int,Shopt_t*);
428*b30d1939SAndy Fiddaman extern int 		sh_readline(Shell_t*,char**,volatile int,int,ssize_t,long);
429da2e3ebdSchin extern Sfio_t		*sh_sfeval(char*[]);
430*b30d1939SAndy Fiddaman extern void		sh_setmatch(Shell_t*,const char*,int,int,int[],int);
431da2e3ebdSchin extern Dt_t		*sh_subaliastree(int);
4327c2fbfb3SApril Chin extern void             sh_scope(Shell_t*, struct argnod*, int);
4337c2fbfb3SApril Chin extern Namval_t		*sh_scoped(Shell_t*, Namval_t*);
434da2e3ebdSchin extern Dt_t		*sh_subfuntree(int);
4357c2fbfb3SApril Chin extern void		sh_subjobcheck(pid_t);
436da2e3ebdSchin extern int		sh_subsavefd(int);
437*b30d1939SAndy Fiddaman extern void		sh_subtmpfile(Shell_t*);
438da2e3ebdSchin extern char 		*sh_substitute(const char*,const char*,char*);
439*b30d1939SAndy Fiddaman extern void		sh_timetraps(Shell_t*);
440da2e3ebdSchin extern const char	*_sh_translate(const char*);
441*b30d1939SAndy Fiddaman extern int		sh_trace(Shell_t*,char*[],int);
442da2e3ebdSchin extern void		sh_trim(char*);
443da2e3ebdSchin extern int		sh_type(const char*);
4447c2fbfb3SApril Chin extern void             sh_unscope(Shell_t*);
445da2e3ebdSchin extern void		sh_utol(const char*, char*);
446da2e3ebdSchin extern int 		sh_whence(char**,int);
447*b30d1939SAndy Fiddaman #if SHOPT_COSHELL
448*b30d1939SAndy Fiddaman    extern int		sh_coaddfile(Shell_t*,char*);
449*b30d1939SAndy Fiddaman    extern int		sh_copipe(Shell_t*, int[], int);
450*b30d1939SAndy Fiddaman    extern int		sh_coaccept(Shell_t*,int[],int);
451*b30d1939SAndy Fiddaman #endif /* SHOPT_COSHELL */
452*b30d1939SAndy Fiddaman #if SHOPT_NAMESPACE
453*b30d1939SAndy Fiddaman     extern Namval_t	*sh_fsearch(Shell_t*,const char *,int);
454*b30d1939SAndy Fiddaman #endif /* SHOPT_NAMESPACE */
455da2e3ebdSchin 
456da2e3ebdSchin #ifndef ERROR_dictionary
457da2e3ebdSchin #   define ERROR_dictionary(s)	(s)
458da2e3ebdSchin #endif
459da2e3ebdSchin #define sh_translate(s)	_sh_translate(ERROR_dictionary(s))
460da2e3ebdSchin 
461da2e3ebdSchin #define WBITS		(sizeof(long)*8)
462da2e3ebdSchin #define WMASK		(0xff)
463da2e3ebdSchin 
464da2e3ebdSchin #define is_option(s,x)	((s)->v[((x)&WMASK)/WBITS] & (1L << ((x) % WBITS)))
465da2e3ebdSchin #define on_option(s,x)	((s)->v[((x)&WMASK)/WBITS] |= (1L << ((x) % WBITS)))
466da2e3ebdSchin #define off_option(s,x)	((s)->v[((x)&WMASK)/WBITS] &= ~(1L << ((x) % WBITS)))
467da2e3ebdSchin #define sh_isoption(x)	is_option(&sh.options,x)
468da2e3ebdSchin #define sh_onoption(x)	on_option(&sh.options,x)
469da2e3ebdSchin #define sh_offoption(x)	off_option(&sh.options,x)
470da2e3ebdSchin 
471da2e3ebdSchin 
472da2e3ebdSchin #define sh_state(x)	( 1<<(x))
473da2e3ebdSchin #define	sh_isstate(x)	(sh.st.states&sh_state(x))
474da2e3ebdSchin #define	sh_onstate(x)	(sh.st.states |= sh_state(x))
475da2e3ebdSchin #define	sh_offstate(x)	(sh.st.states &= ~sh_state(x))
476da2e3ebdSchin #define	sh_getstate()	(sh.st.states)
477da2e3ebdSchin #define	sh_setstate(x)	(sh.st.states = (x))
478da2e3ebdSchin 
479*b30d1939SAndy Fiddaman #define sh_sigcheck(shp) do{if(shp->trapnote&SH_SIGSET)sh_exit(SH_EXITSIG);} while(0)
480da2e3ebdSchin 
481da2e3ebdSchin extern int32_t		sh_mailchk;
482da2e3ebdSchin extern const char	e_dict[];
483da2e3ebdSchin 
484da2e3ebdSchin /* sh_printopts() mode flags -- set --[no]option by default */
485da2e3ebdSchin 
486da2e3ebdSchin #define PRINT_VERBOSE	0x01	/* option on|off list		*/
4877c2fbfb3SApril Chin #define PRINT_ALL	0x02	/* list unset options too	*/
488da2e3ebdSchin #define PRINT_NO_HEADER	0x04	/* omit listing header		*/
489da2e3ebdSchin #define PRINT_SHOPT	0x08	/* shopt -s|-u			*/
490da2e3ebdSchin #define PRINT_TABLE	0x10	/* table of all options		*/
4917c2fbfb3SApril Chin 
4927c2fbfb3SApril Chin #ifdef SHOPT_STATS
4937c2fbfb3SApril Chin     /* performance statistics */
4947c2fbfb3SApril Chin #   define	STAT_ARGHITS	0
4957c2fbfb3SApril Chin #   define	STAT_ARGEXPAND	1
4967c2fbfb3SApril Chin #   define	STAT_COMSUB	2
4977c2fbfb3SApril Chin #   define	STAT_FORKS	3
4987c2fbfb3SApril Chin #   define	STAT_FUNCT	4
4997c2fbfb3SApril Chin #   define	STAT_GLOBS	5
5007c2fbfb3SApril Chin #   define	STAT_READS	6
5017c2fbfb3SApril Chin #   define	STAT_NVHITS	7
5027c2fbfb3SApril Chin #   define	STAT_NVOPEN	8
5037c2fbfb3SApril Chin #   define	STAT_PATHS	9
5047c2fbfb3SApril Chin #   define	STAT_SVFUNCT	10
5057c2fbfb3SApril Chin #   define	STAT_SCMDS	11
5067c2fbfb3SApril Chin #   define	STAT_SPAWN	12
5077c2fbfb3SApril Chin #   define	STAT_SUBSHELL	13
5087c2fbfb3SApril Chin     extern const Shtable_t shtab_stats[];
509*b30d1939SAndy Fiddaman #   define sh_stats(x)	(shgd->stats[(x)]++)
5107c2fbfb3SApril Chin #else
5117c2fbfb3SApril Chin #   define sh_stats(x)
5127c2fbfb3SApril Chin #endif /* SHOPT_STATS */
5137c2fbfb3SApril Chin 
5147c2fbfb3SApril Chin 
5157c2fbfb3SApril Chin #endif
516