1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
|
/* $NetBSD: shell.h,v 1.29 2019/01/22 13:48:28 kre Exp $ */
/*-
* Copyright (c) 1991, 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. 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.
*
* @(#)shell.h 8.2 (Berkeley) 5/4/95
*/
/*
* The follow should be set to reflect the type of system you have:
* JOBS -> 1 if you have Berkeley job control, 0 otherwise.
* 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 -o debug' to turn on)
* define DEBUG=2 to compile in and enable debugging.
* define DEBUG=3 for DEBUG==2 + enable most standard debug output
* define DEBUG=4 for DEBUG==2 + enable absolutely everything
* define DO_SHAREDVFORK to indicate that vfork(2) shares its address
* with its parent.
* define BOGUS_NOT_COMMAND to allow ! reserved words in weird places
* (traditional ash behaviour.)
*
* When debugging is on, debugging info will be written to ./trace and
* a quit signal will generate a core dump.
*/
#ifndef SHELL_H
#define SHELL_H
#include <sys/param.h>
#define JOBS 1
#ifndef BSD
#define BSD 1
#endif
#ifndef DO_SHAREDVFORK
#if defined(__NetBSD_Version__) && __NetBSD_Version__ >= 104000000
#define DO_SHAREDVFORK
#endif
#endif
typedef void *pointer;
#ifndef NULL
#define NULL (void *)0
#endif
#ifndef STATIC
#define STATIC /* empty */
#endif
#define MKINIT /* empty */
#include <sys/cdefs.h>
extern const char nullstr[1]; /* null string */
#ifdef SMALL
#undef DEBUG
#endif
#ifdef DEBUG
extern uint64_t DFlags;
extern int ShNest;
/*
* This is selected as there are 26 letters in ascii - not that that
* matters for anything, just makes it easier to assign a different
* command letter to each debug option. We currently use only 18
* so this could be reduced, but that is of no real benefit. It can also
* be increased, but that both limits the maximum value tha can be
* used with DBG_EXTRAS(), and causes problems with verbose option naming.
*/
#define DBG_VBOSE_SHIFT 27
#define DBG_EXTRAS(n) ((DBG_VBOSE_SHIFT * 2) + (n))
/*
* Macros to enable tracing, so the mainainer can control
* just how much debug output is dumped to the trace file
*
* In the X forms, "xtra" can be any legal C statement(s) without (bare) commas
* executed if the relevant debug flag is enabled, after any tracing output.
*/
#define CTRACE(when, param) do { \
if ((DFlags & (when)) != 0) \
trace param; \
} while (/*CONSTCOND*/ 0)
#define CCTRACE(when,cond,param) do { \
if ((cond) && (DFlags & (when)) != 0) \
trace param; \
} while (/*CONSTCOND*/ 0)
#define CTRACEV(when, param) do { \
if ((DFlags & (when)) != 0) \
tracev param; \
} while (/*CONSTCOND*/ 0)
#define XTRACE(when, param, xtra) do { \
if ((DFlags & (when)) != 0) { \
trace param; \
xtra; \
} \
} while (/*CONSTCOND*/ 0)
#define VTRACE(when, param) do { \
if ((DFlags & \
(when)<<DBG_VBOSE_SHIFT) != 0) \
trace param; \
} while (/*CONSTCOND*/ 0)
#define CVTRACE(when,cond,param) do { \
if ((cond) && (DFlags & \
(when)<<DBG_VBOSE_SHIFT) != 0) \
trace param; \
} while (/*CONSTCOND*/ 0)
#define VTRACEV(when, param) do { \
if ((DFlags & \
(when)<<DBG_VBOSE_SHIFT) != 0) \
tracev param; \
} while (/*CONSTCOND*/ 0)
#define VXTRACE(when, param, xtra) do { \
if ((DFlags & \
(when)<<DBG_VBOSE_SHIFT) != 0) {\
trace param; \
xtra; \
} \
} while (/*CONSTCOND*/ 0)
#define SHELL_FORKED() ShNest++
#define VFORK_BLOCK { const int _ShNest = ShNest;
#define VFORK_END }
#define VFORK_UNDO() ShNest = _ShNest
#define DBG_ALWAYS (1LL << 0)
#define DBG_PARSE (1LL << 1) /* r (read commands) */
#define DBG_EVAL (1LL << 2) /* e */
#define DBG_EXPAND (1LL << 3) /* x */
#define DBG_JOBS (1LL << 4) /* j */
#define DBG_PROCS (1LL << 5) /* p */
#define DBG_REDIR (1LL << 6) /* f (fds) */
#define DBG_CMDS (1LL << 7) /* c */
#define DBG_ERRS (1LL << 8) /* z (?) */
#define DBG_WAIT (1LL << 9) /* w */
#define DBG_TRAP (1LL << 10) /* t */
#define DBG_VARS (1LL << 11) /* v */
#define DBG_INPUT (1LL << 12) /* i */
#define DBG_OUTPUT (1LL << 13) /* o */
#define DBG_MEM (1LL << 14) /* m */
#define DBG_ARITH (1LL << 15) /* a */
#define DBG_HISTORY (1LL << 16) /* h */
#define DBG_SIG (1LL << 17) /* s */
#define DBG_MATCH (1LL << 18) /* g (glob) */
#define DBG_LEXER (1LL << 19) /* l */
/*
* reserved extras: b=builtins y=alias
* still free: d k n q u
*/
/* use VTRACE(DBG_ALWAYS, (...)) to test this one */
#define DBG_VERBOSE (1LL << DBG_VBOSE_SHIFT)
/* DBG_EXTRAS 0 .. 9 (max) only - non-alpha options (no VTRACE !!) */
#define DBG_U0 (1LL << DBG_EXTRAS(0)) /* 0 - ad-hoc extra flags */
#define DBG_U1 (1LL << DBG_EXTRAS(1)) /* 1 - for short term */
#define DBG_U2 (1LL << DBG_EXTRAS(2)) /* 2 - extra tracing */
#define DBG_U3 (1LL << DBG_EXTRAS(3)) /* 3 - when needed */
/* 4, 5, & 6 currently free */
#define DBG_LINE (1LL << DBG_EXTRAS(7)) /* @ ($LINENO) */
#define DBG_PID (1LL << DBG_EXTRAS(8)) /* $ ($$) */
#define DBG_NEST (1LL << DBG_EXTRAS(9)) /* ^ */
/* 26 lower case, 26 upper case, always, verbose, and 10 extras: 64 bits */
extern void set_debug(const char *, int);
#else /* DEBUG */
#define CTRACE(when, param) /* conditional normal trace */
#define CCTRACE(when, cond, param) /* more conditional normal trace */
#define CTRACEV(when, param) /* conditional varargs trace */
#define XTRACE(when, param, extra) /* conditional trace, plus more */
#define VTRACE(when, param) /* conditional verbose trace */
#define CVTRACE(when, cond, param) /* more conditional verbose trace */
#define VTRACEV(when, param) /* conditional verbose varargs trace */
#define VXTRACE(when, param, extra) /* cond verbose trace, plus more */
#define SHELL_FORKED()
#define VFORK_BLOCK
#define VFORK_END
#define VFORK_UNDO()
#endif /* DEBUG */
#endif /* SHELL_H */
|