/*- * Copyright (c) 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* $NetBSD: alias.h,v 1.4 1995/05/11 21:28:42 christos Exp $ */ #define ALIASINUSE 1 #define ALIASDEAD 2 struct alias { struct alias *next; char *name; char *val; int flag; }; struct alias *lookupalias __P((const char *, int)); static int aliascmd __P((int, char **)); static int unaliascmd __P((int, char **)); static void rmaliases __P((void)); static int unalias __P((char *)); static void printalias __P((const struct alias *)); #define ARITH_NUM 257 #define ARITH_LPAREN 258 #define ARITH_RPAREN 259 #define ARITH_OR 260 #define ARITH_AND 261 #define ARITH_BOR 262 #define ARITH_BXOR 263 #define ARITH_BAND 264 #define ARITH_EQ 265 #define ARITH_NE 266 #define ARITH_LT 267 #define ARITH_GT 268 #define ARITH_GE 269 #define ARITH_LE 270 #define ARITH_LSHIFT 271 #define ARITH_RSHIFT 272 #define ARITH_ADD 273 #define ARITH_SUB 274 #define ARITH_MUL 275 #define ARITH_DIV 276 #define ARITH_REM 277 #define ARITH_UNARYMINUS 278 #define ARITH_UNARYPLUS 279 #define ARITH_NOT 280 #define ARITH_BNOT 281 /* * This file was generated by the mkbuiltins program. */ #define BUILTIN_SPECIAL 0x1 #define BUILTIN_REGULAR 0x2 #define BUILTIN_ASSIGN 0x4 struct builtincmd { const char *name; int (*const builtinfunc) __P((int, char **)); unsigned flags; }; extern const struct builtincmd builtincmds[]; /* $NetBSD: cd.h,v 1.2 1997/07/04 21:01:52 christos Exp $ */ static int cdcmd __P((int, char **)); static int pwdcmd __P((int, char **)); static void setpwd __P((const char *, int)); /* $NetBSD: error.h,v 1.14 2001/02/04 19:52:06 christos Exp $ */ /* * Types of operations (passed to the errmsg routine). */ #define E_OPEN 01 /* opening a file */ #define E_CREAT 02 /* creating a file */ #define E_EXEC 04 /* executing a program */ /* * We enclose jmp_buf in a structure so that we can declare pointers to * jump locations. The global variable handler contains the location to * jump to when an exception occurs, and the global variable exception * contains a code identifying the exeception. To implement nested * exception handlers, the user should save the value of handler on entry * to an inner scope, set handler to point to a jmploc structure for the * inner scope, and restore handler on exit from the scope. */ struct jmploc { jmp_buf loc; }; extern struct jmploc *handler; extern int exception; /* exceptions */ #define EXINT 0 /* SIGINT received */ #define EXERROR 1 /* a generic error */ #define EXSHELLPROC 2 /* execute a shell procedure */ #define EXEXEC 3 /* command execution failed */ /* * These macros allow the user to suspend the handling of interrupt signals * over a period of time. This is similar to SIGHOLD to or sigblock, but * much more efficient and portable. (But hacking the kernel is so much * more fun than worrying about efficiency and portability. :-)) */ extern int suppressint; extern volatile int intpending; #define INTOFF suppressint++ #ifdef REALLY_SMALL static void __inton __P((void)); #define INTON __inton() #else #define INTON { if (--suppressint == 0 && intpending) onint(); } #endif #define FORCEINTON {suppressint = 0; if (intpending) onint();} #define CLEAR_PENDING_INT intpending = 0 #define int_pending() intpending static void exraise __P((int)) __attribute__((__noreturn__)); static void onint __P((void)); static void error __P((const char *, ...)) __attribute__((__noreturn__)); static void exerror __P((int, const char *, ...)) __attribute__((__noreturn__)); static const char *errmsg __P((int, int)); /* * BSD setjmp saves the signal mask, which violates ANSI C and takes time, * so we use _setjmp instead. */ #if defined(BSD) && !defined(__SVR4) && !defined(__GLIBC__) #define setjmp(jmploc) _setjmp(jmploc) #define longjmp(jmploc, val) _longjmp(jmploc, val) #endif /* $NetBSD: shell.h,v 1.13 2000/05/22 10:18:47 elric Exp $ */ /* * The follow should be set to reflect the type of system you have: * JOBS -> 1 if you have Berkeley job control, 0 otherwise. * SHORTNAMES -> 1 if your linker cannot handle long names. * define BSD if you are running 4.2 BSD or later. * define SYSV if you are running under System V. * define DEBUG=1 to compile in debugging (set global "debug" to turn on) * define DEBUG=2 to compile in and turn on debugging. * * When debugging is on, debugging info will be written to $HOME/trace and * a quit signal will generate a core dump. */ #define JOBS 1 #ifndef BSD #define BSD 1 #endif #ifdef __STDC__ typedef void *pointer; #ifndef NULL #define NULL (void *)0 #endif #else /* not __STDC__ */ typedef char *pointer; #ifndef NULL #define NULL 0 #endif #endif /* not __STDC__ */ extern char nullstr[1]; /* null string */ #ifdef DEBUG #define TRACE(param) trace param #else #define TRACE(param) #endif /* * This file was generated by the mknodes program. */ #define NSEMI 0 #define NCMD 1 #define NPIPE 2 #define NREDIR 3 #define NBACKGND 4 #define NSUBSHELL 5 #define NAND 6 #define NOR 7 #define NIF 8 #define NWHILE 9 #define NUNTIL 10 #define NFOR 11 #define NCASE 12 #define NCLIST 13 #define NDEFUN 14 #define NARG 15 #define NTO 16 #define NFROM 17 #define NFROMTO 18 #define NAPPEND 19 #define NTOOV 20 #define NTOFD 21 #define NFROMFD 22 #define NHERE 23 #define NXHERE 24 #define NNOT 25 struct nbinary { int type; union node *ch1; union node *ch2; }; struct ncmd { int type; int backgnd; union node *assign; union node *args; union node *redirect; }; struct npipe { int type; int backgnd; struct nodelist *cmdlist; }; struct nredir { int type; union node *n; union node *redirect; }; struct nif { int type; union node *test; union node *ifpart; union node *elsepart; }; struct nfor { int type; union node *args; union node *body; char *var; }; struct ncase { int type; union node *expr; union node *cases; }; struct nclist { int type; union node *next; union node *pattern; union node *body; }; struct narg { int type; union node *next; char *text; struct nodelist *backquote; }; struct nfile { int type; union node *next; int fd; union node *fname; char *expfname; }; struct ndup { int type; union node *next; int fd; int dupfd; union node *vname; }; struct nhere { int type; union node *next; int fd; union node *doc; }; struct nnot { int type; union node *com; }; union node { int type; struct nbinary nbinary; struct ncmd ncmd; struct npipe npipe; struct nredir nredir; struct nif nif; struct nfor nfor; struct ncase ncase; struct nclist nclist; struct narg narg; struct nfile nfile; struct ndup ndup; struct nhere nhere; struct nnot nnot; }; struct nodelist { struct nodelist *next; union node *n; }; #ifdef __STDC__ union node *copyfunc(union node *); static void freefunc(union node *); #else union node *copyfunc(); static void freefunc(); #endif /* $NetBSD: eval.h,v 1.10 2000/01/27 23:39:40 christos Exp $ */ extern char *commandname; /* currently executing command */ extern int exitstatus; /* exit status of last command */ extern struct strlist *cmdenviron; /* environment for builtin command */ struct backcmd { /* result of evalbackcmd */ int fd; /* file descriptor to read from */ char *buf; /* buffer */ int nleft; /* number of chars in buffer */ struct job *jp; /* job structure for command */ }; static int evalcmd __P((int, char **)); static void evalstring __P((char *, int)); static void evaltree __P((union node *, int)); static void evalbackcmd __P((union node *, struct backcmd *)); static int bltincmd __P((int, char **)); static int breakcmd __P((int, char **)); static int returncmd __P((int, char **)); static int execcmd __P((int, char **)); /* in_function returns nonzero if we are currently evaluating a function */ #define in_function() funcnest extern int funcnest; extern int evalskip; /* reasons for skipping commands (see comment on breakcmd routine) */ #define SKIPBREAK 1 #define SKIPCONT 2 #define SKIPFUNC 3 #define SKIPFILE 4 /* $NetBSD: exec.h,v 1.17 2000/05/22 10:18:47 elric Exp $ */ /* values of cmdtype */ #define CMDUNKNOWN -1 /* no entry in table for command */ #define CMDNORMAL 0 /* command is an executable program */ #define CMDBUILTIN 1 /* command is a shell builtin */ #define CMDFUNCTION 2 /* command is a shell function */ struct cmdentry { int cmdtype; union param { int index; union node *func; const struct builtincmd *cmd; } u; }; #define DO_ERR 1 /* find_command prints errors */ #define DO_ABS 2 /* find_command checks absolute paths */ #define DO_NOFUN 4 /* find_command ignores functions */ #define DO_BRUTE 8 /* find_command ignores hash table */ extern const char *pathopt; /* set by padvance */ extern int exerrno; /* last exec error */ static void shellexec __P((char **, char **, const char *, int)) __attribute__((noreturn)); static char *padvance __P((const char **, const char *)); static int hashcmd __P((int, char **)); static void find_command __P((char *, struct cmdentry *, int, const char *)); struct builtincmd *find_builtin __P((char *)); static void hashcd __P((void)); static void changepath __P((const char *)); static void deletefuncs __P((void)); #ifdef notdef static void getcmdentry __P((char *, struct cmdentry *)); #endif static void addcmdentry __P((char *, struct cmdentry *)); static void defun __P((char *, union node *)); static void unsetfunc __P((char *)); #ifdef ASH_TYPE static int typecmd __P((int, char **)); #endif static int commandcmd __P((int, char **)); /* $NetBSD: expand.h,v 1.12 1999/07/09 03:05:50 christos Exp $ */ struct strlist { struct strlist *next; char *text; }; struct arglist { struct strlist *list; struct strlist **lastp; }; /* * expandarg() flags */ #define EXP_FULL 0x1 /* perform word splitting & file globbing */ #define EXP_TILDE 0x2 /* do normal tilde expansion */ #define EXP_VARTILDE 0x4 /* expand tildes in an assignment */ #define EXP_REDIR 0x8 /* file glob for a redirection (1 match only) */ #define EXP_CASE 0x10 /* keeps quotes around for CASE pattern */ #define EXP_RECORD 0x20 /* need to record arguments for ifs breakup */ static void expandhere __P((union node *, int)); static void expandarg __P((union node *, struct arglist *, int)); #ifdef ASH_MATH_SUPPORT static void expari __P((int)); #endif #if !(defined(__GLIBC__) && !defined(FNMATCH_BROKEN) && !defined(GLOB_BROKEN)) static int patmatch __P((char *, char *, int)); #endif #if defined(__GLIBC__) && !defined(FNMATCH_BROKEN) #define rmescapes(p) _rmescapes((p), 0) static char *_rmescapes __P((char *, int)); #else static void rmescapes __P((char *)); #endif static int casematch __P((union node *, char *)); #ifdef ASH_MATH_SUPPORT /* From arith.y */ static int arith __P((const char *)); static int expcmd __P((int , char **)); static void arith_lex_reset __P((void)); static int yylex __P((void)); #endif /* $NetBSD: init.h,v 1.8 1995/05/11 21:29:14 christos Exp $ */ static void init __P((void)); static void reset __P((void)); static void initshellproc __P((void)); /* $NetBSD: input.h,v 1.12 2000/05/22 10:18:47 elric Exp $ */ /* PEOF (the end of file marker) is defined in syntax.h */ /* * The input line number. Input.c just defines this variable, and saves * and restores it when files are pushed and popped. The user of this * package must set its value. */ extern int plinno; extern int parsenleft; /* number of characters left in input buffer */ extern char *parsenextc; /* next character in input buffer */ static char *pfgets __P((char *, int)); static int pgetc __P((void)); static int pgetc2 __P((void)); static int preadbuffer __P((void)); static void pungetc __P((void)); static void pushstring __P((char *, int, void *)); static void popstring __P((void)); static void setinputfile __P((const char *, int)); static void setinputfd __P((int, int)); static void setinputstring __P((char *)); static void popfile __P((void)); static void popallfiles __P((void)); static void closescript __P((void)); #define pgetc_macro() (--parsenleft >= 0? *parsenextc++ : preadbuffer()) /* $NetBSD: jobs.h,v 1.12 2000/05/22 10:18:47 elric Exp $ */ /* Mode argument to forkshell. Don't change FORK_FG or FORK_BG. */ #define FORK_FG 0 #define FORK_BG 1 #define FORK_NOJOB 2 /* * A job structure contains information about a job. A job is either a * single process or a set of processes contained in a pipeline. In the * latter case, pidlist will be non-NULL, and will point to a -1 terminated * array of pids. */ struct procstat { pid_t pid; /* process id */ int status; /* status flags (defined above) */ char *cmd; /* text of command being run */ }; /* states */ #define JOBSTOPPED 1 /* all procs are stopped */ #define JOBDONE 2 /* all procs are completed */ struct job { struct procstat ps0; /* status of process */ struct procstat *ps; /* status or processes when more than one */ short nprocs; /* number of processes */ short pgrp; /* process group of this job */ char state; /* true if job is finished */ char used; /* true if this entry is in used */ char changed; /* true if status has changed */ #if JOBS char jobctl; /* job running under job control */ #endif }; extern short backgndpid; /* pid of last background process */ extern int job_warning; /* user was warned about stopped jobs */ static void setjobctl __P((int)); static int killcmd __P((int, char **)); static int fgcmd __P((int, char **)); static int bgcmd __P((int, char **)); static int jobscmd __P((int, char **)); static void showjobs __P((int)); static int waitcmd __P((int, char **)); struct job *makejob __P((union node *, int)); static int forkshell __P((struct job *, union node *, int)); static int waitforjob __P((struct job *)); static int stoppedjobs __P((void)); static char *commandtext __P((union node *)); #if ! JOBS #define setjobctl(on) /* do nothing */ #endif /* $NetBSD: machdep.h,v 1.8 1995/05/11 21:29:21 christos Exp $ */ /* * Most machines require the value returned from malloc to be aligned * in some way. The following macro will get this right on many machines. */ #ifndef ALIGN union align { int i; char *cp; }; #define ALIGN(nbytes) (((nbytes) + sizeof(union align) - 1) & ~(sizeof(union align) - 1)) #endif /* $NetBSD: mail.h,v 1.8 1995/05/11 21:29:23 christos Exp $ */ static void chkmail __P((int)); /* $NetBSD: main.h,v 1.8 1995/05/11 21:29:27 christos Exp $ */ extern int rootpid; /* pid of main shell */ extern int rootshell; /* true if we aren't a child of the main shell */ static void readcmdfile __P((char *)); static void cmdloop __P((int)); static int dotcmd __P((int, char **)); static int exitcmd __P((int, char **)); /* $NetBSD: memalloc.h,v 1.11 2000/11/01 19:56:01 christos Exp $ */ struct stackmark { struct stack_block *stackp; char *stacknxt; int stacknleft; struct stackmark *marknext; }; extern char *stacknxt; extern int stacknleft; extern int sstrnleft; extern int herefd; static inline pointer ckmalloc (int sz) { return xmalloc(sz); } static inline pointer ckrealloc(void *p, int sz) { return xrealloc(p, sz); } static inline char * savestr (const char *s) { return xstrdup(s); } pointer stalloc __P((int)); static void stunalloc __P((pointer)); static void setstackmark __P((struct stackmark *)); static void popstackmark __P((struct stackmark *)); static void growstackblock __P((void)); static void grabstackblock __P((int)); static char *growstackstr __P((void)); static char *makestrspace __P((size_t)); static void ungrabstackstr __P((char *, char *)); #define stackblock() stacknxt #define stackblocksize() stacknleft #define STARTSTACKSTR(p) p = stackblock(), sstrnleft = stackblocksize() #define STPUTC(c, p) (--sstrnleft >= 0? (*p++ = (c)) : (p = growstackstr(), *p++ = (c))) #define CHECKSTRSPACE(n, p) { if (sstrnleft < n) p = makestrspace(n); } #define USTPUTC(c, p) (--sstrnleft, *p++ = (c)) #define STACKSTRNUL(p) (sstrnleft == 0? (p = growstackstr(), *p = '\0') : (*p = '\0')) #define STUNPUTC(p) (++sstrnleft, --p) #define STTOPC(p) p[-1] #define STADJUST(amount, p) (p += (amount), sstrnleft -= (amount)) #define grabstackstr(p) stalloc(stackblocksize() - sstrnleft) #define ckfree(p) free((pointer)(p)) /* $NetBSD: miscbltin.h,v 1.1 1997/07/04 21:02:10 christos Exp $ */ static int readcmd __P((int, char **)); static int umaskcmd __P((int, char **)); static int ulimitcmd __P((int, char **)); /* $NetBSD: mystring.h,v 1.9 1995/05/11 21:29:42 christos Exp $ */ extern const char snlfmt[]; extern const char spcstr[]; #if 0 static void scopyn __P((const char *, char *, int)); #endif static int prefix __P((const char *, const char *)); static int number __P((const char *)); static int is_number __P((const char *)); static char *single_quote __P((const char *)); static char *sstrdup __P((const char *)); static int pstrcmp __P((const void *, const void *)); static const char *const *findstring __P((const char *, const char *const *, size_t)); #define equal(s1, s2) (strcmp(s1, s2) == 0) #define scopy(s1, s2) ((void)strcpy(s2, s1)) /* $NetBSD: options.h,v 1.14 2001/02/04 19:52:06 christos Exp $ */ struct shparam { int nparam; /* # of positional parameters (without $0) */ unsigned char malloc; /* if parameter list dynamically allocated */ char **p; /* parameter list */ int optind; /* next parameter to be processed by getopts */ int optoff; /* used by getopts */ }; #define eflag optlist[0].val #define fflag optlist[1].val #define Iflag optlist[2].val #define iflag optlist[3].val #define mflag optlist[4].val #define nflag optlist[5].val #define sflag optlist[6].val #define xflag optlist[7].val #define vflag optlist[8].val #define Vflag optlist[9].val #define Eflag optlist[10].val #define Cflag optlist[11].val #define aflag optlist[12].val #define bflag optlist[13].val #define uflag optlist[14].val #define qflag optlist[15].val #define NOPTS 16 struct optent { const char *name; const char letter; char val; }; extern struct optent optlist[NOPTS]; extern char *minusc; /* argument to -c option */ extern char *arg0; /* $0 */ extern struct shparam shellparam; /* $@ */ extern char **argptr; /* argument list for builtin commands */ extern char *optionarg; /* set by nextopt */ extern char *optptr; /* used by nextopt */ static void procargs __P((int, char **)); static void optschanged __P((void)); static void setparam __P((char **)); static void freeparam __P((volatile struct shparam *)); static int shiftcmd __P((int, char **)); static int setcmd __P((int, char **)); #ifdef ASH_GETOPTS static int getoptscmd __P((int, char **)); static int setvarsafe __P((const char *, const char *, int)); #endif static int nextopt __P((const char *)); static void getoptsreset __P((const char *)); /* $NetBSD: output.h,v 1.14 1998/01/31 12:37:55 christos Exp $ */ struct output { #ifdef USE_GLIBC_STDIO FILE *stream; #endif char *nextc; int nleft; char *buf; int bufsize; int fd; short flags; }; extern struct output output; extern struct output errout; extern struct output memout; extern struct output *out1; extern struct output *out2; static void outstr __P((const char *, struct output *)); #ifndef USE_GLIBC_STDIO static void outcslow __P((char, struct output *)); #endif static void flushall __P((void)); static void flushout __P((struct output *)); static void freestdout __P((void)); static void outfmt __P((struct output *, const char *, ...)) __attribute__((__format__(__printf__,2,3))); static void out1fmt __P((const char *, ...)) __attribute__((__format__(__printf__,1,2))); static void fmtstr __P((char *, size_t, const char *, ...)) __attribute__((__format__(__printf__,3,4))); #ifndef USE_GLIBC_STDIO static void doformat __P((struct output *, const char *, va_list)); #endif static int xwrite __P((int, const char *, int)); #ifdef USE_GLIBC_STDIO static void initstreams __P((void)); static void openmemout __P((void)); static int __closememout __P((void)); #endif #define OUTPUT_ERR 01 /* error occurred on output */ #ifdef USE_GLIBC_STDIO #define outc(c, o) putc((c), (o)->stream) #define doformat(d, f, a) vfprintf((d)->stream, (f), (a)) #else #define outc(c, file) (--(file)->nleft < 0? outcslow((c), (file)) : (*(file)->nextc = (c), (file)->nextc++)) #endif #define out1c(c) outc((c), out1) #define out2c(c) outc((c), out2) #define out1str(s) outstr((s), out1) #define out2str(s) outstr((s), out2) #define outerr(f) ((f)->flags & OUTPUT_ERR) /* $NetBSD: parser.h,v 1.14 2000/07/27 04:09:28 cgd Exp $ */ /* control characters in argument strings */ #define CTLESC '\201' #define CTLVAR '\202' #define CTLENDVAR '\203' #define CTLBACKQ '\204' #define CTLQUOTE 01 /* ored with CTLBACKQ code if in quotes */ /* CTLBACKQ | CTLQUOTE == '\205' */ #define CTLARI '\206' #define CTLENDARI '\207' #define CTLQUOTEMARK '\210' /* variable substitution byte (follows CTLVAR) */ #define VSTYPE 0x0f /* type of variable substitution */ #define VSNUL 0x10 /* colon--treat the empty string as unset */ #define VSQUOTE 0x80 /* inside double quotes--suppress splitting */ /* values of VSTYPE field */ #define VSNORMAL 0x1 /* normal variable: $var or ${var} */ #define VSMINUS 0x2 /* ${var-text} */ #define VSPLUS 0x3 /* ${var+text} */ #define VSQUESTION 0x4 /* ${var?message} */ #define VSASSIGN 0x5 /* ${var=text} */ #define VSTRIMLEFT 0x6 /* ${var#pattern} */ #define VSTRIMLEFTMAX 0x7 /* ${var##pattern} */ #define VSTRIMRIGHT 0x8 /* ${var%pattern} */ #define VSTRIMRIGHTMAX 0x9 /* ${var%%pattern} */ #define VSLENGTH 0xa /* ${#var} */ /* * NEOF is returned by parsecmd when it encounters an end of file. It * must be distinct from NULL, so we use the address of a variable that * happens to be handy. */ extern int tokpushback; #define NEOF ((union node *)&tokpushback) extern int whichprompt; /* 1 == PS1, 2 == PS2 */ extern int checkalias; union node *parsecmd(int); static void fixredir(union node *, const char *, int); static int goodname(char *); static const char *getprompt(void *); static int isassignment __P((const char *)); static const char *const *findkwd __P((const char *)); /* $NetBSD: redir.h,v 1.12 2000/05/22 10:18:47 elric Exp $ */ /* flags passed to redirect */ #define REDIR_PUSH 01 /* save previous values of file descriptors */ #define REDIR_BACKQ 02 /* save the command output in memory */ extern int fileno2; static void redirect __P((union node *, int)); static void popredir __P((void)); static int fd0_redirected_p __P((void)); static void clearredir __P((void)); static int dup_as_newfd __P((int, int)); /* $NetBSD: show.h,v 1.4 1999/10/08 21:10:44 pk Exp $ */ #ifdef DEBUG static void trace __P((const char *, ...)); static void trargs __P((char **)); static void showtree __P((union node *)); static void trputc __P((int)); static void trputs __P((const char *)); static void opentrace __P((void)); #endif /* * This file was generated by the mksyntax program. */ #ifdef CEOF #undef CEOF #endif /* Syntax classes */ #define CWORD 0 /* character is nothing special */ #define CNL 1 /* newline character */ #define CBACK 2 /* a backslash character */ #define CSQUOTE 3 /* single quote */ #define CDQUOTE 4 /* double quote */ #define CENDQUOTE 5 /* a terminating quote */ #define CBQUOTE 6 /* backwards single quote */ #define CVAR 7 /* a dollar sign */ #define CENDVAR 8 /* a '}' character */ #define CLP 9 /* a left paren in arithmetic */ #define CRP 10 /* a right paren in arithmetic */ #define CEOF 11 /* end of file */ #define CCTL 12 /* like CWORD, except it must be escaped */ #define CSPCL 13 /* these terminate a word */ #define CIGN 14 /* character should be ignored */ /* Syntax classes for is_ functions */ #define ISDIGIT 01 /* a digit */ #define ISUPPER 02 /* an upper case letter */ #define ISLOWER 04 /* a lower case letter */ #define ISUNDER 010 /* an underscore */ #define ISSPECL 020 /* the name of a special parameter */ #define SYNBASE 130 #define PEOF -130 #define PEOA -129 #define BASESYNTAX (basesyntax + SYNBASE) #define DQSYNTAX (dqsyntax + SYNBASE) #define SQSYNTAX (sqsyntax + SYNBASE) #define ARISYNTAX (arisyntax + SYNBASE) #define is_digit(c) ((unsigned)((c) - '0') <= 9) #define is_alpha(c) (((c) < CTLESC || (c) > CTLENDARI) && isalpha((unsigned char) (c))) #define is_name(c) (((c) < CTLESC || (c) > CTLENDARI) && ((c) == '_' || isalpha((unsigned char) (c)))) #define is_in_name(c) (((c) < CTLESC || (c) > CTLENDARI) && ((c) == '_' || isalnum((unsigned char) (c)))) #define is_special(c) ((is_type+SYNBASE)[c] & (ISSPECL|ISDIGIT)) #define digit_val(c) ((c) - '0') extern const char basesyntax[]; extern const char dqsyntax[]; extern const char sqsyntax[]; extern const char arisyntax[]; extern const char is_type[]; #define TEOF 0 #define TNL 1 #define TSEMI 2 #define TBACKGND 3 #define TAND 4 #define TOR 5 #define TPIPE 6 #define TLP 7 #define TRP 8 #define TENDCASE 9 #define TENDBQUOTE 10 #define TREDIR 11 #define TWORD 12 #define TASSIGN 13 #define TNOT 14 #define TCASE 15 #define TDO 16 #define TDONE 17 #define TELIF 18 #define TELSE 19 #define TESAC 20 #define TFI 21 #define TFOR 22 #define TIF 23 #define TIN 24 #define TTHEN 25 #define TUNTIL 26 #define TWHILE 27 #define TBEGIN 28 #define TEND 29 /* Array indicating which tokens mark the end of a list */ static const char tokendlist[] = { 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, }; static const char *const tokname[] = { "end of file", "newline", "\";\"", "\"&\"", "\"&&\"", "\"||\"", "\"|\"", "\"(\"", "\")\"", "\";;\"", "\"`\"", "redirection", "word", "assignment", "\"!\"", "\"case\"", "\"do\"", "\"done\"", "\"elif\"", "\"else\"", "\"esac\"", "\"fi\"", "\"for\"", "\"if\"", "\"in\"", "\"then\"", "\"until\"", "\"while\"", "\"{\"", "\"}\"", }; #define KWDOFFSET 14 static const char *const parsekwd[] = { "!", "case", "do", "done", "elif", "else", "esac", "fi", "for", "if", "in", "then", "until", "while", "{", "}" }; /* $NetBSD: trap.h,v 1.14 2000/05/22 10:18:47 elric Exp $ */ extern int pendingsigs; static int trapcmd __P((int, char **)); static void clear_traps __P((void)); static void setsignal __P((int)); static void ignoresig __P((int)); static void onsig __P((int)); static void dotrap __P((void)); static void setinteractive __P((int)); static void exitshell __P((int)) __attribute__((noreturn)); static int decode_signal __P((const char *, int)); /* $NetBSD: var.h,v 1.18 2000/05/22 10:18:47 elric Exp $ */ /* * Shell variables. */ /* flags */ #define VEXPORT 0x01 /* variable is exported */ #define VREADONLY 0x02 /* variable cannot be modified */ #define VSTRFIXED 0x04 /* variable struct is staticly allocated */ #define VTEXTFIXED 0x08 /* text is staticly allocated */ #define VSTACK 0x10 /* text is allocated on the stack */ #define VUNSET 0x20 /* the variable is not set */ #define VNOFUNC 0x40 /* don't call the callback function */ struct var { struct var *next; /* next entry in hash list */ int flags; /* flags are defined above */ char *text; /* name=value */ void (*func) __P((const char *)); /* function to be called when */ /* the variable gets set/unset */ }; struct localvar { struct localvar *next; /* next local variable in list */ struct var *vp; /* the variable that was made local */ int flags; /* saved flags */ char *text; /* saved text */ }; extern struct localvar *localvars; #if ATTY extern struct var vatty; #endif extern struct var vifs; extern struct var vmail; extern struct var vmpath; extern struct var vpath; extern struct var vps1; extern struct var vps2; #ifndef SMALL extern struct var vterm; extern struct var vtermcap; extern struct var vhistsize; #endif #ifdef IFS_BROKEN extern const char defifsvar[]; #define defifs (defifsvar + 4) #else extern const char defifs[]; #endif extern const char defpathvar[]; #define defpath (defpathvar + 5) /* * The following macros access the values of the above variables. * They have to skip over the name. They return the null string * for unset variables. */ #define ifsval() (vifs.text + 4) #define ifsset() ((vifs.flags & VUNSET) == 0) #define mailval() (vmail.text + 5) #define mpathval() (vmpath.text + 9) #define pathval() (vpath.text + 5) #define ps1val() (vps1.text + 4) #define ps2val() (vps2.text + 4) #define optindval() (voptind.text + 7) #ifndef SMALL #define histsizeval() (vhistsize.text + 9) #define termval() (vterm.text + 5) #endif #if ATTY #define attyset() ((vatty.flags & VUNSET) == 0) #endif #define mpathset() ((vmpath.flags & VUNSET) == 0) static void initvar __P((void)); static void setvar __P((const char *, const char *, int)); static void setvareq __P((char *, int)); struct strlist; static void listsetvar __P((struct strlist *)); static char *lookupvar __P((const char *)); static char *bltinlookup __P((const char *)); static char **environment __P((void)); static void shprocvar __P((void)); static int showvarscmd __P((int, char **)); static int exportcmd __P((int, char **)); static int localcmd __P((int, char **)); static void mklocal __P((char *)); static void poplocalvars __P((void)); static int setvarcmd __P((int, char **)); static int unsetcmd __P((int, char **)); static int unsetvar __P((const char *)); static int varequal __P((const char *, const char *));