summaryrefslogtreecommitdiff
path: root/usr/src/lib/libshell/amd64/include/ast/shell.h
blob: a8c1d85c3b46b73e975b85f3094f5ebc7d66b536 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264

/* : : generated by proto : : */
/***********************************************************************
*                                                                      *
*               This software is part of the ast package               *
*          Copyright (c) 1982-2010 AT&T Intellectual Property          *
*                      and is licensed under the                       *
*                  Common Public License, Version 1.0                  *
*                    by AT&T Intellectual Property                     *
*                                                                      *
*                A copy of the License is available at                 *
*            http://www.opensource.org/licenses/cpl1.0.txt             *
*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
*                                                                      *
*              Information and Software Systems Research               *
*                            AT&T Research                             *
*                           Florham Park NJ                            *
*                                                                      *
*                  David Korn <dgk@research.att.com>                   *
*                                                                      *
***********************************************************************/
                  
#ifndef SH_INTERACTIVE
#if !defined(__PROTO__)
#include <prototyped.h>
#endif
#if !defined(__LINKAGE__)
#define __LINKAGE__		/* 2004-08-11 transition */
#endif

/*
 * David Korn
 * AT&T Labs
 *
 * Interface definitions for shell command language
 *
 */

#include	<ast.h>
#include	<cdt.h>
#ifdef _SH_PRIVATE
#   include	"name.h"
#else
#   include	<nval.h>
#endif /* _SH_PRIVATE */

#define SH_VERSION	20071012

#undef NOT_USED
#define NOT_USED(x)	(&x,1)

/* options */
typedef struct
{
	unsigned long v[4];
}
Shopt_t;

typedef struct Shell_s Shell_t;

typedef void	(*Shinit_f) __PROTO__((Shell_t*, int));
typedef int	(*Shwait_f) __PROTO__((int, long, int));

union Shnode_u;
typedef union Shnode_u Shnode_t;

#define SH_CFLAG	0
#define SH_HISTORY	1	/* used also as a state */
#define	SH_ERREXIT	2	/* used also as a state */
#define	SH_VERBOSE	3	/* used also as a state */
#define SH_MONITOR	4	/* used also as a state */
#define	SH_INTERACTIVE	5	/* used also as a state */
#define	SH_RESTRICTED	6
#define	SH_XTRACE	7
#define	SH_KEYWORD	8
#define SH_NOUNSET	9
#define SH_NOGLOB	10
#define SH_ALLEXPORT	11
#define SH_PFSH		12
#define SH_IGNOREEOF	13
#define SH_NOCLOBBER	14
#define SH_MARKDIRS	15
#define SH_BGNICE	16
#define SH_VI		17
#define SH_VIRAW	18
#define	SH_TFLAG	19
#define SH_TRACKALL	20
#define	SH_SFLAG	21
#define	SH_NOEXEC	22
#define SH_GMACS	24
#define SH_EMACS	25
#define SH_PRIVILEGED	26
#define SH_SUBSHARE	27	/* subshell shares state with parent */
#define SH_NOLOG	28
#define SH_NOTIFY	29
#define SH_DICTIONARY	30
#define SH_PIPEFAIL	32
#define SH_GLOBSTARS	33
#define SH_XARGS	34
#define SH_RC		35
#define SH_SHOWME	36

/*
 * passed as flags to builtins in Nambltin_t struct when BLT_OPTIM is on
 */
#define SH_BEGIN_OPTIM	0x1
#define SH_END_OPTIM	0x2

/* The following type is used for error messages */

/* error messages */
extern __MANGLE__ const char	e_defpath[];
extern __MANGLE__ const char	e_found[];
extern __MANGLE__ const char	e_nospace[];
extern __MANGLE__ const char	e_format[];
extern __MANGLE__ const char 	e_number[];
extern __MANGLE__ const char	e_restricted[];
extern __MANGLE__ const char	e_recursive[];
extern __MANGLE__ char		e_version[];

typedef struct sh_scope
{
	struct sh_scope	*par_scope;
	int		argc;
	char		**argv;
	char		*cmdname;
	char		*filename;
	char		*funname;
	int		lineno;
	Dt_t		*var_tree;
	struct sh_scope	*self;
} Shscope_t;

/*
 * Saves the state of the shell
 */

struct Shell_s
{
	Shopt_t		options;	/* set -o options */
	Dt_t		*var_tree;	/* for shell variables */
	Dt_t		*fun_tree;	/* for shell functions */
	Dt_t		*alias_tree;	/* for alias names */
	Dt_t		*bltin_tree;    /* for builtin commands */
	Shscope_t	*topscope;	/* pointer to top-level scope */
	int		inlineno;	/* line number of current input file */
	int		exitval;	/* most recent exit value */
	unsigned char	trapnote;	/* set when trap/signal is pending */
	char		shcomp;		/* set when runing shcomp */
	short		subshell;	/* set for virtual subshell */
#ifdef _SH_PRIVATE
	_SH_PRIVATE
#endif /* _SH_PRIVATE */
};

/* flags for sh_parse */
#define SH_NL		1	/* Treat new-lines as ; */
#define SH_EOF		2	/* EOF causes syntax error */

/* symbolic values for sh_iogetiop */
#define SH_IOCOPROCESS	(-2)
#define SH_IOHISTFILE	(-3)

#include	<cmd.h>

/* symbolic value for sh_fdnotify */
#define SH_FDCLOSE	(-1)

#undef getenv			/* -lshell provides its own */

#if defined(__EXPORT__) && defined(_DLL)
#   ifdef _BLD_shell
#undef __MANGLE__
#define __MANGLE__ __LINKAGE__ __EXPORT__
#   endif /* _BLD_shell */
#endif /* _DLL */

