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