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
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
|
/***********************************************************************
* *
* 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> *
* *
***********************************************************************/
#pragma prototyped
/*
* David Korn
* AT&T Labs
*
* Shell interface private definitions
*
*/
#ifndef defs_h_defined
#define defs_h_defined
#include <ast.h>
#include <sfio.h>
#include <error.h>
#include "FEATURE/externs"
#include "FEATURE/options"
#include <cdt.h>
#include <history.h>
#include "fault.h"
#include "argnod.h"
#include "name.h"
#include <ctype.h>
#define _SH_PRIVATE
#include <shcmd.h>
#undef _SH_PRIVATE
#ifndef pointerof
#define pointerof(x) ((void*)((char*)0+(x)))
#endif
#define Empty ((char*)(e_sptbnl+3))
#define env_change() (++ast.env_serial)
#if SHOPT_ENV
# include <env.h>
#else
# define Env_t void
# define sh_envput(e,p) env_change()
# define env_delete(e,p) env_change()
#endif
extern char* sh_getenv(const char*);
extern char* sh_setenviron(const char*);
/*
* note that the first few fields have to be the same as for
* Shscoped_t in <shell.h>
*/
struct sh_scoped
{
struct sh_scoped *prevst; /* pointer to previous state */
int dolc;
char **dolv;
char *cmdname;
char *filename;
char *funname;
int lineno;
Dt_t *save_tree; /* var_tree for calling function */
struct sh_scoped *self; /* pointer to copy of this scope*/
Dt_t *var_local; /* local level variables for name() */
struct slnod *staklist; /* link list of function stacks */
int states;
int breakcnt;
int execbrk;
int loopcnt;
int firstline;
int32_t optindex;
int32_t optnum;
int32_t tmout; /* value for TMOUT */
short optchar;
short opterror;
int ioset;
unsigned short trapmax;
char *trap[SH_DEBUGTRAP+1];
char **trapcom;
char **otrapcom;
void *timetrap;
struct Ufunction *real_fun; /* current 'function name' function */
};
struct limits
{
long arg_max; /* max arg+env exec() size */
int open_max; /* maximum number of file descriptors */
int clk_tck; /* number of ticks per second */
int child_max; /* maxumum number of children */
int ngroups_max; /* maximum number of process groups */
unsigned char posix_version; /* posix version number */
unsigned char posix_jobcontrol;/* non-zero for job control systems */
unsigned char fs3d; /* non-zero for 3-d file system */
};
#define _SH_PRIVATE \
struct sh_scoped st; /* scoped information */ \
struct limits lim; /* run time limits */ \
Stk_t *stk; /* stack poiter */ \
Sfio_t *heredocs; /* current here-doc temp file */ \
Sfio_t *funlog; /* for logging function definitions */ \
int **fdptrs; /* pointer to file numbers */ \
int savexit; \
char *lastarg; \
char *lastpath; /* last alsolute path found */ \
int path_err; /* last error on path search */ \
Dt_t *track_tree; /* for tracked aliases*/ \
Dt_t *var_base; /* global level variables */ \
Namval_t *namespace; /* current active namespace*/ \
Namval_t *last_table; /* last table used in last nv_open */ \
Namval_t *prev_table; /* previous table used in nv_open */ \
Sfio_t *outpool; /* ouput stream pool */ \
long timeout; /* read timeout */ \
short curenv; /* current subshell number */ \
short jobenv; /* subshell number for jobs */ \
int infd; /* input file descriptor */ \
int nextprompt; /* next prompt is PS<nextprompt> */ \
int bltin_nnodes; /* number of bltins nodes */ \
Namval_t *bltin_nodes; /* pointer to built-in variables */ \
Namval_t *bltin_cmds; /* pointer to built-in commands */ \
Namval_t *posix_fun; /* points to last name() function */ \
char *outbuff; /* pointer to output buffer */ \
char *errbuff; /* pointer to stderr buffer */ \
char *prompt; /* pointer to prompt string */ \
char *shname; /* shell name */ \
char *shpath; /* path name of shell */ \
char *user; /* name of real user for pfsh */ \
char *comdiv; /* points to sh -c argument */ \
char *prefix; /* prefix for compound assignment */ \
sigjmp_buf *jmplist; /* longjmp return stack */ \
char **sigmsg; /* points to signal messages */ \
int oldexit; \
uid_t userid,euserid; /* real and effective user id */ \
gid_t groupid,egroupid;/* real and effective group id */ \
pid_t pid; /* process id of shell */ \
pid_t bckpid; /* background process id */ \
pid_t cpid; \
pid_t spid; /* subshell process id */ \
pid_t pipepid; \
int32_t ppid; /* parent process id of shell */ \
int topfd; \
int sigmax; /* maximum number of signals */ \
int savesig; \
unsigned char *sigflag; /* pointer to signal states */ \
char intrap; \
char login_sh; \
char lastbase; \
char forked; \
char binscript; \
char deftype; \
char funload; \
char used_pos; /* used postional parameter */\
char universe; \
char winch; \
char indebug; /* set when in debug trap */ \
unsigned char lastsig; /* last signal received */ \
char subshare; /* set when in ${..} comsub */ \
char toomany; /* set when out of fd's */ \
char instance; /* in set_instance */ \
char decomma; /* decimal_point=',' */ \
char *readscript; /* set before reading a script */ \
int *inpipe; /* input pipe pointer */ \
int *outpipe; /* output pipe pointer */ \
int cpipe[2]; \
int coutpipe; \
int inuse_bits; \
struct argnod *envlist; \
struct dolnod *arglist; \
int fn_depth; \
int fn_reset; \
int dot_depth; \
int hist_depth; \
int xargmin; \
int xargmax; \
int xargexit; \
int nenv; \
mode_t mask; \
long nforks; \
Env_t *env; \
void *init_context; \
void *mac_context; \
void *lex_context; \
void *arg_context; \
void *ed_context; \
void *job_context; \
void *pathlist; \
void *defpathlist; \
void *cdpathlist; \
char **argaddr; \
void *optlist; \
struct sh_scoped global; \
struct checkpt checkbase; \
Shinit_f userinit; \
Shbltin_f bltinfun; \
Shbltin_t bltindata; \
Shwait_f waitevent; \
char *cur_line; \
char *rcfile; \
char **login_files; \
int offsets[10]; \
Sfio_t **sftable; \
unsigned char *fdstatus; \
const char *pwd; \
History_t *hist_ptr; \
void *jmpbuffer; \
void *mktype; \
Sfio_t *strbuf; \
Sfio_t *strbuf2; \
Dt_t *last_root; \
Dt_t *prev_root; \
Dt_t *fpathdict; \
Dt_t *typedict; \
char ifstable[256]; \
unsigned char sigruntime[2]; \
unsigned long test; \
Shopt_t offoptions; \
Shopt_t glob_options; \
Namval_t *typeinit; \
int *stats; \
Namfun_t nvfun; \
struct Regress_s*regress;
#include <shell.h>
#include "regress.h"
/* error exits from various parts of shell */
#define NIL(type) ((type)0)
#define new_of(type,x) ((type*)malloc((unsigned)sizeof(type)+(x)))
#define exitset() (sh.savexit=sh.exitval)
#ifndef SH_DICT
#define SH_DICT (void*)e_dict
#endif
#ifndef SH_CMDLIB_DIR
#define SH_CMDLIB_DIR "/opt/ast/bin"
#endif
/* states */
/* low numbered states are same as options */
#define SH_NOFORK 0 /* set when fork not necessary */
#define SH_FORKED 7 /* set when process has been forked */
#define SH_PROFILE 8 /* set when processing profiles */
#define SH_NOALIAS 9 /* do not expand non-exported aliases */
#define SH_NOTRACK 10 /* set to disable sftrack() function */
#define SH_STOPOK 11 /* set for stopable builtins */
#define SH_GRACE 12 /* set for timeout grace period */
#define SH_TIMING 13 /* set while timing pipelines */
#define SH_DEFPATH 14 /* set when using default path */
#define SH_INIT 15 /* set when initializing the shell */
#define SH_TTYWAIT 16 /* waiting for keyboard input */
#define SH_FCOMPLETE 17 /* set for filename completion */
#define SH_PREINIT 18 /* set with SH_INIT before parsing options */
#define SH_COMPLETE 19 /* set for command completion */
#define SH_BASH 41
#define SH_BRACEEXPAND 42
#define SH_POSIX 46
#define SH_MULTILINE 47
#define SH_NOPROFILE 78
#define SH_NOUSRPROFILE 79
#define SH_LOGIN_SHELL 67
#define SH_COMMANDLINE 0x100
#define SH_BASHEXTRA 0x200
#define SH_BASHOPT 0x400
#define SH_ID "ksh" /* ksh id */
#define SH_STD "sh" /* standard sh id */
/* defines for sh_type() */
#define SH_TYPE_SH 001
#define SH_TYPE_KSH 002
#define SH_TYPE_BASH 004
#define SH_TYPE_LOGIN 010
#define SH_TYPE_PROFILE 020
#define SH_TYPE_RESTRICTED 040
#if SHOPT_BASH
# ifndef SHOPT_HISTEXPAND
# define SHOPT_HISTEXPAND 1
# endif
/*
* define for all the bash options
*/
# define SH_CDABLE_VARS 51
# define SH_CDSPELL 52
# define SH_CHECKHASH 53
# define SH_CHECKWINSIZE 54
# define SH_CMDHIST 55
# define SH_DOTGLOB 56
# define SH_EXECFAIL 57
# define SH_EXPAND_ALIASES 58
# define SH_EXTGLOB 59
# define SH_HOSTCOMPLETE 63
# define SH_HUPONEXIT 64
# define SH_INTERACTIVE_COMM 65
# define SH_LITHIST 66
# define SH_MAILWARN 68
# define SH_NOEMPTYCMDCOMPL 69
# define SH_NOCASEGLOB 70
# define SH_NULLGLOB 71
# define SH_PHYSICAL 45
# define SH_PROGCOMP 72
# define SH_PROMPTVARS 73
# define SH_RESTRICTED2 74
# define SH_SHIFT_VERBOSE 75
# define SH_SOURCEPATH 76
# define SH_XPG_ECHO 77
#endif
#if SHOPT_HISTEXPAND
# define SH_HISTAPPEND 60
# define SH_HISTEXPAND 43
# define SH_HISTORY2 44
# define SH_HISTREEDIT 61
# define SH_HISTVERIFY 62
#endif
#ifndef PIPE_BUF
# define PIPE_BUF 512
#endif
#if SHOPT_PFSH && ( !_lib_getexecuser || !_lib_free_execattr )
# undef SHOPT_PFSH
#endif
#define MATCH_MAX 64
#define SH_READEVAL 0x4000 /* for sh_eval */
#define SH_FUNEVAL 0x10000 /* for sh_eval for function load */
extern Shell_t *nv_shell(Namval_t*);
extern int sh_addlib(void*);
extern void sh_applyopts(Shell_t*,Shopt_t);
extern char **sh_argbuild(Shell_t*,int*,const struct comnod*,int);
extern struct dolnod *sh_argfree(Shell_t *, struct dolnod*,int);
extern struct dolnod *sh_argnew(Shell_t*,char*[],struct dolnod**);
extern void *sh_argopen(Shell_t*);
extern struct argnod *sh_argprocsub(Shell_t*,struct argnod*);
extern void sh_argreset(Shell_t*,struct dolnod*,struct dolnod*);
extern Namval_t *sh_assignok(Namval_t*,int);
extern struct dolnod *sh_arguse(Shell_t*);
extern char *sh_checkid(char*,char*);
extern int sh_debug(Shell_t *shp,const char*,const char*,const char*,char *const[],int);
extern int sh_echolist(Sfio_t*, int, char**);
extern struct argnod *sh_endword(Shell_t*,int);
extern char **sh_envgen(void);
#if SHOPT_ENV
extern void sh_envput(Env_t*, Namval_t*);
#endif
extern void sh_envnolocal(Namval_t*,void*);
extern Sfdouble_t sh_arith(const char*);
extern void *sh_arithcomp(char*);
extern pid_t sh_fork(int,int*);
extern pid_t _sh_fork(pid_t, int ,int*);
extern char *sh_mactrim(Shell_t*,char*,int);
extern int sh_macexpand(Shell_t*,struct argnod*,struct argnod**,int);
extern int sh_macfun(Shell_t*,const char*,int);
extern void sh_machere(Shell_t*,Sfio_t*, Sfio_t*, char*);
extern void *sh_macopen(Shell_t*);
extern char *sh_macpat(Shell_t*,struct argnod*,int);
extern char *sh_mactry(Shell_t*,char*);
extern void sh_printopts(Shopt_t,int,Shopt_t*);
extern int sh_readline(Shell_t*,char**,int,int,long);
extern Sfio_t *sh_sfeval(char*[]);
extern void sh_setmatch(const char*,int,int,int[]);
extern Dt_t *sh_subaliastree(int);
extern void sh_scope(Shell_t*, struct argnod*, int);
extern Namval_t *sh_scoped(Shell_t*, Namval_t*);
extern Dt_t *sh_subfuntree(int);
extern void sh_subjobcheck(pid_t);
extern int sh_subsavefd(int);
extern void sh_subtmpfile(int);
extern char *sh_substitute(const char*,const char*,char*);
extern const char *_sh_translate(const char*);
extern int sh_trace(char*[],int);
extern void sh_trim(char*);
extern int sh_type(const char*);
extern void sh_unscope(Shell_t*);
extern void sh_utol(const char*, char*);
extern int sh_whence(char**,int);
#ifndef ERROR_dictionary
# define ERROR_dictionary(s) (s)
#endif
#define sh_translate(s) _sh_translate(ERROR_dictionary(s))
#define WBITS (sizeof(long)*8)
#define WMASK (0xff)
#define is_option(s,x) ((s)->v[((x)&WMASK)/WBITS] & (1L << ((x) % WBITS)))
#define on_option(s,x) ((s)->v[((x)&WMASK)/WBITS] |= (1L << ((x) % WBITS)))
#define off_option(s,x) ((s)->v[((x)&WMASK)/WBITS] &= ~(1L << ((x) % WBITS)))
#define sh_isoption(x) is_option(&sh.options,x)
#define sh_onoption(x) on_option(&sh.options,x)
#define sh_offoption(x) off_option(&sh.options,x)
#define sh_state(x) ( 1<<(x))
#define sh_isstate(x) (sh.st.states&sh_state(x))
#define sh_onstate(x) (sh.st.states |= sh_state(x))
#define sh_offstate(x) (sh.st.states &= ~sh_state(x))
#define sh_getstate() (sh.st.states)
#define sh_setstate(x) (sh.st.states = (x))
#define sh_sigcheck() do{if(sh.trapnote&SH_SIGSET)sh_exit(SH_EXITSIG);} while(0)
extern int32_t sh_mailchk;
extern const char e_dict[];
/* sh_printopts() mode flags -- set --[no]option by default */
#define PRINT_VERBOSE 0x01 /* option on|off list */
#define PRINT_ALL 0x02 /* list unset options too */
#define PRINT_NO_HEADER 0x04 /* omit listing header */
#define PRINT_SHOPT 0x08 /* shopt -s|-u */
#define PRINT_TABLE 0x10 /* table of all options */
#ifdef SHOPT_STATS
/* performance statistics */
# define STAT_ARGHITS 0
# define STAT_ARGEXPAND 1
# define STAT_COMSUB 2
# define STAT_FORKS 3
# define STAT_FUNCT 4
# define STAT_GLOBS 5
# define STAT_READS 6
# define STAT_NVHITS 7
# define STAT_NVOPEN 8
# define STAT_PATHS 9
# define STAT_SVFUNCT 10
# define STAT_SCMDS 11
# define STAT_SPAWN 12
# define STAT_SUBSHELL 13
extern const Shtable_t shtab_stats[];
# define sh_stats(x) (sh.stats[(x)]++)
#else
# define sh_stats(x)
#endif /* SHOPT_STATS */
#endif
|