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