|
|
1.1 ! root 1: /* ! 2: * sh/sh.h ! 3: * Bourne shell. ! 4: * Header file. ! 5: */ ! 6: ! 7: #include <stdio.h> ! 8: #include <setjmp.h> ! 9: #include <string.h> ! 10: ! 11: #define STRSIZE 2000 /* Maximum length of single token */ ! 12: #define IALSIZE 8 /* Initial argument list size */ ! 13: #define DSTACKN 30 /* Directory stack depth */ ! 14: #define NOTREACHED return ! 15: ! 16: /* ! 17: * Masks for looking up lextab. ! 18: */ ! 19: #define MNQUO 0001 /* Special in argument */ ! 20: #define MDQUO 0002 /* Special in double quotes */ ! 21: #define MHERE 0004 /* Special in here document */ ! 22: #define MRVAR (MBVAR|MDIGI) /* Valid in regular variable name */ ! 23: #define MSVAR 0010 /* Valid in special variable name */ ! 24: #define MDIGI 0020 /* Is an ascii digit */ ! 25: #define MBVAR 0040 /* Valid 1st char in regular var name */ ! 26: #define MNAME 0100 /* Does not start a name */ ! 27: #define MGLOB 0200 /* Must call glob */ ! 28: ! 29: /* ! 30: * Determine if a character is a member of the given class. ! 31: * (This depends of the fact that EOF == -1). ! 32: */ ! 33: #define class(c, m) (c>=EOF && c<=0177 && (lextab[1+c]&m)) ! 34: ! 35: /* ! 36: * Types of nodes. ! 37: */ ! 38: #define NNULL 0 /* Null */ ! 39: #define NFOR 1 /* For */ ! 40: #define NCASE 2 /* Case */ ! 41: #define NWHILE 3 /* While */ ! 42: #define NUNTIL 4 /* Until */ ! 43: #define NIF 5 /* If */ ! 44: #define NELSE 6 /* Else */ ! 45: #define NCOMS 7 /* Command sequence */ ! 46: #define NLIST 8 /* Command list */ ! 47: #define NBACK 9 /* Background process */ ! 48: #define NPIPE 10 /* Pipe */ ! 49: #define NPARN 11 /* New shell */ ! 50: #define NBRAC 12 /* Command group */ ! 51: #define NANDF 13 /* Logical and operator */ ! 52: #define NORF 14 /* Logical or operator */ ! 53: #define NARGS 15 /* Argument string */ ! 54: #define NIORS 16 /* Redirection of io */ ! 55: #define NASSG 17 /* Assignment keyword */ ! 56: #define NFOR2 18 /* Second part for, in list scan */ ! 57: #define NCASE2 19 /* Second part case, command */ ! 58: #define NCASE3 20 /* Third part case, pattern */ ! 59: #define NCTRL 21 /* Control statement in list */ ! 60: #define NRPIPE 22 /* Named pipe for read */ ! 61: #define NWPIPE 23 /* Named pipe for write */ ! 62: #define NFUNC 24 /* Shell function */ ! 63: #define NRET 25 /* Return */ ! 64: ! 65: /* ! 66: * Node. ! 67: */ ! 68: typedef struct node { ! 69: int n_type; /* Type of node */ ! 70: struct node *n_next; /* Pointer to next */ ! 71: union { ! 72: struct node *nu_auxp; /* Auxiliary pointer */ ! 73: char *nu_strp; /* Pointer to string */ ! 74: } n_u; ! 75: } NODE; ! 76: #define n_auxp n_u.nu_auxp ! 77: #define n_strp n_u.nu_strp ! 78: ! 79: /* ! 80: * Flags in variables. ! 81: */ ! 82: #define VEXP 001 /* Variable is exported */ ! 83: #define VRDO 002 /* Read only */ ! 84: #define VSET 004 /* Variable is used by shell */ ! 85: ! 86: /* ! 87: * Enviroment list and variable structure. ! 88: */ ! 89: typedef struct var { ! 90: int v_flag; /* Flags */ ! 91: struct var *v_next; /* Pointer to next entry */ ! 92: char *v_strp; /* Pointer to string */ ! 93: } VAR; ! 94: ! 95: /* ! 96: * Buffer structure. ! 97: */ ! 98: typedef struct buf { ! 99: struct buf *b_next; /* Pointer to next */ ! 100: int b_size; /* Size of buffer */ ! 101: } BUF; ! 102: ! 103: /* ! 104: * Per executing command data structure. ! 105: * Used for break/continue. ! 106: */ ! 107: typedef struct con { ! 108: struct con *c_next; /* Pointer to next */ ! 109: NODE *c_node; /* Node which created this control */ ! 110: BUF **c_bpp; /* Current free buffer */ ! 111: jmp_buf c_envl; /* Enviroment list */ ! 112: } CON; ! 113: ! 114: /* ! 115: * Session types. ! 116: */ ! 117: #define SINIT 0 /* Initial session */ ! 118: #define SARGS 1 /* String */ ! 119: #define SARGV 2 /* Vector of strings */ ! 120: #define SFILE 3 /* File name */ ! 121: #define SSTR 4 /* Open stream */ ! 122: ! 123: /* ! 124: * Per session information structure. ! 125: */ ! 126: typedef struct ses { ! 127: struct ses *s_next; ! 128: int s_type; ! 129: int s_flag; ! 130: NODE *s_node; ! 131: CON *s_con; ! 132: BUF **s_bpp; ! 133: jmp_buf s_envl; ! 134: char *s_strp; ! 135: char **s_argv; ! 136: FILE *s_ifp; ! 137: } SES; ! 138: ! 139: /* ! 140: * Session long jump codes ! 141: */ ! 142: #define RSET 0 /* Initial setjmp call */ ! 143: #define REOF 1 /* parse matched start */ ! 144: #define RCMD 2 /* parse matched command line */ ! 145: #define RERR 3 /* parse matched error */ ! 146: #define RINT 4 /* Interrupt recovery */ ! 147: #define RNOSBRK 5 /* no more memory from alloc */ ! 148: #define RSYSER 6 /* system returned -1 */ ! 149: #define RUABORT 7 /* user requested error abort */ ! 150: #define RUEXITS 8 /* user requested exit command */ ! 151: #define RBRKCON 9 /* break or continue beyond program */ ! 152: #define RNOWAY 10 /* Shell assertion failed */ ! 153: ! 154: /* ! 155: * Interrupt recovery and set contexts. ! 156: * Used to determine recovery action and default signals. ! 157: */ ! 158: #define IRDY 0 /* In session */ ! 159: #define ILEX 1 /* Parse in progress */ ! 160: #define ICMD 2 /* Prior to next command execution */ ! 161: #define IEVAL 3 /* Command evaluation in progress */ ! 162: #define IBACK 4 /* Background process */ ! 163: #define IFORK 5 /* Child after fork */ ! 164: #define IPROF 6 /* Reading /etc/profile for login */ ! 165: ! 166: /* ! 167: * Evaluation contexts. ! 168: */ ! 169: #define EWORD 0 /* Evaluate $N, `cmd`, strip quotes */ ! 170: #define EHERE 1 /* Evaluate $N, `cmd`, ignore quotes */ ! 171: #define EARGS 2 /* Evaluete $N, `cmd`, strip quotes, *?[, blanks */ ! 172: #define EPATT 3 /* Evaluate for pattern match */ ! 173: ! 174: ! 175: /* ! 176: * NB: Here-document processing in shell functions places extra demands on ! 177: * the management of temporary files. When a shell function is interned, any ! 178: * here documents created within the function are turned into temporary ! 179: * files which must persist for the life of the function (ie, until the ! 180: * shell exits or the function is removed via "unset -f"). ! 181: * ! 182: * The following data structure is intended to allow the temporary-file ! 183: * context to be managed in the manner required. A pointer to a list of these ! 184: * structures is stored in the function definition, taken from the global ! 185: * list of temporary files when a function is defined. ! 186: * ! 187: * Related functions: ! 188: * def_sh_fn (nodep) ! 189: * Captures the current temporary-file context and attaches it ! 190: * to the shell function being defined. ! 191: * remember_temp (filename) ! 192: * Adds a filename to the current global list of temporary ! 193: * files (copies filename to private buffer). ! 194: * capture_temp () ! 195: * Detaches the global list of temporary files and returns ! 196: * the list to the caller. ! 197: * unlink_temp (templist) ! 198: * Walks over the list of temporary files, unlinking the files ! 199: * and deallocating the list nodes. ! 200: * forget_temp (templist) ! 201: * Deallocates the memory for the list of temporary files. ! 202: */ ! 203: ! 204: typedef struct temp_file TEMP_FILE; ! 205: ! 206: struct temp_file { ! 207: TEMP_FILE * tf_next; ! 208: char * tf_name; ! 209: }; ! 210: ! 211: ! 212: /* ! 213: * Shell functions. ! 214: */ ! 215: typedef struct shfunc { ! 216: struct shfunc *fn_link; ! 217: int fn_hash; ! 218: char *fn_name; ! 219: NODE *fn_body; ! 220: TEMP_FILE * fn_temp; ! 221: } SHFUNC; ! 222: ! 223: ! 224: /* ! 225: * NB : The shell is required to permit redirections of built-ins and special ! 226: * built-in operations in such a way that they are not run in subshells (since ! 227: * they have to affect the top-level environment). To permit this, the ! 228: * redirection code makes duplicates of file descriptors it overwrites and ! 229: * records all the information necessary to reverse the effect of the ! 230: * redirections on the global environment. This structure holds the "undo" ! 231: * information. Note that "ru_newfd" may be set to -1 if the fd that was ! 232: * redirected did not originally refer to an open file. ! 233: * ! 234: * Related functions: ! 235: * redirect (iovp, undo) ! 236: * The "undo" argument is an optional pointer to the head of a ! 237: * list of REDIR_UNDO entries. ! 238: * redirundo (undo) ! 239: * Processes a list of REDIR_UNDO entries. ! 240: */ ! 241: ! 242: typedef struct redir_undo REDIR_UNDO; ! 243: ! 244: struct redir_undo { ! 245: REDIR_UNDO * ru_next; /* link to next undo item */ ! 246: int ru_oldfd; /* fd changed by redirection */ ! 247: int ru_newfd; /* duplicate of original fd */ ! 248: }; ! 249: ! 250: ! 251: /* ! 252: * Flags for controlling collect () in lex.c ! 253: */ ! 254: ! 255: enum { ! 256: CONSUME_BACKSLASH, /* ! 257: * Allow back-slash quoting of anything and ! 258: * consume the backslashes. ! 259: */ ! 260: BACKSLASH_END, /* ! 261: * Recognise backslash-quoting of the end ! 262: * character, but retain the backslash. ! 263: */ ! 264: NO_BACKSLASH, /* backslashes are ordinary */ ! 265: NO_ERRORS /* backslashes are ordinary, silent errors */ ! 266: }; ! 267: ! 268: ! 269: /* ! 270: * Global variables. ! 271: * Run time and set time flags. ! 272: */ ! 273: extern char shflags[]; /* Flag array */ ! 274: extern char shfnams[]; /* Flag name array */ ! 275: ! 276: #define eflag shflags[0] /* Exit on non-zero status */ ! 277: #define kflag shflags[1] /* All assignments into environ */ ! 278: #define nflag shflags[2] /* Do not execute commands */ ! 279: #define pflag shflags[3] /* Unknown */ ! 280: #define tflag shflags[4] /* Exit after read/exec one command */ ! 281: #define uflag shflags[5] /* Unset variables are errors */ ! 282: #define vflag shflags[6] /* Print input as read */ ! 283: #define xflag shflags[7] /* Print commands as executed */ ! 284: ! 285: #define cflag shflags[8] /* Execute argument as command */ ! 286: #define iflag shflags[9] /* Be interactive shell */ ! 287: #define rflag shflags[10] /* Restricted shell */ ! 288: #define sflag shflags[11] /* input<&0, output>&2 */ ! 289: ! 290: #define lgnflag shflags[12] /* Login shell */ ! 291: #define no1flag shflags[13] /* Invoked shell */ ! 292: #define bckflag shflags[14] /* Background process */ ! 293: #define nllflag shflags[15] /* Forked shell */ ! 294: #define cmdflag shflags[16] /* Command file processor */ ! 295: ! 296: /* Shell status housekeeping */ ! 297: extern jmp_buf restart; /* Restart execution context */ ! 298: extern SHFUNC *sh_fnp; /* User-defined shell function list */ ! 299: extern int in_sh_fn; /* Executing shell function */ ! 300: extern int ret_done; /* "return" executed */ ! 301: extern int sargc; /* Argument count to shell */ ! 302: extern char *sarg0; /* Name shell called with */ ! 303: extern char **sargv; /* Argument vector to shell */ ! 304: extern char **senvp; /* Environment vector to shell */ ! 305: extern char **sargp; /* Current argument to shell */ ! 306: extern char *scmdp; /* Path/filename of command file */ ! 307: extern int nargc; /* New argument count, for command */ ! 308: extern char **nargv; /* New argument vector, for command */ ! 309: extern char **nenvp; /* New environment, for command */ ! 310: extern char **niovp; /* Io redirection, for command */ ! 311: extern NODE *nctlp; /* Control node, for command */ ! 312: extern SES *sesp; /* Current session structure */ ! 313: extern int yyline; /* Yacc command line counter */ ! 314: extern int shpid; /* Shell's process id */ ! 315: extern int slret; /* Exit status of last command */ ! 316: extern int sback; /* Pid of last background command */ ! 317: extern int spipe; /* Pid of last pipe process */ ! 318: extern int ufmask; /* File creation mask */ ! 319: /* Other internal flags. */ ! 320: extern int comflag; /* Command line is complete?? */ ! 321: extern int errflag; /* Set by call to printe */ ! 322: extern int keyflag; /* Look for keyword in next word */ ! 323: extern int noeflag; /* Turn off errors */ ! 324: extern int prpflag; /* Do prompt before next read */ ! 325: extern int readflag; /* Doing read command? */ ! 326: /* Parameters used by shell. */ ! 327: extern char *vhome; /* Home directory */ ! 328: extern char *vpath; /* Search pathname */ ! 329: extern char *vmail; /* Mail file */ ! 330: extern char *vps1; /* Prompt string 1 */ ! 331: extern char *vps2; /* Prompt string 2 */ ! 332: extern char *vifs; /* Internal field seperators */ ! 333: extern char *vshell; /* Shell to use */ ! 334: /* Shell data */ ! 335: extern char strt[STRSIZE]; /* String buffer */ ! 336: extern char *strp; /* Pointer in string buffer */ ! 337: extern VAR *varp; /* Pointer to shell variables */ ! 338: extern char *dstack[DSTACKN]; /* Directory stack */ ! 339: extern int dstkp; /* Directory stack pointer */ ! 340: ! 341: /* Tables */ ! 342: extern char lextab[]; /* Character type table */ ! 343: /* Data external to shell */ ! 344: extern int errno; /* System call error number */ ! 345: extern char *signame[]; /* Wait status message table */ ! 346: ! 347: /* ! 348: * Functions. ! 349: */ ! 350: extern char *shtmp(); /* in main.c */ ! 351: extern char *salloc(); /* in alloc.c */ ! 352: extern char *balloc(); /* in alloc.c */ ! 353: extern char *duplstr(); /* in alloc.c */ ! 354: extern char **makargl(); /* in alloc.c */ ! 355: extern char **addargl(); /* in alloc.c */ ! 356: extern BUF **savebuf(); /* in alloc.c */ ! 357: extern char **vdupl(); /* in alloc.c */ ! 358: extern char *gany(); /* in glob.c */ ! 359: extern int sigintr(); /* in trap.c */ ! 360: extern VAR *findvar(); /* in var.c */ ! 361: extern VAR *setsvar(); /* in var.c */ ! 362: extern VAR *flagvar(); /* in var.c */ ! 363: extern VAR *assnvar(); /* in var.c */ ! 364: extern char *convvar(); /* in var.c */ ! 365: extern char **envlvar(); /* in var.c */ ! 366: extern char *_getwd(); /* in /lib/libc.a */ ! 367: #define index(cp, c) strchr((cp), (c)) ! 368: #define rindex(cp, c) strrchr((cp), (c)) ! 369: ! 370: /* NB: new stuff for shell functions */ ! 371: extern TEMP_FILE * capture_temp (); /* main.c */ ! 372: extern void unlink_temp (); /* main.c */ ! 373: extern void cleanup_shell_fns (); /* exec3.c */ ! 374: ! 375: #ifdef ALLOC_DEBUG ! 376: struct alloc_debug { ! 377: char * name; ! 378: int count; ! 379: int maxcount; ! 380: }; ! 381: # define ALLOC_COUNT(x) struct alloc_debug x##debug = { #x }; ! 382: # define ALLOC_ALLOC(x) alloc_alloc (& x##debug); ! 383: # define ALLOC_FREE(x) x##debug.count --; ! 384: # ! 385: #else ! 386: # define ALLOC_COUNT(x) ! 387: # define ALLOC_ALLOC(x) ! 388: # define ALLOC_FREE(x) ! 389: #endif ! 390: ! 391: /* end of sh/sh.h */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.