|
|
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.