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