extern __MANGLE__ Dt_t		*sh_bltin_tree __PROTO__((void));
extern __MANGLE__ void		sh_subfork __PROTO__((void));
extern __MANGLE__ Shell_t		*sh_init __PROTO__((int,char*[],Shinit_f));
extern __MANGLE__ int		sh_reinit __PROTO__((char*[]));
extern __MANGLE__ int 		sh_eval __PROTO__((Sfio_t*,int));
extern __MANGLE__ void 		sh_delay __PROTO__((double));
extern __MANGLE__ __V_		*sh_parse __PROTO__((Shell_t*, Sfio_t*,int));
extern __MANGLE__ int 		sh_trap __PROTO__((const char*,int));
extern __MANGLE__ int 		sh_fun __PROTO__((Namval_t*,Namval_t*, char*[]));
extern __MANGLE__ int 		sh_funscope __PROTO__((int,char*[],int(*)(__V_*),__V_*,int));
extern __MANGLE__ Sfio_t		*sh_iogetiop __PROTO__((int,int));
extern __MANGLE__ int		sh_main __PROTO__((int, char*[], Shinit_f));
extern __MANGLE__ int		sh_run __PROTO__((int, char*[]));
extern __MANGLE__ void		sh_menu __PROTO__((Sfio_t*, int, char*[]));
extern __MANGLE__ Namval_t		*sh_addbuiltin __PROTO__((const char*, int(*)(int, char*[],__V_*), __V_*));
extern __MANGLE__ char		*sh_fmtq __PROTO__((const char*));
extern __MANGLE__ char		*sh_fmtqf __PROTO__((const char*, int, int));
extern __MANGLE__ Sfdouble_t	sh_strnum __PROTO__((const char*, char**, int));
extern __MANGLE__ int		sh_access __PROTO__((const char*,int));
extern __MANGLE__ int 		sh_close __PROTO__((int));
extern __MANGLE__ int 		sh_dup __PROTO__((int));
extern __MANGLE__ void 		sh_exit __PROTO__((int));
extern __MANGLE__ int		sh_fcntl __PROTO__((int, int, ...));
extern __MANGLE__ Sfio_t		*sh_fd2sfio __PROTO__((int));
extern __MANGLE__ int		(*sh_fdnotify __PROTO__((int(*)(int,int)))) __PROTO__((int,int));
extern __MANGLE__ Shell_t		*sh_getinterp __PROTO__((void));
extern __MANGLE__ int		sh_open __PROTO__((const char*, int, ...));
extern __MANGLE__ int		sh_openmax __PROTO__((void));
extern __MANGLE__ Sfio_t		*sh_pathopen __PROTO__((const char*));
extern __MANGLE__ ssize_t 		sh_read __PROTO__((int, __V_*, size_t));
extern __MANGLE__ ssize_t 		sh_write __PROTO__((int, const __V_*, size_t));
extern __MANGLE__ off_t		sh_seek __PROTO__((int, off_t, int));
extern __MANGLE__ int 		sh_pipe __PROTO__((int[]));
extern __MANGLE__ mode_t 		sh_umask __PROTO__((mode_t));
extern __MANGLE__ __V_		*sh_waitnotify __PROTO__((Shwait_f));
extern __MANGLE__ Shscope_t	*sh_getscope __PROTO__((int,int));
extern __MANGLE__ Shscope_t	*sh_setscope __PROTO__((Shscope_t*));
extern __MANGLE__ void		sh_sigcheck __PROTO__((void));
extern __MANGLE__ unsigned long	sh_isoption __PROTO__((int));
extern __MANGLE__ unsigned long	sh_onoption __PROTO__((int));
extern __MANGLE__ unsigned long	sh_offoption __PROTO__((int));
extern __MANGLE__ int 		sh_waitsafe __PROTO__((void));
extern __MANGLE__ int		sh_exec __PROTO__((const Shnode_t*,int));

#if SHOPT_DYNAMIC
    extern __MANGLE__ __V_		**sh_getliblist __PROTO__((void));
#endif /* SHOPT_DYNAMIC */

/*
 * direct access to sh is obsolete, use sh_getinterp() instead
 */
#if !defined(_SH_PRIVATE) && defined(__IMPORT__) && !defined(_BLD_shell)
	extern __MANGLE__ __IMPORT__  Shell_t sh;
#else
	extern __MANGLE__ Shell_t sh;
#endif

#ifdef _DLL
#undef __MANGLE__
#define __MANGLE__ __LINKAGE__
#endif /* _DLL */

#ifndef _SH_PRIVATE
#   define access(a,b)	sh_access(a,b)
#   define close(a)	sh_close(a)
#   define exit(a)	sh_exit(a)
#   define fcntl(a,b,c)	sh_fcntl(a,b,c)
#   define pipe(a)	sh_pipe(a)
#   define read(a,b,c)	sh_read(a,b,c)
#   define write(a,b,c)	sh_write(a,b,c)
#   define umask(a)	sh_umask(a)
#   define dup		sh_dup
#   if _lib_lseek64
#	define open64	sh_open
#	define lseek64	sh_seek
#   else
#	define open	sh_open
#	define lseek	sh_seek
#   endif
#endif /* !_SH_PRIVATE */

#define SH_SIGSET	4
#define SH_EXITSIG	0400	/* signal exit bit */
#define SH_EXITMASK	(SH_EXITSIG-1)	/* normal exit status bits */
#define SH_RUNPROG	-1022	/* needs to be negative and < 256 */

#endif /* SH_INTERACTIVE */