1*35134Smarc /* 2*35134Smarc 3*35134Smarc * Copyright (c) 1984, 1985, 1986 AT&T 4*35134Smarc * All Rights Reserved 5*35134Smarc 6*35134Smarc * THIS IS UNPUBLISHED PROPRIETARY SOURCE 7*35134Smarc * CODE OF AT&T. 8*35134Smarc * The copyright notice above does not 9*35134Smarc * evidence any actual or intended 10*35134Smarc * publication of such source code. 11*35134Smarc 12*35134Smarc */ 13*35134Smarc /* @(#)defs.h 1.1 */ 14*35134Smarc 15*35134Smarc /* 16*35134Smarc * UNIX shell 17*35134Smarc * S. R. Bourne 18*35134Smarc * Rewritten by David Korn 19*35134Smarc * 20*35134Smarc */ 21*35134Smarc 22*35134Smarc #include <stdio.h> 23*35134Smarc #include <setjmp.h> 24*35134Smarc #include <signal.h> 25*35134Smarc 26*35134Smarc #define const 27*35134Smarc 28*35134Smarc /* error exits from various parts of shell */ 29*35134Smarc #define ERROR 1 30*35134Smarc #define SYNBAD 2 31*35134Smarc 32*35134Smarc #define BYTESPERWORD (sizeof(char *)) 33*35134Smarc #define ENDARGS 0 /* arg list terminator */ 34*35134Smarc #define NIL ((char*)0) 35*35134Smarc #ifndef NULL 36*35134Smarc #define NULL 0 37*35134Smarc #endif 38*35134Smarc 39*35134Smarc 40*35134Smarc /* typedefs used in the shell */ 41*35134Smarc typedef char BOOL; 42*35134Smarc typedef char *ADDRESS; 43*35134Smarc typedef char MSG[]; 44*35134Smarc typedef char *STKPTR; 45*35134Smarc 46*35134Smarc typedef struct stat STATBUF; /* defined in /usr/include/sys/stat.h */ 47*35134Smarc typedef struct blk *BLKPTR; 48*35134Smarc typedef struct fileblk FILEBLK; 49*35134Smarc typedef struct fileblk *SHFILE; 50*35134Smarc typedef struct trenod *TREPTR; 51*35134Smarc typedef struct forknod *FORKPTR; 52*35134Smarc typedef struct comnod *COMPTR; 53*35134Smarc typedef struct swnod *SWPTR; 54*35134Smarc typedef struct regnod *REGPTR; 55*35134Smarc typedef struct parnod *PARPTR; 56*35134Smarc typedef struct ifnod *IFPTR; 57*35134Smarc typedef struct whnod *WHPTR; 58*35134Smarc typedef struct fornod *FORPTR; 59*35134Smarc typedef struct lstnod *LSTPTR; 60*35134Smarc typedef struct chnnod *CHNPTR; 61*35134Smarc typedef struct dolnod *DOLPTR; 62*35134Smarc typedef struct ionod *IOPTR; 63*35134Smarc typedef struct Namnod NAMNOD; 64*35134Smarc typedef struct Namnod *NAMPTR; 65*35134Smarc typedef struct sysnod *SYSPTR; 66*35134Smarc typedef struct procnod *PROCPTR; 67*35134Smarc 68*35134Smarc #define Rcheat(a) ((unsigned)(a)) 69*35134Smarc 70*35134Smarc #define blank() putc(SP,output) 71*35134Smarc #define newline() putc(NL,output) 72*35134Smarc #define round(a,b) (((int)((ADR(a)+b)-1))&~((b)-1)) 73*35134Smarc #define eq(a,b) (strcmp(a,b)==0) 74*35134Smarc #define max(a,b) ((a)>(b)?(a):(b)) 75*35134Smarc #define assert(x) ; 76*35134Smarc #define exitset() (savexit=exitval) 77*35134Smarc #define error(s) failed(s,NIL) 78*35134Smarc #define BLK(x) ((BLKPTR)(x)) 79*35134Smarc #define BYT(x) ((BYTPTR)(x)) 80*35134Smarc #define STK(x) ((STKPTR)(x)) 81*35134Smarc #define ADR(x) ((char*)(x)) 82*35134Smarc #ifdef BSD 83*35134Smarc #define strchr index 84*35134Smarc #define strrchr rindex 85*35134Smarc #endif /* BSD */ 86*35134Smarc #ifdef VENIX 87*35134Smarc #define strchr index 88*35134Smarc #define strrchr rindex 89*35134Smarc #endif /* VENIX */ 90*35134Smarc 91*35134Smarc /* flags */ 92*35134Smarc 93*35134Smarc typedef long optflag; 94*35134Smarc #ifdef INT16 95*35134Smarc # ifndef pdp11 96*35134Smarc # define _OPTIM_ 1 97*35134Smarc # endif /* pdp11 */ 98*35134Smarc #endif /* INT16 */ 99*35134Smarc 100*35134Smarc #ifdef _OPTIM_ 101*35134Smarc #define _HIGH_ 1 102*35134Smarc #define _LOW_ _HIGH_-1 103*35134Smarc #define is_option(flag) ((flag)&0xffffL?\ 104*35134Smarc st.Flags.i[_LOW_]&(unsigned int)(flag):\ 105*35134Smarc st.Flags.i[_HIGH_]&(unsigned int)((flag)>>16)) 106*35134Smarc #define on_option(flag) ((flag)&0xffffL?\ 107*35134Smarc (st.Flags.i[_LOW_] |= (unsigned int)(flag)):\ 108*35134Smarc (st.Flags.i[_HIGH_] |= (unsigned int)((flag)>>16))) 109*35134Smarc #define off_option(flag) ((flag)&0xffffL?\ 110*35134Smarc (st.Flags.i[_LOW_] &= ~(unsigned int)(flag)):\ 111*35134Smarc (st.Flags.i[_HIGH_] &= ~(unsigned int)((flag)>>16))) 112*35134Smarc #else 113*35134Smarc #define is_option(flag) (st.Flags.l & (flag)) 114*35134Smarc #define on_option(flag) (st.Flags.l |= (flag)) 115*35134Smarc #define off_option(flag) (st.Flags.l &= ~(flag)) 116*35134Smarc #endif /* _OPTIM_ */ 117*35134Smarc 118*35134Smarc #define Fixflg 1 119*35134Smarc #define Errflg 2 120*35134Smarc #define Readpr 3 121*35134Smarc #define Monitor 4 122*35134Smarc #define Intflg 5 123*35134Smarc #define Rshflg 6 124*35134Smarc #define Execpr 7 125*35134Smarc #define Keyflg 8 126*35134Smarc #define Noset 9 127*35134Smarc #define Noglob 10 128*35134Smarc #define Allexp 11 129*35134Smarc #define Noeof 13 130*35134Smarc #define Nomatch 14 131*35134Smarc #define Markdir 15 132*35134Smarc #define Bgnice 16 133*35134Smarc #define Editvi 17 134*35134Smarc #define Viraw 18 135*35134Smarc #define Oneflg 19 136*35134Smarc #define Hashall 20 137*35134Smarc #define Stdflg 21 138*35134Smarc #define Noexec 22 139*35134Smarc #define Notify 23 140*35134Smarc #define Gmacs 24 141*35134Smarc #define Emacs 25 142*35134Smarc #define Privmod 26 143*35134Smarc #define Inproc 27 144*35134Smarc 145*35134Smarc #define FIXFLG (1<<Fixflg) /* used also as a state */ 146*35134Smarc #define ERRFLG (1<<Errflg) /* used also as a state */ 147*35134Smarc #define READPR (1<<Readpr) /* used also as a state */ 148*35134Smarc #define MONITOR (1<<Monitor)/* used also as a state */ 149*35134Smarc #define INTFLG (1<<Intflg) /* used also as a state */ 150*35134Smarc #define RSHFLG (1L<<Rshflg) 151*35134Smarc #define EXECPR (1L<<Execpr) 152*35134Smarc #define KEYFLG (1L<<Keyflg) 153*35134Smarc #define NOSET (1L<<Noset) 154*35134Smarc #define NOGLOB (1L<<Noglob) 155*35134Smarc #define ALLEXP (1L<<Allexp) 156*35134Smarc #define NOEOF (1L<<Noeof) 157*35134Smarc #define NOMATCH (1L<<Nomatch) 158*35134Smarc #define EMACS (1L<<Emacs) 159*35134Smarc #define BGNICE (1L<<Bgnice) 160*35134Smarc #define EDITVI (1L<<Editvi) 161*35134Smarc #define VIRAW (1L<<Viraw) 162*35134Smarc #define ONEFLG (1L<<Oneflg) 163*35134Smarc #define HASHALL (1L<<Hashall) 164*35134Smarc #define STDFLG (1L<<Stdflg) 165*35134Smarc #define NOEXEC (1L<<Noexec) 166*35134Smarc #define NOTIFY (1L<<Notify) 167*35134Smarc #define GMACS (1L<<Gmacs) 168*35134Smarc #define MARKDIR (1L<<Markdir) 169*35134Smarc #define PRIVM (1L<<Privmod) 170*35134Smarc #define INPROC (1L<<Inproc) 171*35134Smarc #define CFLAG (1L<<30) 172*35134Smarc 173*35134Smarc 174*35134Smarc /* states */ 175*35134Smarc /* low numbered states are same as flags */ 176*35134Smarc #define PROMPT INTFLG 177*35134Smarc #define WAITING 0x40 178*35134Smarc #define FORKED 0x80 179*35134Smarc #define TTYFLG 0x100 180*35134Smarc #define IS_TMP 0x200 /* set when TMPFD is available */ 181*35134Smarc #define NO_TMP 0x400 /* set when invalid /tmp/filename */ 182*35134Smarc #define RM_TMP 0x800 /* temp files to remove on exit */ 183*35134Smarc #define FUNCTION 0x1000 /* set when entering a function */ 184*35134Smarc #define RWAIT 0x2000 /* set when waiting for a read */ 185*35134Smarc #define BUILTIN 0x4000 /* set when processing built-in command */ 186*35134Smarc #define NONSTOP 0x8000 /* set when job cannot be stopped */ 187*35134Smarc #define READC 0x10000 /* only for BSD */ 188*35134Smarc #define VFORKED 0x20000 /* only used with VFORK mode */ 189*35134Smarc 190*35134Smarc 191*35134Smarc 192*35134Smarc /* fork constant */ 193*35134Smarc #define FORKLIM 32 194*35134Smarc /* comment delimiter */ 195*35134Smarc 196*35134Smarc #define COMCHAR '#' 197*35134Smarc 198*35134Smarc 199*35134Smarc #define NL '\n' 200*35134Smarc #define LITERAL '\'' 201*35134Smarc #define ENDOF 0 202*35134Smarc #define STRIP 0377 203*35134Smarc #define SP ' ' 204*35134Smarc #define NOEXP 1 205*35134Smarc #define HAT '^' 206*35134Smarc #define ESCAPE '\\' 207*35134Smarc #define HIGHBIT 0200 208*35134Smarc #define TO_PRINT 0100 /* bit to set for printing control char */ 209*35134Smarc 210*35134Smarc extern MSG argcount; 211*35134Smarc extern MSG argexp; 212*35134Smarc extern MSG arglist; 213*35134Smarc extern MSG atline; 214*35134Smarc extern MSG baddir; 215*35134Smarc extern MSG badexec; 216*35134Smarc extern MSG badnum; 217*35134Smarc extern MSG badop; 218*35134Smarc extern MSG badopt; 219*35134Smarc extern MSG badparam; 220*35134Smarc extern MSG badsub; 221*35134Smarc extern MSG badtrap; 222*35134Smarc extern MSG blet; 223*35134Smarc extern MSG bltfn; 224*35134Smarc extern MSG bset; 225*35134Smarc extern MSG bread; 226*35134Smarc extern MSG colon; 227*35134Smarc extern MSG coredump; 228*35134Smarc extern MSG defedit; 229*35134Smarc extern MSG defpath; 230*35134Smarc extern MSG dot; 231*35134Smarc extern MSG endmatch; 232*35134Smarc extern MSG fn_hdr; 233*35134Smarc extern MSG execpmsg; 234*35134Smarc extern MSG intbase; 235*35134Smarc extern MSG is_; 236*35134Smarc extern MSG is_alias; 237*35134Smarc extern MSG is_builtin; 238*35134Smarc extern MSG is_function; 239*35134Smarc extern MSG is_reserved; 240*35134Smarc extern MSG is_talias; 241*35134Smarc extern MSG is_xalias; 242*35134Smarc extern MSG is_xfunction; 243*35134Smarc extern MSG logout; 244*35134Smarc extern MSG mailmsg; 245*35134Smarc extern MSG minus; 246*35134Smarc extern MSG noalias; 247*35134Smarc extern MSG nofork; 248*35134Smarc extern MSG noquery; 249*35134Smarc extern MSG nosign; 250*35134Smarc extern MSG nospace; 251*35134Smarc extern MSG noswap; 252*35134Smarc extern MSG notfound; 253*35134Smarc extern MSG nullstr; 254*35134Smarc extern MSG off_; 255*35134Smarc extern MSG on_; 256*35134Smarc extern MSG opt_heading; 257*35134Smarc extern MSG parexp; 258*35134Smarc extern MSG pexists; 259*35134Smarc extern MSG ptrace; 260*35134Smarc extern MSG recursive; 261*35134Smarc extern MSG restricted; 262*35134Smarc extern MSG setpwd; 263*35134Smarc extern MSG sptbnl; 264*35134Smarc extern MSG stdprompt; 265*35134Smarc extern MSG suid_profile; 266*35134Smarc extern MSG supprompt; 267*35134Smarc extern MSG t_real; 268*35134Smarc extern MSG t_sys; 269*35134Smarc extern MSG t_user; 270*35134Smarc extern MSG toobig; 271*35134Smarc extern MSG txtbsy; 272*35134Smarc extern MSG unlimited; 273*35134Smarc extern MSG unset; 274*35134Smarc extern MSG version; 275*35134Smarc extern MSG pcsadr; 276*35134Smarc extern MSG pidadr; 277*35134Smarc extern MSG pwderr; 278*35134Smarc 279*35134Smarc 280*35134Smarc extern struct Amemory *alias; /* for alias names */ 281*35134Smarc extern struct Namnod *bltin_nodes; 282*35134Smarc 283*35134Smarc /* 284*35134Smarc * Saves the state of the shell 285*35134Smarc */ 286*35134Smarc 287*35134Smarc struct State 288*35134Smarc { 289*35134Smarc jmp_buf jmpbuf; 290*35134Smarc union 291*35134Smarc { 292*35134Smarc long l; 293*35134Smarc #ifdef _OPTIM_ 294*35134Smarc int i[2]; 295*35134Smarc #endif /* _OPTIM_ */ 296*35134Smarc } Flags; 297*35134Smarc unsigned States; 298*35134Smarc int Breakcnt; 299*35134Smarc int Execbrk; 300*35134Smarc int Loopcnt; 301*35134Smarc int Fn_depth; 302*35134Smarc int Peekc; 303*35134Smarc int Peekn; 304*35134Smarc int Aliflg; 305*35134Smarc int Reserv; 306*35134Smarc char *Cmdadr; 307*35134Smarc int Cmdline; 308*35134Smarc int Firstline; 309*35134Smarc int Exec_flag; 310*35134Smarc int Dolc; 311*35134Smarc char **Dolv; 312*35134Smarc IOPTR Iopend; 313*35134Smarc int Ioset; 314*35134Smarc IOPTR Iotemp; 315*35134Smarc int Linked; 316*35134Smarc SHFILE Standin; 317*35134Smarc FILE *Standout; 318*35134Smarc FILE *Cpipe[2]; 319*35134Smarc int Cpid; 320*35134Smarc int Wdset; 321*35134Smarc }; 322*35134Smarc 323*35134Smarc extern struct State st; 324*35134Smarc 325*35134Smarc #define flags st.Flags.l 326*35134Smarc 327*35134Smarc #define states st.States 328*35134Smarc #define breakcnt st.Breakcnt 329*35134Smarc #define loopcnt st.Loopcnt 330*35134Smarc #define execbrk st.Execbrk 331*35134Smarc #define fn_depth st.Fn_depth 332*35134Smarc #define peekc st.Peekc 333*35134Smarc #define peekn st.Peekn 334*35134Smarc #define aliflg st.Aliflg 335*35134Smarc #define reserv st.Reserv 336*35134Smarc #define cmdadr st.Cmdadr 337*35134Smarc #define cmdline st.Cmdline 338*35134Smarc #define firstline st.Firstline 339*35134Smarc #define exec_flag st.Exec_flag 340*35134Smarc #define dolc st.Dolc 341*35134Smarc #define dolv st.Dolv 342*35134Smarc #define linked st.Linked 343*35134Smarc #define iotemp st.Iotemp 344*35134Smarc #define ioset st.Ioset 345*35134Smarc #define iopend st.Iopend 346*35134Smarc #define standout st.Standout 347*35134Smarc #define standin st.Standin 348*35134Smarc #define cpipe st.Cpipe 349*35134Smarc #define cpid st.Cpid 350*35134Smarc #define wdset st.Wdset 351*35134Smarc 352*35134Smarc extern char *comdiv; 353*35134Smarc extern int errno; 354*35134Smarc extern int exitval; 355*35134Smarc extern char *lastarg; 356*35134Smarc extern long mailchk; 357*35134Smarc extern int oldexit; 358*35134Smarc extern FILE *output; 359*35134Smarc extern long ppid; 360*35134Smarc extern struct Amemory *prnames; /* for function names */ 361*35134Smarc extern int savexit; 362*35134Smarc extern int topfd; 363*35134Smarc extern char *trapcom[]; 364*35134Smarc extern BOOL trapnote; 365*35134Smarc extern BOOL login_sh; 366*35134Smarc extern int userid; 367*35134Smarc #ifdef pdp11 368*35134Smarc # ifndef INT16 369*35134Smarc # define INT16 370*35134Smarc # endif /* INT16 */ 371*35134Smarc #endif /* pdp11 */ 372*35134Smarc 373*35134Smarc #ifdef INT16 374*35134Smarc /* save space */ 375*35134Smarc #undef putc 376*35134Smarc #define putc fputc 377*35134Smarc #endif /* INT16 */ 378