summaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
author"Vladimir N. Oleynik" <dzo@simtreas.ru>2006-01-15 14:21:01 +0000
committer"Vladimir N. Oleynik" <dzo@simtreas.ru>2006-01-15 14:21:01 +0000
commitfb29b462012e43d2559f0cdf7b1051d4a7f82ef6 (patch)
tree19d6f5ee551fb129cc186e8bbf4543a06cd67059 /shell
parent7ca61b6f3379bf66b446617b8834d92c13b366dd (diff)
downloadbusybox-w32-fb29b462012e43d2559f0cdf7b1051d4a7f82ef6.tar.gz
busybox-w32-fb29b462012e43d2559f0cdf7b1051d4a7f82ef6.tar.bz2
busybox-w32-fb29b462012e43d2559f0cdf7b1051d4a7f82ef6.zip
sync with dash_0.5.3-1
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c569
1 files changed, 267 insertions, 302 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 4fc3e0e15..0697a4785 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -36,7 +36,7 @@
36 * Modified by Paul Mundt <lethal@linux-sh.org> (c) 2004 to support 36 * Modified by Paul Mundt <lethal@linux-sh.org> (c) 2004 to support
37 * dynamic variables. 37 * dynamic variables.
38 * 38 *
39 * Modified by Vladimir Oleynik <dzo@simtreas.ru> (c) 2001-2004 to be 39 * Modified by Vladimir Oleynik <dzo@simtreas.ru> (c) 2001-2005 to be
40 * used in busybox and size optimizations, 40 * used in busybox and size optimizations,
41 * rewrote arith (see notes to this), added locale support, 41 * rewrote arith (see notes to this), added locale support,
42 * rewrote dynamic variables. 42 * rewrote dynamic variables.
@@ -66,7 +66,6 @@
66#endif 66#endif
67 67
68#include <sys/types.h> 68#include <sys/types.h>
69#include <sys/cdefs.h>
70#include <sys/ioctl.h> 69#include <sys/ioctl.h>
71#include <sys/param.h> 70#include <sys/param.h>
72#include <sys/resource.h> 71#include <sys/resource.h>
@@ -91,7 +90,6 @@
91#include <setjmp.h> 90#include <setjmp.h>
92#include <signal.h> 91#include <signal.h>
93#include <stdint.h> 92#include <stdint.h>
94#include <sysexits.h>
95#include <time.h> 93#include <time.h>
96#include <fnmatch.h> 94#include <fnmatch.h>
97 95
@@ -130,7 +128,7 @@ static int *dash_errno;
130 128
131 129
132#ifdef CONFIG_ASH_ALIAS 130#ifdef CONFIG_ASH_ALIAS
133/* $NetBSD: alias.h,v 1.5 2002/11/24 22:35:38 christos Exp $ */ 131/* alias.h */
134 132
135#define ALIASINUSE 1 133#define ALIASINUSE 1
136#define ALIASDEAD 2 134#define ALIASDEAD 2
@@ -150,12 +148,12 @@ static int unalias(const char *);
150static void printalias(const struct alias *); 148static void printalias(const struct alias *);
151#endif 149#endif
152 150
153/* $NetBSD: cd.h,v 1.3 2002/11/24 22:35:39 christos Exp $ */ 151/* cd.h */
154 152
155 153
156static void setpwd(const char *, int); 154static void setpwd(const char *, int);
157 155
158/* $NetBSD: error.h,v 1.15 2002/11/24 22:35:39 christos Exp $ */ 156/* error.h */
159 157
160 158
161/* 159/*
@@ -189,8 +187,6 @@ static int exception;
189static volatile int suppressint; 187static volatile int suppressint;
190static volatile sig_atomic_t intpending; 188static volatile sig_atomic_t intpending;
191 189
192static int exerrno; /* Last exec error, error for EXEXEC */
193
194/* exceptions */ 190/* exceptions */
195#define EXINT 0 /* SIGINT received */ 191#define EXINT 0 /* SIGINT received */
196#define EXERROR 1 /* a generic error */ 192#define EXERROR 1 /* a generic error */
@@ -240,7 +236,7 @@ static volatile sig_atomic_t pendingsigs;
240static void exraise(int) __attribute__((__noreturn__)); 236static void exraise(int) __attribute__((__noreturn__));
241static void onint(void) __attribute__((__noreturn__)); 237static void onint(void) __attribute__((__noreturn__));
242 238
243static void error(const char *, ...) __attribute__((__noreturn__)); 239static void sh_error(const char *, ...) __attribute__((__noreturn__));
244static void exerror(int, const char *, ...) __attribute__((__noreturn__)); 240static void exerror(int, const char *, ...) __attribute__((__noreturn__));
245 241
246static void sh_warnx(const char *, ...); 242static void sh_warnx(const char *, ...);
@@ -276,7 +272,7 @@ static void forceinton(void)
276 }) 272 })
277#endif /* CONFIG_ASH_OPTIMIZE_FOR_SIZE */ 273#endif /* CONFIG_ASH_OPTIMIZE_FOR_SIZE */
278 274
279/* $NetBSD: expand.h,v 1.13 2002/11/24 22:35:40 christos Exp $ */ 275/* expand.h */
280 276
281struct strlist { 277struct strlist {
282 struct strlist *next; 278 struct strlist *next;
@@ -313,7 +309,7 @@ static int casematch(union node *, char *);
313static void expari(int); 309static void expari(int);
314#endif 310#endif
315 311
316/* $NetBSD: eval.h,v 1.13 2002/11/24 22:35:39 christos Exp $ */ 312/* eval.h */
317 313
318static char *commandname; /* currently executing command */ 314static char *commandname; /* currently executing command */
319static struct strlist *cmdenviron; /* environment for builtin command */ 315static struct strlist *cmdenviron; /* environment for builtin command */
@@ -492,7 +488,7 @@ struct funcnode {
492 488
493 489
494static void freefunc(struct funcnode *); 490static void freefunc(struct funcnode *);
495/* $NetBSD: parser.h,v 1.15 2002/11/24 22:35:42 christos Exp $ */ 491/* parser.h */
496 492
497/* control characters in argument strings */ 493/* control characters in argument strings */
498#define CTL_FIRST '\201' /* first 'special' character */ 494#define CTL_FIRST '\201' /* first 'special' character */
@@ -591,7 +587,7 @@ static void fixredir(union node *, const char *, int);
591static const char *const *findkwd(const char *); 587static const char *const *findkwd(const char *);
592static char *endofname(const char *); 588static char *endofname(const char *);
593 589
594/* $NetBSD: shell.h,v 1.16 2003/01/22 20:36:04 dsl Exp $ */ 590/* shell.h */
595 591
596typedef void *pointer; 592typedef void *pointer;
597 593
@@ -693,7 +689,7 @@ static const char *tokname(int tok)
693 return buf; 689 return buf;
694} 690}
695 691
696/* $NetBSD: machdep.h,v 1.10 2002/10/07 14:26:08 christos Exp $ */ 692/* machdep.h */
697 693
698/* 694/*
699 * Most machines require the value returned from malloc to be aligned 695 * Most machines require the value returned from malloc to be aligned
@@ -1160,7 +1156,7 @@ static const char syntax_index_table[258] = {
1160 1156
1161#endif /* USE_SIT_FUNCTION */ 1157#endif /* USE_SIT_FUNCTION */
1162 1158
1163/* $NetBSD: alias.c,v 1.11 2002/11/24 22:35:38 christos Exp $ */ 1159/* alias.c */
1164 1160
1165 1161
1166#define ATABSIZE 39 1162#define ATABSIZE 39
@@ -1207,29 +1203,27 @@ static struct nodelist *copynodelist(struct nodelist *);
1207static char *nodesavestr(char *); 1203static char *nodesavestr(char *);
1208 1204
1209 1205
1210 1206static int evalstring(char *, int mask);
1211static void evalstring(char *);
1212union node; /* BLETCH for ansi C */ 1207union node; /* BLETCH for ansi C */
1213static void evaltree(union node *, int); 1208static void evaltree(union node *, int);
1214static void evalbackcmd(union node *, struct backcmd *); 1209static void evalbackcmd(union node *, struct backcmd *);
1215 1210
1216/* in_function returns nonzero if we are currently evaluating a function */
1217#define in_function() funcnest
1218static int evalskip; /* set if we are skipping commands */ 1211static int evalskip; /* set if we are skipping commands */
1219static int skipcount; /* number of levels to skip */ 1212static int skipcount; /* number of levels to skip */
1220static int funcnest; /* depth of function calls */ 1213static int funcnest; /* depth of function calls */
1221 1214
1222/* reasons for skipping commands (see comment on breakcmd routine) */ 1215/* reasons for skipping commands (see comment on breakcmd routine) */
1223#define SKIPBREAK 1 1216#define SKIPBREAK (1 << 0)
1224#define SKIPCONT 2 1217#define SKIPCONT (1 << 1)
1225#define SKIPFUNC 3 1218#define SKIPFUNC (1 << 2)
1226#define SKIPFILE 4 1219#define SKIPFILE (1 << 3)
1220#define SKIPEVAL (1 << 4)
1227 1221
1228/* 1222/*
1229 * This file was generated by the mkbuiltins program. 1223 * This file was generated by the mkbuiltins program.
1230 */ 1224 */
1231 1225
1232#ifdef JOBS 1226#if JOBS
1233static int bgcmd(int, char **); 1227static int bgcmd(int, char **);
1234#endif 1228#endif
1235static int breakcmd(int, char **); 1229static int breakcmd(int, char **);
@@ -1246,7 +1240,7 @@ static int execcmd(int, char **);
1246static int exitcmd(int, char **); 1240static int exitcmd(int, char **);
1247static int exportcmd(int, char **); 1241static int exportcmd(int, char **);
1248static int falsecmd(int, char **); 1242static int falsecmd(int, char **);
1249#ifdef JOBS 1243#if JOBS
1250static int fgcmd(int, char **); 1244static int fgcmd(int, char **);
1251#endif 1245#endif
1252#ifdef CONFIG_ASH_GETOPTS 1246#ifdef CONFIG_ASH_GETOPTS
@@ -1256,7 +1250,7 @@ static int hashcmd(int, char **);
1256#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET 1250#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET
1257static int helpcmd(int argc, char **argv); 1251static int helpcmd(int argc, char **argv);
1258#endif 1252#endif
1259#ifdef JOBS 1253#if JOBS
1260static int jobscmd(int, char **); 1254static int jobscmd(int, char **);
1261#endif 1255#endif
1262#ifdef CONFIG_ASH_MATH_SUPPORT 1256#ifdef CONFIG_ASH_MATH_SUPPORT
@@ -1276,18 +1270,18 @@ static int umaskcmd(int, char **);
1276static int unsetcmd(int, char **); 1270static int unsetcmd(int, char **);
1277static int waitcmd(int, char **); 1271static int waitcmd(int, char **);
1278static int ulimitcmd(int, char **); 1272static int ulimitcmd(int, char **);
1279#ifdef JOBS 1273#if JOBS
1280static int killcmd(int, char **); 1274static int killcmd(int, char **);
1281#endif 1275#endif
1282 1276
1283/* $NetBSD: mail.h,v 1.9 2002/11/24 22:35:40 christos Exp $ */ 1277/* mail.h */
1284 1278
1285#ifdef CONFIG_ASH_MAIL 1279#ifdef CONFIG_ASH_MAIL
1286static void chkmail(void); 1280static void chkmail(void);
1287static void changemail(const char *); 1281static void changemail(const char *);
1288#endif 1282#endif
1289 1283
1290/* $NetBSD: exec.h,v 1.20 2003/01/22 20:36:04 dsl Exp $ */ 1284/* exec.h */
1291 1285
1292/* values of cmdtype */ 1286/* values of cmdtype */
1293#define CMDUNKNOWN -1 /* no entry in table for command */ 1287#define CMDUNKNOWN -1 /* no entry in table for command */
@@ -1327,7 +1321,7 @@ static const struct builtincmd builtincmd[] = {
1327#ifdef CONFIG_ASH_ALIAS 1321#ifdef CONFIG_ASH_ALIAS
1328 { BUILTIN_REG_ASSG "alias", aliascmd }, 1322 { BUILTIN_REG_ASSG "alias", aliascmd },
1329#endif 1323#endif
1330#ifdef JOBS 1324#if JOBS
1331 { BUILTIN_REGULAR "bg", bgcmd }, 1325 { BUILTIN_REGULAR "bg", bgcmd },
1332#endif 1326#endif
1333 { BUILTIN_SPEC_REG "break", breakcmd }, 1327 { BUILTIN_SPEC_REG "break", breakcmd },
@@ -1345,7 +1339,7 @@ static const struct builtincmd builtincmd[] = {
1345 { BUILTIN_SPEC_REG "exit", exitcmd }, 1339 { BUILTIN_SPEC_REG "exit", exitcmd },
1346 { BUILTIN_SPEC_REG_ASSG "export", exportcmd }, 1340 { BUILTIN_SPEC_REG_ASSG "export", exportcmd },
1347 { BUILTIN_REGULAR "false", falsecmd }, 1341 { BUILTIN_REGULAR "false", falsecmd },
1348#ifdef JOBS 1342#if JOBS
1349 { BUILTIN_REGULAR "fg", fgcmd }, 1343 { BUILTIN_REGULAR "fg", fgcmd },
1350#endif 1344#endif
1351#ifdef CONFIG_ASH_GETOPTS 1345#ifdef CONFIG_ASH_GETOPTS
@@ -1355,7 +1349,7 @@ static const struct builtincmd builtincmd[] = {
1355#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET 1349#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET
1356 { BUILTIN_NOSPEC "help", helpcmd }, 1350 { BUILTIN_NOSPEC "help", helpcmd },
1357#endif 1351#endif
1358#ifdef JOBS 1352#if JOBS
1359 { BUILTIN_REGULAR "jobs", jobscmd }, 1353 { BUILTIN_REGULAR "jobs", jobscmd },
1360 { BUILTIN_REGULAR "kill", killcmd }, 1354 { BUILTIN_REGULAR "kill", killcmd },
1361#endif 1355#endif
@@ -1434,11 +1428,11 @@ static void change_random(const char *);
1434# endif 1428# endif
1435#endif 1429#endif
1436 1430
1437/* $NetBSD: init.h,v 1.9 2002/11/24 22:35:40 christos Exp $ */ 1431/* init.h */
1438 1432
1439static void reset(void); 1433static void reset(void);
1440 1434
1441/* $NetBSD: var.h,v 1.21 2003/01/22 20:36:04 dsl Exp $ */ 1435/* var.h */
1442 1436
1443/* 1437/*
1444 * Shell variables. 1438 * Shell variables.
@@ -1613,7 +1607,7 @@ static int nullredirs;
1613 1607
1614extern char **environ; 1608extern char **environ;
1615 1609
1616/* $NetBSD: output.h,v 1.16 2002/11/24 22:35:42 christos Exp $ */ 1610/* output.h */
1617 1611
1618 1612
1619static void outstr(const char *, FILE *); 1613static void outstr(const char *, FILE *);
@@ -1714,6 +1708,11 @@ init(void)
1714 1708
1715/* PEOF (the end of file marker) */ 1709/* PEOF (the end of file marker) */
1716 1710
1711enum {
1712 INPUT_PUSH_FILE = 1,
1713 INPUT_NOFILE_OK = 2,
1714};
1715
1717/* 1716/*
1718 * The input line number. Input.c just defines this variable, and saves 1717 * The input line number. Input.c just defines this variable, and saves
1719 * and restores it when files are pushed and popped. The user of this 1718 * and restores it when files are pushed and popped. The user of this
@@ -1726,7 +1725,6 @@ static int preadbuffer(void);
1726static void pungetc(void); 1725static void pungetc(void);
1727static void pushstring(char *, void *); 1726static void pushstring(char *, void *);
1728static void popstring(void); 1727static void popstring(void);
1729static void setinputfile(const char *, int);
1730static void setinputfd(int, int); 1728static void setinputfd(int, int);
1731static void setinputstring(char *); 1729static void setinputstring(char *);
1732static void popfile(void); 1730static void popfile(void);
@@ -1734,7 +1732,7 @@ static void popallfiles(void);
1734static void closescript(void); 1732static void closescript(void);
1735 1733
1736 1734
1737/* $NetBSD: jobs.h,v 1.17 2003/01/22 20:36:04 dsl Exp $ */ 1735/* jobs.h */
1738 1736
1739 1737
1740/* Mode argument to forkshell. Don't change FORK_FG or FORK_BG. */ 1738/* Mode argument to forkshell. Don't change FORK_FG or FORK_BG. */
@@ -1801,18 +1799,19 @@ static void setjobctl(int);
1801static void showjobs(FILE *, int); 1799static void showjobs(FILE *, int);
1802#endif 1800#endif
1803 1801
1804/* $NetBSD: main.h,v 1.9 2002/11/24 22:35:41 christos Exp $ */ 1802/* main.h */
1805 1803
1806 1804
1807/* pid of main shell */ 1805/* pid of main shell */
1808static int rootpid; 1806static int rootpid;
1809/* true if we aren't a child of the main shell */ 1807/* shell level: 0 for the main shell, 1 for its children, and so on */
1810static int rootshell; 1808static int shlvl;
1809#define rootshell (!shlvl)
1811 1810
1812static void readcmdfile(char *); 1811static void readcmdfile(char *);
1813static void cmdloop(int); 1812static int cmdloop(int);
1814 1813
1815/* $NetBSD: memalloc.h,v 1.13 2003/01/22 20:36:04 dsl Exp $ */ 1814/* memalloc.h */
1816 1815
1817 1816
1818struct stackmark { 1817struct stackmark {
@@ -1853,7 +1852,7 @@ static char *stnputs(const char *, size_t, char *);
1853static char *stputs(const char *, char *); 1852static char *stputs(const char *, char *);
1854 1853
1855 1854
1856static inline char *_STPUTC(char c, char *p) { 1855static inline char *_STPUTC(int c, char *p) {
1857 if (p == sstrend) 1856 if (p == sstrend)
1858 p = growstackstr(); 1857 p = growstackstr();
1859 *p++ = c; 1858 *p++ = c;
@@ -1885,7 +1884,7 @@ static inline char *_STPUTC(char c, char *p) {
1885 1884
1886#define ckfree(p) free((pointer)(p)) 1885#define ckfree(p) free((pointer)(p))
1887 1886
1888/* $NetBSD: mystring.h,v 1.10 2002/11/24 22:35:42 christos Exp $ */ 1887/* mystring.h */
1889 1888
1890 1889
1891#define DOLATSTRLEN 4 1890#define DOLATSTRLEN 4
@@ -1899,7 +1898,7 @@ static char *sstrdup(const char *);
1899#define equal(s1, s2) (strcmp(s1, s2) == 0) 1898#define equal(s1, s2) (strcmp(s1, s2) == 0)
1900#define scopy(s1, s2) ((void)strcpy(s2, s1)) 1899#define scopy(s1, s2) ((void)strcpy(s2, s1))
1901 1900
1902/* $NetBSD: options.h,v 1.16 2003/01/22 20:36:04 dsl Exp $ */ 1901/* options.h */
1903 1902
1904struct shparam { 1903struct shparam {
1905 int nparam; /* # of positional parameters (without $0) */ 1904 int nparam; /* # of positional parameters (without $0) */
@@ -1925,19 +1924,18 @@ struct shparam {
1925#define aflag optlist[10] 1924#define aflag optlist[10]
1926#define bflag optlist[11] 1925#define bflag optlist[11]
1927#define uflag optlist[12] 1926#define uflag optlist[12]
1928#define qflag optlist[13] 1927#define viflag optlist[13]
1929#define viflag optlist[14]
1930 1928
1931#ifdef DEBUG 1929#ifdef DEBUG
1932#define nolog optlist[15] 1930#define nolog optlist[14]
1933#define debug optlist[16] 1931#define debug optlist[15]
1934#endif 1932#endif
1935 1933
1936#ifndef CONFIG_FEATURE_COMMAND_EDITING_VI 1934#ifndef CONFIG_FEATURE_COMMAND_EDITING_VI
1937#define setvimode(on) viflag = 0 /* forcibly keep the option off */ 1935#define setvimode(on) viflag = 0 /* forcibly keep the option off */
1938#endif 1936#endif
1939 1937
1940/* $NetBSD: options.c,v 1.33 2003/01/22 20:36:04 dsl Exp $ */ 1938/* options.c */
1941 1939
1942 1940
1943static const char *const optletters_optnames[] = { 1941static const char *const optletters_optnames[] = {
@@ -1954,7 +1952,6 @@ static const char *const optletters_optnames[] = {
1954 "a" "allexport", 1952 "a" "allexport",
1955 "b" "notify", 1953 "b" "notify",
1956 "u" "nounset", 1954 "u" "nounset",
1957 "q" "quietprofile",
1958 "\0" "vi", 1955 "\0" "vi",
1959#ifdef DEBUG 1956#ifdef DEBUG
1960 "\0" "nolog", 1957 "\0" "nolog",
@@ -1987,7 +1984,7 @@ static int shiftcmd(int, char **);
1987static int setcmd(int, char **); 1984static int setcmd(int, char **);
1988static int nextopt(const char *); 1985static int nextopt(const char *);
1989 1986
1990/* $NetBSD: redir.h,v 1.14 2002/11/24 22:35:43 christos Exp $ */ 1987/* redir.h */
1991 1988
1992/* flags passed to redirect */ 1989/* flags passed to redirect */
1993#define REDIR_PUSH 01 /* save previous values of file descriptors */ 1990#define REDIR_PUSH 01 /* save previous values of file descriptors */
@@ -2000,7 +1997,7 @@ static void clearredir(int);
2000static int copyfd(int, int); 1997static int copyfd(int, int);
2001static int redirectsafe(union node *, int); 1998static int redirectsafe(union node *, int);
2002 1999
2003/* $NetBSD: show.h,v 1.6 2003/01/22 20:36:04 dsl Exp $ */ 2000/* show.h */
2004 2001
2005 2002
2006#ifdef DEBUG 2003#ifdef DEBUG
@@ -2013,7 +2010,7 @@ static void trputs(const char *);
2013static void opentrace(void); 2010static void opentrace(void);
2014#endif 2011#endif
2015 2012
2016/* $NetBSD: trap.h,v 1.16 2002/11/24 22:35:43 christos Exp $ */ 2013/* trap.h */
2017 2014
2018 2015
2019/* trap handler commands */ 2016/* trap handler commands */
@@ -2027,7 +2024,7 @@ static void clear_traps(void);
2027static void setsignal(int); 2024static void setsignal(int);
2028static void ignoresig(int); 2025static void ignoresig(int);
2029static void onsig(int); 2026static void onsig(int);
2030static void dotrap(void); 2027static int dotrap(void);
2031static void setinteractive(int); 2028static void setinteractive(int);
2032static void exitshell(void) __attribute__((__noreturn__)); 2029static void exitshell(void) __attribute__((__noreturn__));
2033static int decode_signal(const char *, int); 2030static int decode_signal(const char *, int);
@@ -2044,7 +2041,6 @@ reset(void)
2044 { 2041 {
2045 evalskip = 0; 2042 evalskip = 0;
2046 loopnest = 0; 2043 loopnest = 0;
2047 funcnest = 0;
2048 } 2044 }
2049 2045
2050 /* from input.c: */ 2046 /* from input.c: */
@@ -2250,7 +2246,7 @@ __lookupalias(const char *name) {
2250#endif /* CONFIG_ASH_ALIAS */ 2246#endif /* CONFIG_ASH_ALIAS */
2251 2247
2252 2248
2253/* $NetBSD: cd.c,v 1.30 2003/01/22 20:36:03 dsl Exp $ */ 2249/* cd.c */
2254 2250
2255/* 2251/*
2256 * The cd and pwd commands. 2252 * The cd and pwd commands.
@@ -2337,7 +2333,7 @@ docd:
2337 break; 2333 break;
2338 } 2334 }
2339 } while (path); 2335 } while (path);
2340 error("can't cd to %s", dest); 2336 sh_error("can't cd to %s", dest);
2341 /* NOTREACHED */ 2337 /* NOTREACHED */
2342out: 2338out:
2343 if (flags & CD_PRINT) 2339 if (flags & CD_PRINT)
@@ -2495,7 +2491,7 @@ setpwd(const char *val, int setold)
2495 setvar("PWD", dir, VEXPORT); 2491 setvar("PWD", dir, VEXPORT);
2496} 2492}
2497 2493
2498/* $NetBSD: error.c,v 1.30 2003/01/22 20:36:03 dsl Exp $ */ 2494/* error.c */
2499 2495
2500/* 2496/*
2501 * Errors and exceptions. 2497 * Errors and exceptions.
@@ -2602,7 +2598,7 @@ exverror(int cond, const char *msg, va_list ap)
2602 2598
2603 2599
2604static void 2600static void
2605error(const char *msg, ...) 2601sh_error(const char *msg, ...)
2606{ 2602{
2607 va_list ap; 2603 va_list ap;
2608 2604
@@ -2656,7 +2652,7 @@ errmsg(int e, const char *em)
2656} 2652}
2657 2653
2658 2654
2659/* $NetBSD: eval.c,v 1.71 2003/01/23 03:33:16 rafal Exp $ */ 2655/* eval.c */
2660 2656
2661/* 2657/*
2662 * Evaluate a command. 2658 * Evaluate a command.
@@ -2715,7 +2711,8 @@ evalcmd(int argc, char **argv)
2715 STPUTC('\0', concat); 2711 STPUTC('\0', concat);
2716 p = grabstackstr(concat); 2712 p = grabstackstr(concat);
2717 } 2713 }
2718 evalstring(p); 2714 evalstring(p, ~SKIPEVAL);
2715
2719 } 2716 }
2720 return exitstatus; 2717 return exitstatus;
2721} 2718}
@@ -2725,23 +2722,29 @@ evalcmd(int argc, char **argv)
2725 * Execute a command or commands contained in a string. 2722 * Execute a command or commands contained in a string.
2726 */ 2723 */
2727 2724
2728static void 2725static int
2729evalstring(char *s) 2726evalstring(char *s, int mask)
2730{ 2727{
2731 union node *n; 2728 union node *n;
2732 struct stackmark smark; 2729 struct stackmark smark;
2730 int skip;
2733 2731
2734 setstackmark(&smark);
2735 setinputstring(s); 2732 setinputstring(s);
2733 setstackmark(&smark);
2736 2734
2735 skip = 0;
2737 while ((n = parsecmd(0)) != NEOF) { 2736 while ((n = parsecmd(0)) != NEOF) {
2738 evaltree(n, 0); 2737 evaltree(n, 0);
2739 popstackmark(&smark); 2738 popstackmark(&smark);
2740 if (evalskip) 2739 skip = evalskip;
2740 if (skip)
2741 break; 2741 break;
2742 } 2742 }
2743 popfile(); 2743 popfile();
2744 popstackmark(&smark); 2744
2745 skip &= mask;
2746 evalskip = skip;
2747 return skip;
2745} 2748}
2746 2749
2747 2750
@@ -2853,10 +2856,15 @@ setstatus:
2853 break; 2856 break;
2854 } 2857 }
2855out: 2858out:
2856 if (pendingsigs) 2859 if ((checkexit & exitstatus))
2857 dotrap(); 2860 evalskip |= SKIPEVAL;
2858 if (flags & EV_EXIT || checkexit & exitstatus) 2861 else if (pendingsigs && dotrap())
2862 goto exexit;
2863
2864 if (flags & EV_EXIT) {
2865exexit:
2859 exraise(EXEXIT); 2866 exraise(EXEXIT);
2867 }
2860} 2868}
2861 2869
2862 2870
@@ -3071,7 +3079,7 @@ evalpipe(union node *n, int flags)
3071 if (lp->next) { 3079 if (lp->next) {
3072 if (pipe(pip) < 0) { 3080 if (pipe(pip) < 0) {
3073 close(prevfd); 3081 close(prevfd);
3074 error("Pipe call failed"); 3082 sh_error("Pipe call failed");
3075 } 3083 }
3076 } 3084 }
3077 if (forkshell(jp, lp->n, n->npipe.backgnd) == 0) { 3085 if (forkshell(jp, lp->n, n->npipe.backgnd) == 0) {
@@ -3132,7 +3140,7 @@ evalbackcmd(union node *n, struct backcmd *result)
3132 struct job *jp; 3140 struct job *jp;
3133 3141
3134 if (pipe(pip) < 0) 3142 if (pipe(pip) < 0)
3135 error("Pipe call failed"); 3143 sh_error("Pipe call failed");
3136 jp = makejob(n, 1); 3144 jp = makejob(n, 1);
3137 if (forkshell(jp, n, FORK_NOJOB) == 0) { 3145 if (forkshell(jp, n, FORK_NOJOB) == 0) {
3138 FORCEINTON; 3146 FORCEINTON;
@@ -3485,6 +3493,7 @@ evalfun(struct funcnode *func, int argc, char **argv, int flags)
3485 localvars = NULL; 3493 localvars = NULL;
3486 shellparam.malloc = 0; 3494 shellparam.malloc = 0;
3487 func->count++; 3495 func->count++;
3496 funcnest++;
3488 INTON; 3497 INTON;
3489 shellparam.nparam = argc - 1; 3498 shellparam.nparam = argc - 1;
3490 shellparam.p = argv + 1; 3499 shellparam.p = argv + 1;
@@ -3492,11 +3501,10 @@ evalfun(struct funcnode *func, int argc, char **argv, int flags)
3492 shellparam.optind = 1; 3501 shellparam.optind = 1;
3493 shellparam.optoff = -1; 3502 shellparam.optoff = -1;
3494#endif 3503#endif
3495 funcnest++;
3496 evaltree(&func->n, flags & EV_TESTED); 3504 evaltree(&func->n, flags & EV_TESTED);
3497 funcnest--;
3498funcdone: 3505funcdone:
3499 INTOFF; 3506 INTOFF;
3507 funcnest--;
3500 freefunc(func); 3508 freefunc(func);
3501 poplocalvars(); 3509 poplocalvars();
3502 localvars = savelocalvars; 3510 localvars = savelocalvars;
@@ -3504,10 +3512,7 @@ funcdone:
3504 shellparam = saveparam; 3512 shellparam = saveparam;
3505 handler = savehandler; 3513 handler = savehandler;
3506 INTON; 3514 INTON;
3507 if (evalskip == SKIPFUNC) { 3515 evalskip &= ~SKIPFUNC;
3508 evalskip = 0;
3509 skipcount = 0;
3510 }
3511 return e; 3516 return e;
3512} 3517}
3513 3518
@@ -3575,7 +3580,7 @@ breakcmd(int argc, char **argv)
3575 int n = argc > 1 ? number(argv[1]) : 1; 3580 int n = argc > 1 ? number(argv[1]) : 1;
3576 3581
3577 if (n <= 0) 3582 if (n <= 0)
3578 error(illnum, argv[1]); 3583 sh_error(illnum, argv[1]);
3579 if (n > loopnest) 3584 if (n > loopnest)
3580 n = loopnest; 3585 n = loopnest;
3581 if (n > 0) { 3586 if (n > 0) {
@@ -3593,19 +3598,12 @@ breakcmd(int argc, char **argv)
3593static int 3598static int
3594returncmd(int argc, char **argv) 3599returncmd(int argc, char **argv)
3595{ 3600{
3596 int ret = argc > 1 ? number(argv[1]) : exitstatus; 3601 /*
3597 3602 * If called outside a function, do what ksh does;
3598 if (funcnest) { 3603 * skip the rest of the file.
3599 evalskip = SKIPFUNC; 3604 */
3600 skipcount = 1; 3605 evalskip = funcnest ? SKIPFUNC : SKIPFILE;
3601 return ret; 3606 return argv[1] ? number(argv[1]) : exitstatus;
3602 }
3603 else {
3604 /* Do what ksh does; skip the rest of the file */
3605 evalskip = SKIPFILE;
3606 skipcount = 1;
3607 return ret;
3608 }
3609} 3607}
3610 3608
3611 3609
@@ -3636,7 +3634,7 @@ execcmd(int argc, char **argv)
3636} 3634}
3637 3635
3638 3636
3639/* $NetBSD: exec.c,v 1.35 2003/01/22 20:36:04 dsl Exp $ */ 3637/* exec.c */
3640 3638
3641/* 3639/*
3642 * When commands are first encountered, they are entered in a hash table. 3640 * When commands are first encountered, they are entered in a hash table.
@@ -3682,6 +3680,7 @@ shellexec(char **argv, const char *path, int idx)
3682 char *cmdname; 3680 char *cmdname;
3683 int e; 3681 int e;
3684 char **envp; 3682 char **envp;
3683 int exerrno;
3685 3684
3686 clearredir(1); 3685 clearredir(1);
3687 envp = environment(); 3686 envp = environment();
@@ -3716,6 +3715,7 @@ shellexec(char **argv, const char *path, int idx)
3716 exerrno = 2; 3715 exerrno = 2;
3717 break; 3716 break;
3718 } 3717 }
3718 exitstatus = exerrno;
3719 TRACE(("shellexec failed for %s, errno %d, suppressint %d\n", 3719 TRACE(("shellexec failed for %s, errno %d, suppressint %d\n",
3720 argv[0], e, suppressint )); 3720 argv[0], e, suppressint ));
3721 exerror(EXEXEC, "%s: %s", argv[0], errmsg(e, E_EXEC)); 3721 exerror(EXEXEC, "%s: %s", argv[0], errmsg(e, E_EXEC));
@@ -4004,7 +4004,7 @@ loop:
4004 readcmdfile(fullname); 4004 readcmdfile(fullname);
4005 if ((cmdp = cmdlookup(name, 0)) == NULL || 4005 if ((cmdp = cmdlookup(name, 0)) == NULL ||
4006 cmdp->cmdtype != CMDFUNCTION) 4006 cmdp->cmdtype != CMDFUNCTION)
4007 error("%s not defined in %s", name, fullname); 4007 sh_error("%s not defined in %s", name, fullname);
4008 stunalloc(fullname); 4008 stunalloc(fullname);
4009 goto success; 4009 goto success;
4010 } 4010 }
@@ -4438,46 +4438,28 @@ static int
4438commandcmd(int argc, char **argv) 4438commandcmd(int argc, char **argv)
4439{ 4439{
4440 int c; 4440 int c;
4441 int default_path = 0; 4441 enum {
4442 int verify_only = 0; 4442 VERIFY_BRIEF = 1,
4443 int verbose_verify_only = 0; 4443 VERIFY_VERBOSE = 2,
4444 } verify = 0;
4444 4445
4445 while ((c = nextopt("pvV")) != '\0') 4446 while ((c = nextopt("pvV")) != '\0')
4446 switch (c) { 4447 if (c == 'V')
4447 default: 4448 verify |= VERIFY_VERBOSE;
4449 else if (c == 'v')
4450 verify |= VERIFY_BRIEF;
4448#ifdef DEBUG 4451#ifdef DEBUG
4449 fprintf(stderr, 4452 else if (c != 'p')
4450"command: nextopt returned character code 0%o\n", c); 4453 abort();
4451 return EX_SOFTWARE;
4452#endif 4454#endif
4453 case 'p': 4455 if (verify)
4454 default_path = 1; 4456 return describe_command(*argptr, verify - VERIFY_BRIEF);
4455 break;
4456 case 'v':
4457 verify_only = 1;
4458 break;
4459 case 'V':
4460 verbose_verify_only = 1;
4461 break;
4462 }
4463
4464 if (default_path + verify_only + verbose_verify_only > 1 ||
4465 !*argptr) {
4466 fprintf(stderr,
4467 "command [-p] command [arg ...]\n"
4468 "command {-v|-V} command\n");
4469 return EX_USAGE;
4470 }
4471
4472 if (verify_only || verbose_verify_only) {
4473 return describe_command(*argptr, verbose_verify_only);
4474 }
4475 4457
4476 return 0; 4458 return 0;
4477} 4459}
4478#endif 4460#endif
4479 4461
4480/* $NetBSD: expand.c,v 1.56 2002/11/24 22:35:39 christos Exp $ */ 4462/* expand.c */
4481 4463
4482/* 4464/*
4483 * Routines to expand arguments to commands. We have to deal with 4465 * Routines to expand arguments to commands. We have to deal with
@@ -4806,14 +4788,13 @@ exptilde(char *startp, char *p, int flag)
4806done: 4788done:
4807 *p = '\0'; 4789 *p = '\0';
4808 if (*name == '\0') { 4790 if (*name == '\0') {
4809 if ((home = lookupvar(homestr)) == NULL) 4791 home = lookupvar(homestr);
4810 goto lose;
4811 } else { 4792 } else {
4812 if ((pw = getpwnam(name)) == NULL) 4793 if ((pw = getpwnam(name)) == NULL)
4813 goto lose; 4794 goto lose;
4814 home = pw->pw_dir; 4795 home = pw->pw_dir;
4815 } 4796 }
4816 if (*home == '\0') 4797 if (!home || !*home)
4817 goto lose; 4798 goto lose;
4818 *p = c; 4799 *p = c;
4819 startloc = expdest - (char *)stackblock(); 4800 startloc = expdest - (char *)stackblock();
@@ -4897,7 +4878,7 @@ expari(int quotes)
4897 p--; 4878 p--;
4898#ifdef DEBUG 4879#ifdef DEBUG
4899 if (p < start) { 4880 if (p < start) {
4900 error("missing CTLARI (shouldn't happen)"); 4881 sh_error("missing CTLARI (shouldn't happen)");
4901 } 4882 }
4902#endif 4883#endif
4903 } 4884 }
@@ -5275,7 +5256,7 @@ memtodest(const char *p, size_t len, int syntax, int quotes) {
5275 q = makestrspace(len * 2, q); 5256 q = makestrspace(len * 2, q);
5276 5257
5277 while (len--) { 5258 while (len--) {
5278 int c = *p++; 5259 int c = (unsigned char)*p++;
5279 if (!c) 5260 if (!c)
5280 continue; 5261 continue;
5281 if (quotes && (SIT(c, syntax) == CCTL || SIT(c, syntax) == CBACK)) 5262 if (quotes && (SIT(c, syntax) == CCTL || SIT(c, syntax) == CBACK))
@@ -5932,11 +5913,11 @@ varunset(const char *end, const char *var, const char *umsg, int varflags)
5932 } else 5913 } else
5933 msg = umsg; 5914 msg = umsg;
5934 } 5915 }
5935 error("%.*s: %s%s", end - var - 1, var, msg, tail); 5916 sh_error("%.*s: %s%s", end - var - 1, var, msg, tail);
5936} 5917}
5937 5918
5938 5919
5939/* $NetBSD: input.c,v 1.37 2002/11/24 22:35:40 christos Exp $ */ 5920/* input.c */
5940 5921
5941/* 5922/*
5942 * This implements the input routines used by the parser. 5923 * This implements the input routines used by the parser.
@@ -6103,7 +6084,7 @@ retry:
6103int 6084int
6104preadbuffer(void) 6085preadbuffer(void)
6105{ 6086{
6106 char *p, *q; 6087 char *q;
6107 int more; 6088 int more;
6108 char savec; 6089 char savec;
6109 6090
@@ -6122,39 +6103,42 @@ preadbuffer(void)
6122 return PEOF; 6103 return PEOF;
6123 flushall(); 6104 flushall();
6124 6105
6106 more = parselleft;
6107 if (more <= 0) {
6125again: 6108again:
6126 if (parselleft <= 0) { 6109 if ((more = preadfd()) <= 0) {
6127 if ((parselleft = preadfd()) <= 0) {
6128 parselleft = parsenleft = EOF_NLEFT; 6110 parselleft = parsenleft = EOF_NLEFT;
6129 return PEOF; 6111 return PEOF;
6130 } 6112 }
6131 } 6113 }
6132 6114
6133 q = p = parsenextc; 6115 q = parsenextc;
6134 6116
6135 /* delete nul characters */ 6117 /* delete nul characters */
6136 for (more = 1; more;) { 6118 for (;;) {
6137 switch (*p) { 6119 int c;
6138 case '\0':
6139 p++; /* Skip nul */
6140 goto check;
6141 6120
6142 case '\n': 6121 more--;
6143 parsenleft = q - parsenextc; 6122 c = *q;
6144 more = 0; /* Stop processing here */
6145 break;
6146 6123
6124 if (!c)
6125 memmove(q, q + 1, more);
6126 else {
6127 q++;
6128 if (c == '\n') {
6129 parsenleft = q - parsenextc - 1;
6130 break;
6131 }
6147 } 6132 }
6148 6133
6149 *q++ = *p++; 6134 if (more <= 0) {
6150check:
6151 if (--parselleft <= 0 && more) {
6152 parsenleft = q - parsenextc - 1; 6135 parsenleft = q - parsenextc - 1;
6153 if (parsenleft < 0) 6136 if (parsenleft < 0)
6154 goto again; 6137 goto again;
6155 more = 0; 6138 break;
6156 } 6139 }
6157 } 6140 }
6141 parselleft = more;
6158 6142
6159 savec = *q; 6143 savec = *q;
6160 *q = '\0'; 6144 *q = '\0';
@@ -6247,24 +6231,29 @@ popstring(void)
6247 * old input onto the stack first. 6231 * old input onto the stack first.
6248 */ 6232 */
6249 6233
6250void 6234static int
6251setinputfile(const char *fname, int push) 6235setinputfile(const char *fname, int flags)
6252{ 6236{
6253 int fd; 6237 int fd;
6254 int fd2; 6238 int fd2;
6255 6239
6256 INTOFF; 6240 INTOFF;
6257 if ((fd = open(fname, O_RDONLY)) < 0) 6241 if ((fd = open(fname, O_RDONLY)) < 0) {
6258 error("Can't open %s", fname); 6242 if (flags & INPUT_NOFILE_OK)
6243 goto out;
6244 sh_error("Can't open %s", fname);
6245 }
6259 if (fd < 10) { 6246 if (fd < 10) {
6260 fd2 = copyfd(fd, 10); 6247 fd2 = copyfd(fd, 10);
6261 close(fd); 6248 close(fd);
6262 if (fd2 < 0) 6249 if (fd2 < 0)
6263 error("Out of file descriptors"); 6250 sh_error("Out of file descriptors");
6264 fd = fd2; 6251 fd = fd2;
6265 } 6252 }
6266 setinputfd(fd, push); 6253 setinputfd(fd, flags & INPUT_PUSH_FILE);
6254out:
6267 INTON; 6255 INTON;
6256 return fd;
6268} 6257}
6269 6258
6270 6259
@@ -6378,7 +6367,7 @@ closescript(void)
6378 } 6367 }
6379} 6368}
6380 6369
6381/* $NetBSD: jobs.c,v 1.56 2002/11/25 12:13:03 agc Exp $ */ 6370/* jobs.c */
6382 6371
6383/* mode flags for set_curjob */ 6372/* mode flags for set_curjob */
6384#define CUR_DELETE 2 6373#define CUR_DELETE 2
@@ -6453,14 +6442,14 @@ set_curjob(struct job *jp, unsigned mode)
6453 put after all stopped jobs. */ 6442 put after all stopped jobs. */
6454 do { 6443 do {
6455 jp1 = *jpp; 6444 jp1 = *jpp;
6456#ifdef JOBS 6445#if JOBS
6457 if (!jp1 || jp1->state != JOBSTOPPED) 6446 if (!jp1 || jp1->state != JOBSTOPPED)
6458#endif 6447#endif
6459 break; 6448 break;
6460 jpp = &jp1->prev_job; 6449 jpp = &jp1->prev_job;
6461 } while (1); 6450 } while (1);
6462 /* FALLTHROUGH */ 6451 /* FALLTHROUGH */
6463#ifdef JOBS 6452#if JOBS
6464 case CUR_STOPPED: 6453 case CUR_STOPPED:
6465#endif 6454#endif
6466 /* newly stopped job - becomes curjob */ 6455 /* newly stopped job - becomes curjob */
@@ -6549,7 +6538,7 @@ killcmd(int argc, char **argv)
6549 6538
6550 if (argc <= 1) { 6539 if (argc <= 1) {
6551usage: 6540usage:
6552 error( 6541 sh_error(
6553"Usage: kill [-s sigspec | -signum | -sigspec] [pid | job]... or\n" 6542"Usage: kill [-s sigspec | -signum | -sigspec] [pid | job]... or\n"
6554"kill -l [exitstatus]" 6543"kill -l [exitstatus]"
6555 ); 6544 );
@@ -6572,7 +6561,7 @@ usage:
6572 case 's': 6561 case 's':
6573 signo = decode_signal(optionarg, 1); 6562 signo = decode_signal(optionarg, 1);
6574 if (signo < 0) { 6563 if (signo < 0) {
6575 error( 6564 sh_error(
6576 "invalid signal number or name: %s", 6565 "invalid signal number or name: %s",
6577 optionarg 6566 optionarg
6578 ); 6567 );
@@ -6606,7 +6595,7 @@ usage:
6606 if (name) 6595 if (name)
6607 out1fmt(snlfmt, name); 6596 out1fmt(snlfmt, name);
6608 else 6597 else
6609 error("invalid signal number or exit status: %s", *argptr); 6598 sh_error("invalid signal number or exit status: %s", *argptr);
6610 return 0; 6599 return 0;
6611 } 6600 }
6612 6601
@@ -6637,7 +6626,7 @@ jobno(const struct job *jp)
6637} 6626}
6638#endif 6627#endif
6639 6628
6640#ifdef JOBS 6629#if JOBS
6641static int 6630static int
6642fgcmd(int argc, char **argv) 6631fgcmd(int argc, char **argv)
6643{ 6632{
@@ -7020,7 +7009,7 @@ gotit:
7020#endif 7009#endif
7021 return jp; 7010 return jp;
7022err: 7011err:
7023 error(err_msg, name); 7012 sh_error(err_msg, name);
7024} 7013}
7025 7014
7026 7015
@@ -7132,18 +7121,18 @@ growjobtab(void)
7132static inline void 7121static inline void
7133forkchild(struct job *jp, union node *n, int mode) 7122forkchild(struct job *jp, union node *n, int mode)
7134{ 7123{
7135 int wasroot; 7124 int oldlvl;
7136 7125
7137 TRACE(("Child shell %d\n", getpid())); 7126 TRACE(("Child shell %d\n", getpid()));
7138 wasroot = rootshell; 7127 oldlvl = shlvl;
7139 rootshell = 0; 7128 shlvl++;
7140 7129
7141 closescript(); 7130 closescript();
7142 clear_traps(); 7131 clear_traps();
7143#if JOBS 7132#if JOBS
7144 /* do job control only in root shell */ 7133 /* do job control only in root shell */
7145 jobctl = 0; 7134 jobctl = 0;
7146 if (mode != FORK_NOJOB && jp->jobctl && wasroot) { 7135 if (mode != FORK_NOJOB && jp->jobctl && !oldlvl) {
7147 pid_t pgrp; 7136 pid_t pgrp;
7148 7137
7149 if (jp->nprocs == 0) 7138 if (jp->nprocs == 0)
@@ -7164,10 +7153,10 @@ forkchild(struct job *jp, union node *n, int mode)
7164 if (jp->nprocs == 0) { 7153 if (jp->nprocs == 0) {
7165 close(0); 7154 close(0);
7166 if (open(_PATH_DEVNULL, O_RDONLY) != 0) 7155 if (open(_PATH_DEVNULL, O_RDONLY) != 0)
7167 error("Can't open %s", _PATH_DEVNULL); 7156 sh_error("Can't open %s", _PATH_DEVNULL);
7168 } 7157 }
7169 } 7158 }
7170 if (wasroot && iflag) { 7159 if (!oldlvl && iflag) {
7171 setsignal(SIGINT); 7160 setsignal(SIGINT);
7172 setsignal(SIGQUIT); 7161 setsignal(SIGQUIT);
7173 setsignal(SIGTERM); 7162 setsignal(SIGTERM);
@@ -7225,7 +7214,7 @@ forkshell(struct job *jp, union node *n, int mode)
7225 TRACE(("Fork failed, errno=%d", errno)); 7214 TRACE(("Fork failed, errno=%d", errno));
7226 if (jp) 7215 if (jp)
7227 freejob(jp); 7216 freejob(jp);
7228 error("Cannot fork"); 7217 sh_error("Cannot fork");
7229 } 7218 }
7230 if (pid == 0) 7219 if (pid == 0)
7231 forkchild(jp, n, mode); 7220 forkchild(jp, n, mode);
@@ -7365,7 +7354,7 @@ dowait(int block, struct job *job)
7365 } 7354 }
7366 if (sp->status == -1) 7355 if (sp->status == -1)
7367 state = JOBRUNNING; 7356 state = JOBRUNNING;
7368#ifdef JOBS 7357#if JOBS
7369 if (state == JOBRUNNING) 7358 if (state == JOBRUNNING)
7370 continue; 7359 continue;
7371 if (WIFSTOPPED(sp->status)) { 7360 if (WIFSTOPPED(sp->status)) {
@@ -7377,7 +7366,7 @@ dowait(int block, struct job *job)
7377 if (thisjob) 7366 if (thisjob)
7378 goto gotjob; 7367 goto gotjob;
7379 } 7368 }
7380#ifdef JOBS 7369#if JOBS
7381 if (!WIFSTOPPED(status)) 7370 if (!WIFSTOPPED(status))
7382#endif 7371#endif
7383 7372
@@ -7391,7 +7380,7 @@ gotjob:
7391 if (thisjob->state != state) { 7380 if (thisjob->state != state) {
7392 TRACE(("Job %d: changing state from %d to %d\n", jobno(thisjob), thisjob->state, state)); 7381 TRACE(("Job %d: changing state from %d to %d\n", jobno(thisjob), thisjob->state, state));
7393 thisjob->state = state; 7382 thisjob->state = state;
7394#ifdef JOBS 7383#if JOBS
7395 if (state == JOBSTOPPED) { 7384 if (state == JOBSTOPPED) {
7396 set_curjob(thisjob, CUR_STOPPED); 7385 set_curjob(thisjob, CUR_STOPPED);
7397 } 7386 }
@@ -7739,7 +7728,7 @@ static void
7739xtcsetpgrp(int fd, pid_t pgrp) 7728xtcsetpgrp(int fd, pid_t pgrp)
7740{ 7729{
7741 if (tcsetpgrp(fd, pgrp)) 7730 if (tcsetpgrp(fd, pgrp))
7742 error("Cannot set tty process group (%m)"); 7731 sh_error("Cannot set tty process group (%m)");
7743} 7732}
7744#endif /* JOBS */ 7733#endif /* JOBS */
7745 7734
@@ -7771,7 +7760,7 @@ getstatus(struct job *job) {
7771} 7760}
7772 7761
7773#ifdef CONFIG_ASH_MAIL 7762#ifdef CONFIG_ASH_MAIL
7774/* $NetBSD: mail.c,v 1.15 2002/11/24 22:35:40 christos Exp $ */ 7763/* mail.c */
7775 7764
7776/* 7765/*
7777 * Routines to check for mail. (Perhaps make part of main.c?) 7766 * Routines to check for mail. (Perhaps make part of main.c?)
@@ -7842,7 +7831,7 @@ changemail(const char *val)
7842 7831
7843#endif /* CONFIG_ASH_MAIL */ 7832#endif /* CONFIG_ASH_MAIL */
7844 7833
7845/* $NetBSD: main.c,v 1.46 2002/12/11 19:12:18 christos Exp $ */ 7834/* main.c */
7846 7835
7847 7836
7848#if PROFILE 7837#if PROFILE
@@ -7879,28 +7868,16 @@ ash_main(int argc, char **argv)
7879#endif 7868#endif
7880 state = 0; 7869 state = 0;
7881 if (setjmp(jmploc.loc)) { 7870 if (setjmp(jmploc.loc)) {
7882 int status;
7883 int e; 7871 int e;
7872 int s;
7884 7873
7885 reset(); 7874 reset();
7886 7875
7887 e = exception; 7876 e = exception;
7888 switch (exception) { 7877 if (e == EXERROR)
7889 case EXEXEC: 7878 exitstatus = 2;
7890 status = exerrno; 7879 s = state;
7891 break; 7880 if (e == EXEXIT || s == 0 || iflag == 0 || shlvl)
7892
7893 case EXERROR:
7894 status = 2;
7895 break;
7896
7897 default:
7898 status = exitstatus;
7899 break;
7900 }
7901 exitstatus = status;
7902
7903 if (e == EXEXIT || state == 0 || iflag == 0 || ! rootshell)
7904 exitshell(); 7881 exitshell();
7905 7882
7906 if (e == EXINT) { 7883 if (e == EXINT) {
@@ -7908,11 +7885,11 @@ ash_main(int argc, char **argv)
7908 } 7885 }
7909 popstackmark(&smark); 7886 popstackmark(&smark);
7910 FORCEINTON; /* enable interrupts */ 7887 FORCEINTON; /* enable interrupts */
7911 if (state == 1) 7888 if (s == 1)
7912 goto state1; 7889 goto state1;
7913 else if (state == 2) 7890 else if (s == 2)
7914 goto state2; 7891 goto state2;
7915 else if (state == 3) 7892 else if (s == 3)
7916 goto state3; 7893 goto state3;
7917 else 7894 else
7918 goto state4; 7895 goto state4;
@@ -7927,7 +7904,6 @@ ash_main(int argc, char **argv)
7927#ifdef CONFIG_ASH_RANDOM_SUPPORT 7904#ifdef CONFIG_ASH_RANDOM_SUPPORT
7928 rseed = rootpid + ((time_t)time((time_t *)0)); 7905 rseed = rootpid + ((time_t)time((time_t *)0));
7929#endif 7906#endif
7930 rootshell = 1;
7931 init(); 7907 init();
7932 setstackmark(&smark); 7908 setstackmark(&smark);
7933 procargs(argc, argv); 7909 procargs(argc, argv);
@@ -7969,7 +7945,7 @@ state2:
7969state3: 7945state3:
7970 state = 4; 7946 state = 4;
7971 if (minusc) 7947 if (minusc)
7972 evalstring(minusc); 7948 evalstring(minusc, 0);
7973 7949
7974 if (sflag || minusc == NULL) { 7950 if (sflag || minusc == NULL) {
7975#ifdef CONFIG_FEATURE_COMMAND_SAVEHISTORY 7951#ifdef CONFIG_FEATURE_COMMAND_SAVEHISTORY
@@ -8002,7 +7978,7 @@ state4: /* XXX ??? - why isn't this before the "if" statement */
8002 * loop; it turns on prompting if the shell is interactive. 7978 * loop; it turns on prompting if the shell is interactive.
8003 */ 7979 */
8004 7980
8005static void 7981static int
8006cmdloop(int top) 7982cmdloop(int top)
8007{ 7983{
8008 union node *n; 7984 union node *n;
@@ -8012,9 +7988,9 @@ cmdloop(int top)
8012 7988
8013 TRACE(("cmdloop(%d) called\n", top)); 7989 TRACE(("cmdloop(%d) called\n", top));
8014 for (;;) { 7990 for (;;) {
7991 int skip;
7992
8015 setstackmark(&smark); 7993 setstackmark(&smark);
8016 if (pendingsigs)
8017 dotrap();
8018#if JOBS 7994#if JOBS
8019 if (jobctl) 7995 if (jobctl)
8020 showjobs(stderr, SHOW_CHANGED); 7996 showjobs(stderr, SHOW_CHANGED);
@@ -8037,17 +8013,21 @@ cmdloop(int top)
8037 out2str("\nUse \"exit\" to leave shell.\n"); 8013 out2str("\nUse \"exit\" to leave shell.\n");
8038 } 8014 }
8039 numeof++; 8015 numeof++;
8040 } else if (n != NULL && nflag == 0) { 8016 } else if (nflag == 0) {
8041 job_warning = (job_warning == 2) ? 1 : 0; 8017 job_warning = (job_warning == 2) ? 1 : 0;
8042 numeof = 0; 8018 numeof = 0;
8043 evaltree(n, 0); 8019 evaltree(n, 0);
8044 } 8020 }
8045 popstackmark(&smark); 8021 popstackmark(&smark);
8046 if (evalskip) { 8022 skip = evalskip;
8023
8024 if (skip) {
8047 evalskip = 0; 8025 evalskip = 0;
8048 break; 8026 return skip & SKIPEVAL;
8049 } 8027 }
8050 } 8028 }
8029
8030 return 0;
8051} 8031}
8052 8032
8053 8033
@@ -8058,31 +8038,16 @@ cmdloop(int top)
8058static void 8038static void
8059read_profile(const char *name) 8039read_profile(const char *name)
8060{ 8040{
8061 int fd; 8041 int skip;
8062 int xflag_set = 0;
8063 int vflag_set = 0;
8064 8042
8065 INTOFF; 8043 if (setinputfile(name, INPUT_PUSH_FILE | INPUT_NOFILE_OK) < 0)
8066 if ((fd = open(name, O_RDONLY)) >= 0)
8067 setinputfd(fd, 1);
8068 INTON;
8069 if (fd < 0)
8070 return; 8044 return;
8071 /* -q turns off -x and -v just when executing init files */ 8045
8072 if (qflag) { 8046 skip = cmdloop(0);
8073 if (xflag)
8074 xflag = 0, xflag_set = 1;
8075 if (vflag)
8076 vflag = 0, vflag_set = 1;
8077 }
8078 cmdloop(0);
8079 if (qflag) {
8080 if (xflag_set)
8081 xflag = 1;
8082 if (vflag_set)
8083 vflag = 1;
8084 }
8085 popfile(); 8047 popfile();
8048
8049 if (skip)
8050 exitshell();
8086} 8051}
8087 8052
8088 8053
@@ -8093,14 +8058,7 @@ read_profile(const char *name)
8093static void 8058static void
8094readcmdfile(char *name) 8059readcmdfile(char *name)
8095{ 8060{
8096 int fd; 8061 setinputfile(name, INPUT_PUSH_FILE);
8097
8098 INTOFF;
8099 if ((fd = open(name, O_RDONLY)) >= 0)
8100 setinputfd(fd, 1);
8101 else
8102 error("Can't open %s", name);
8103 INTON;
8104 cmdloop(0); 8062 cmdloop(0);
8105 popfile(); 8063 popfile();
8106} 8064}
@@ -8134,7 +8092,7 @@ find_dot_file(char *name)
8134 } 8092 }
8135 8093
8136 /* not found in the PATH */ 8094 /* not found in the PATH */
8137 error(not_found_msg, name); 8095 sh_error(not_found_msg, name);
8138 /* NOTREACHED */ 8096 /* NOTREACHED */
8139} 8097}
8140 8098
@@ -8142,17 +8100,14 @@ static int dotcmd(int argc, char **argv)
8142{ 8100{
8143 struct strlist *sp; 8101 struct strlist *sp;
8144 volatile struct shparam saveparam; 8102 volatile struct shparam saveparam;
8145 8103 int status = 0;
8146 exitstatus = 0;
8147 8104
8148 for (sp = cmdenviron; sp; sp = sp->next) 8105 for (sp = cmdenviron; sp; sp = sp->next)
8149 setvareq(bb_xstrdup(sp->text), VSTRFIXED | VTEXTFIXED); 8106 setvareq(bb_xstrdup(sp->text), VSTRFIXED | VTEXTFIXED);
8150 8107
8151 if (argc >= 2) { /* That's what SVR2 does */ 8108 if (argc >= 2) { /* That's what SVR2 does */
8152 char *fullname; 8109 char *fullname;
8153 struct stackmark smark;
8154 8110
8155 setstackmark(&smark);
8156 fullname = find_dot_file(argv[1]); 8111 fullname = find_dot_file(argv[1]);
8157 8112
8158 if (argc > 2) { 8113 if (argc > 2) {
@@ -8162,7 +8117,7 @@ static int dotcmd(int argc, char **argv)
8162 shellparam.p = argv + 2; 8117 shellparam.p = argv + 2;
8163 }; 8118 };
8164 8119
8165 setinputfile(fullname, 1); 8120 setinputfile(fullname, INPUT_PUSH_FILE);
8166 commandname = fullname; 8121 commandname = fullname;
8167 cmdloop(0); 8122 cmdloop(0);
8168 popfile(); 8123 popfile();
@@ -8171,10 +8126,9 @@ static int dotcmd(int argc, char **argv)
8171 freeparam(&shellparam); 8126 freeparam(&shellparam);
8172 shellparam = saveparam; 8127 shellparam = saveparam;
8173 }; 8128 };
8174 8129 status = exitstatus;
8175 popstackmark(&smark);
8176 } 8130 }
8177 return exitstatus; 8131 return status;
8178} 8132}
8179 8133
8180 8134
@@ -8196,7 +8150,7 @@ echocmd(int argc, char **argv)
8196 return bb_echo(argc, argv); 8150 return bb_echo(argc, argv);
8197} 8151}
8198#endif 8152#endif
8199/* $NetBSD: memalloc.c,v 1.27 2003/01/22 20:36:04 dsl Exp $ */ 8153/* memalloc.c */
8200 8154
8201/* 8155/*
8202 * Same for malloc, realloc, but returns an error when out of space. 8156 * Same for malloc, realloc, but returns an error when out of space.
@@ -8207,7 +8161,7 @@ ckrealloc(pointer p, size_t nbytes)
8207{ 8161{
8208 p = realloc(p, nbytes); 8162 p = realloc(p, nbytes);
8209 if (p == NULL) 8163 if (p == NULL)
8210 error(bb_msg_memory_exhausted); 8164 sh_error(bb_msg_memory_exhausted);
8211 return p; 8165 return p;
8212} 8166}
8213 8167
@@ -8226,7 +8180,7 @@ savestr(const char *s)
8226{ 8180{
8227 char *p = strdup(s); 8181 char *p = strdup(s);
8228 if (!p) 8182 if (!p)
8229 error(bb_msg_memory_exhausted); 8183 sh_error(bb_msg_memory_exhausted);
8230 return p; 8184 return p;
8231} 8185}
8232 8186
@@ -8258,7 +8212,7 @@ stalloc(size_t nbytes)
8258 blocksize = MINSIZE; 8212 blocksize = MINSIZE;
8259 len = sizeof(struct stack_block) - MINSIZE + blocksize; 8213 len = sizeof(struct stack_block) - MINSIZE + blocksize;
8260 if (len < blocksize) 8214 if (len < blocksize)
8261 error(bb_msg_memory_exhausted); 8215 sh_error(bb_msg_memory_exhausted);
8262 INTOFF; 8216 INTOFF;
8263 sp = ckmalloc(len); 8217 sp = ckmalloc(len);
8264 sp->prev = stackp; 8218 sp->prev = stackp;
@@ -8336,7 +8290,7 @@ growstackblock(void)
8336 8290
8337 newlen = stacknleft * 2; 8291 newlen = stacknleft * 2;
8338 if (newlen < stacknleft) 8292 if (newlen < stacknleft)
8339 error(bb_msg_memory_exhausted); 8293 sh_error(bb_msg_memory_exhausted);
8340 if (newlen < 128) 8294 if (newlen < 128)
8341 newlen += 128; 8295 newlen += 128;
8342 8296
@@ -8456,7 +8410,7 @@ stputs(const char *s, char *p)
8456 return stnputs(s, strlen(s), p); 8410 return stnputs(s, strlen(s), p);
8457} 8411}
8458 8412
8459/* $NetBSD: mystring.c,v 1.15 2002/11/24 22:35:42 christos Exp $ */ 8413/* mystring.c */
8460 8414
8461/* 8415/*
8462 * String functions. 8416 * String functions.
@@ -8490,7 +8444,7 @@ number(const char *s)
8490{ 8444{
8491 8445
8492 if (! is_number(s)) 8446 if (! is_number(s))
8493 error(illnum, s); 8447 sh_error(illnum, s);
8494 return atoi(s); 8448 return atoi(s);
8495} 8449}
8496 8450
@@ -8815,7 +8769,7 @@ procargs(int argc, char **argv)
8815 xminusc = minusc; 8769 xminusc = minusc;
8816 if (*xargv == NULL) { 8770 if (*xargv == NULL) {
8817 if (xminusc) 8771 if (xminusc)
8818 error("-c requires an argument"); 8772 sh_error("-c requires an argument");
8819 sflag = 1; 8773 sflag = 1;
8820 } 8774 }
8821 if (iflag == 2 && sflag == 1 && isatty(0) && isatty(1)) 8775 if (iflag == 2 && sflag == 1 && isatty(0) && isatty(1))
@@ -8881,7 +8835,7 @@ minus_o(char *name, int val)
8881 optlist[i] = val; 8835 optlist[i] = val;
8882 return; 8836 return;
8883 } 8837 }
8884 error("Illegal option -o %s", name); 8838 sh_error("Illegal option -o %s", name);
8885 } 8839 }
8886} 8840}
8887 8841
@@ -8949,7 +8903,7 @@ setoption(int flag, int val)
8949 optlist[i] = val; 8903 optlist[i] = val;
8950 return; 8904 return;
8951 } 8905 }
8952 error("Illegal option -%c", flag); 8906 sh_error("Illegal option -%c", flag);
8953 /* NOTREACHED */ 8907 /* NOTREACHED */
8954} 8908}
8955 8909
@@ -9015,7 +8969,7 @@ shiftcmd(int argc, char **argv)
9015 if (argc > 1) 8969 if (argc > 1)
9016 n = number(argv[1]); 8970 n = number(argv[1]);
9017 if (n > shellparam.nparam) 8971 if (n > shellparam.nparam)
9018 error("can't shift that many"); 8972 sh_error("can't shift that many");
9019 INTOFF; 8973 INTOFF;
9020 shellparam.nparam -= n; 8974 shellparam.nparam -= n;
9021 for (ap1 = shellparam.p ; --n >= 0 ; ap1++) { 8975 for (ap1 = shellparam.p ; --n >= 0 ; ap1++) {
@@ -9203,7 +9157,7 @@ getoptscmd(int argc, char **argv)
9203 char **optbase; 9157 char **optbase;
9204 9158
9205 if (argc < 3) 9159 if (argc < 3)
9206 error("Usage: getopts optstring var [arg]"); 9160 sh_error("Usage: getopts optstring var [arg]");
9207 else if (argc == 3) { 9161 else if (argc == 3) {
9208 optbase = shellparam.p; 9162 optbase = shellparam.p;
9209 if (shellparam.optind > shellparam.nparam + 1) { 9163 if (shellparam.optind > shellparam.nparam + 1) {
@@ -9253,13 +9207,13 @@ nextopt(const char *optstring)
9253 c = *p++; 9207 c = *p++;
9254 for (q = optstring ; *q != c ; ) { 9208 for (q = optstring ; *q != c ; ) {
9255 if (*q == '\0') 9209 if (*q == '\0')
9256 error("Illegal option -%c", c); 9210 sh_error("Illegal option -%c", c);
9257 if (*++q == ':') 9211 if (*++q == ':')
9258 q++; 9212 q++;
9259 } 9213 }
9260 if (*++q == ':') { 9214 if (*++q == ':') {
9261 if (*p == '\0' && (p = *argptr++) == NULL) 9215 if (*p == '\0' && (p = *argptr++) == NULL)
9262 error("No arg for -%c option", c); 9216 sh_error("No arg for -%c option", c);
9263 optionarg = p; 9217 optionarg = p;
9264 p = NULL; 9218 p = NULL;
9265 } 9219 }
@@ -9268,7 +9222,7 @@ nextopt(const char *optstring)
9268} 9222}
9269 9223
9270 9224
9271/* $NetBSD: output.c,v 1.27 2002/11/24 22:35:42 christos Exp $ */ 9225/* output.c */
9272 9226
9273void 9227void
9274outstr(const char *p, FILE *file) 9228outstr(const char *p, FILE *file)
@@ -9336,7 +9290,7 @@ fmtstr(char *outbuf, size_t length, const char *fmt, ...)
9336 9290
9337 9291
9338 9292
9339/* $NetBSD: parser.c,v 1.54 2002/11/24 22:35:42 christos Exp $ */ 9293/* parser.c */
9340 9294
9341 9295
9342/* 9296/*
@@ -10855,7 +10809,7 @@ static void synexpect(int token)
10855static void 10809static void
10856synerror(const char *msg) 10810synerror(const char *msg)
10857{ 10811{
10858 error("Syntax error: %s", msg); 10812 sh_error("Syntax error: %s", msg);
10859 /* NOTREACHED */ 10813 /* NOTREACHED */
10860} 10814}
10861 10815
@@ -10923,7 +10877,7 @@ static const char *const *findkwd(const char *s)
10923 sizeof(const char *), pstrcmp); 10877 sizeof(const char *), pstrcmp);
10924} 10878}
10925 10879
10926/* $NetBSD: redir.c,v 1.27 2002/11/24 22:35:42 christos Exp $ */ 10880/* redir.c */
10927 10881
10928/* 10882/*
10929 * Code for dealing with input/output redirection. 10883 * Code for dealing with input/output redirection.
@@ -11007,7 +10961,7 @@ openhere(union node *redir)
11007 size_t len = 0; 10961 size_t len = 0;
11008 10962
11009 if (pipe(pip) < 0) 10963 if (pipe(pip) < 0)
11010 error("Pipe call failed"); 10964 sh_error("Pipe call failed");
11011 if (redir->type == NHERE) { 10965 if (redir->type == NHERE) {
11012 len = strlen(redir->nhere.doc->narg.text); 10966 len = strlen(redir->nhere.doc->narg.text);
11013 if (len <= PIPESIZE) { 10967 if (len <= PIPESIZE) {
@@ -11088,9 +11042,9 @@ openredirect(union node *redir)
11088 11042
11089 return f; 11043 return f;
11090ecreate: 11044ecreate:
11091 error("cannot create %s: %s", fname, errmsg(errno, E_CREAT)); 11045 sh_error("cannot create %s: %s", fname, errmsg(errno, E_CREAT));
11092eopen: 11046eopen:
11093 error("cannot open %s: %s", fname, errmsg(errno, E_OPEN)); 11047 sh_error("cannot open %s: %s", fname, errmsg(errno, E_OPEN));
11094} 11048}
11095 11049
11096static inline void 11050static inline void
@@ -11164,7 +11118,7 @@ redirect(union node *redir, int flags)
11164 if (i != EBADF) { 11118 if (i != EBADF) {
11165 close(newfd); 11119 close(newfd);
11166 errno = i; 11120 errno = i;
11167 error("%d: %m", fd); 11121 sh_error("%d: %m", fd);
11168 /* NOTREACHED */ 11122 /* NOTREACHED */
11169 } 11123 }
11170 } else { 11124 } else {
@@ -11247,7 +11201,7 @@ copyfd(int from, int to)
11247 if (errno == EMFILE) 11201 if (errno == EMFILE)
11248 return EMPTY; 11202 return EMPTY;
11249 else 11203 else
11250 error("%d: %m", from); 11204 sh_error("%d: %m", from);
11251 } 11205 }
11252 return newfd; 11206 return newfd;
11253} 11207}
@@ -11273,7 +11227,7 @@ redirectsafe(union node *redir, int flags)
11273 return err; 11227 return err;
11274} 11228}
11275 11229
11276/* $NetBSD: show.c,v 1.24 2003/01/22 20:36:04 dsl Exp $ */ 11230/* show.c */
11277 11231
11278#ifdef DEBUG 11232#ifdef DEBUG
11279static void shtree(union node *, int, char *, FILE*); 11233static void shtree(union node *, int, char *, FILE*);
@@ -11620,7 +11574,7 @@ opentrace(void)
11620#endif /* DEBUG */ 11574#endif /* DEBUG */
11621 11575
11622 11576
11623/* $NetBSD: trap.c,v 1.28 2002/11/24 22:35:43 christos Exp $ */ 11577/* trap.c */
11624 11578
11625/* 11579/*
11626 * Sigmode records the current value of the signal handlers for the various 11580 * Sigmode records the current value of the signal handlers for the various
@@ -11669,7 +11623,7 @@ trapcmd(int argc, char **argv)
11669 action = *ap++; 11623 action = *ap++;
11670 while (*ap) { 11624 while (*ap) {
11671 if ((signo = decode_signal(*ap, 0)) < 0) 11625 if ((signo = decode_signal(*ap, 0)) < 0)
11672 error("%s: bad trap", *ap); 11626 sh_error("%s: bad trap", *ap);
11673 INTOFF; 11627 INTOFF;
11674 if (action) { 11628 if (action) {
11675 if (action[0] == '-' && action[1] == '\0') 11629 if (action[0] == '-' && action[1] == '\0')
@@ -11834,23 +11788,34 @@ onsig(int signo)
11834 * handlers while we are executing a trap handler. 11788 * handlers while we are executing a trap handler.
11835 */ 11789 */
11836 11790
11837void 11791int
11838dotrap(void) 11792dotrap(void)
11839{ 11793{
11840 char *p; 11794 char *p;
11841 char *q; 11795 char *q;
11796 int i;
11842 int savestatus; 11797 int savestatus;
11798 int skip = 0;
11843 11799
11844 savestatus = exitstatus; 11800 savestatus = exitstatus;
11845 q = gotsig; 11801 pendingsigs = 0;
11846 while (pendingsigs = 0, xbarrier(), (p = memchr(q, 1, NSIG - 1))) { 11802 xbarrier();
11847 *p = 0; 11803
11848 p = trap[p - q + 1]; 11804 for (i = 0, q = gotsig; i < NSIG - 1; i++, q++) {
11805 if (!*q)
11806 continue;
11807 *q = 0;
11808
11809 p = trap[i + 1];
11849 if (!p) 11810 if (!p)
11850 continue; 11811 continue;
11851 evalstring(p); 11812 skip = evalstring(p, SKIPEVAL);
11852 exitstatus = savestatus; 11813 exitstatus = savestatus;
11814 if (skip)
11815 break;
11853 } 11816 }
11817
11818 return skip;
11854} 11819}
11855 11820
11856 11821
@@ -11931,17 +11896,18 @@ exitshell(void)
11931 struct jmploc loc; 11896 struct jmploc loc;
11932 char *p; 11897 char *p;
11933 int status; 11898 int status;
11934 int jmp;
11935 11899
11936 jmp = setjmp(loc.loc);
11937 status = exitstatus; 11900 status = exitstatus;
11938 TRACE(("pid %d, exitshell(%d)\n", getpid(), status)); 11901 TRACE(("pid %d, exitshell(%d)\n", getpid(), status));
11939 if (jmp) 11902 if (setjmp(loc.loc)) {
11903 if (exception == EXEXIT)
11904 _exit(exitstatus);
11940 goto out; 11905 goto out;
11906 }
11941 handler = &loc; 11907 handler = &loc;
11942 if ((p = trap[0]) != NULL && *p != '\0') { 11908 if ((p = trap[0])) {
11943 trap[0] = NULL; 11909 trap[0] = NULL;
11944 evalstring(p); 11910 evalstring(p, 0);
11945 } 11911 }
11946 flushall(); 11912 flushall();
11947 setjobctl(0); 11913 setjobctl(0);
@@ -11966,7 +11932,7 @@ static int decode_signal(const char *string, int minsig)
11966 return name ? signo : -1; 11932 return name ? signo : -1;
11967} 11933}
11968 11934
11969/* $NetBSD: var.c,v 1.32 2003/01/22 20:36:04 dsl Exp $ */ 11935/* var.c */
11970 11936
11971static struct var *vartab[VTABSIZE]; 11937static struct var *vartab[VTABSIZE];
11972 11938
@@ -12022,7 +11988,7 @@ setvar(const char *name, const char *val, int flags)
12022 p = strchrnul(q, '='); 11988 p = strchrnul(q, '=');
12023 namelen = p - name; 11989 namelen = p - name;
12024 if (!namelen || p != q) 11990 if (!namelen || p != q)
12025 error("%.*s: bad variable name", namelen, name); 11991 sh_error("%.*s: bad variable name", namelen, name);
12026 vallen = 0; 11992 vallen = 0;
12027 if (val == NULL) { 11993 if (val == NULL) {
12028 flags |= VUNSET; 11994 flags |= VUNSET;
@@ -12031,9 +11997,8 @@ setvar(const char *name, const char *val, int flags)
12031 } 11997 }
12032 INTOFF; 11998 INTOFF;
12033 p = mempcpy(nameeq = ckmalloc(namelen + vallen + 2), name, namelen); 11999 p = mempcpy(nameeq = ckmalloc(namelen + vallen + 2), name, namelen);
12034 *p++ = '\0';
12035 if (val) { 12000 if (val) {
12036 p[-1] = '='; 12001 *p++ = '=';
12037 p = mempcpy(p, val, vallen); 12002 p = mempcpy(p, val, vallen);
12038 } 12003 }
12039 *p = '\0'; 12004 *p = '\0';
@@ -12065,7 +12030,7 @@ setvareq(char *s, int flags)
12065 if (flags & VNOSAVE) 12030 if (flags & VNOSAVE)
12066 free(s); 12031 free(s);
12067 n = vp->text; 12032 n = vp->text;
12068 error("%.*s: is read only", strchrnul(n, '=') - n, n); 12033 sh_error("%.*s: is read only", strchrnul(n, '=') - n, n);
12069 } 12034 }
12070 12035
12071 if (flags & VNOSET) 12036 if (flags & VNOSET)
@@ -12495,7 +12460,7 @@ findvar(struct var **vpp, const char *name)
12495 } 12460 }
12496 return vpp; 12461 return vpp;
12497} 12462}
12498/* $NetBSD: setmode.c,v 1.29 2003/01/15 23:58:03 kleink Exp $ */ 12463/* setmode.c */
12499 12464
12500#include <sys/times.h> 12465#include <sys/times.h>
12501 12466
@@ -12540,11 +12505,11 @@ dash_arith(const char *s)
12540 result = arith(s, &errcode); 12505 result = arith(s, &errcode);
12541 if (errcode < 0) { 12506 if (errcode < 0) {
12542 if (errcode == -3) 12507 if (errcode == -3)
12543 error("exponent less than 0"); 12508 sh_error("exponent less than 0");
12544 else if (errcode == -2) 12509 else if (errcode == -2)
12545 error("divide by zero"); 12510 sh_error("divide by zero");
12546 else if (errcode == -5) 12511 else if (errcode == -5)
12547 error("expression recursion loop detected"); 12512 sh_error("expression recursion loop detected");
12548 else 12513 else
12549 synerror(s); 12514 synerror(s);
12550 } 12515 }
@@ -12569,7 +12534,7 @@ letcmd(int argc, char **argv)
12569 12534
12570 ap = argv + 1; 12535 ap = argv + 1;
12571 if(!*ap) 12536 if(!*ap)
12572 error("expression expected"); 12537 sh_error("expression expected");
12573 for (ap = argv + 1; *ap; ap++) { 12538 for (ap = argv + 1; *ap; ap++) {
12574 i = dash_arith(*ap); 12539 i = dash_arith(*ap);
12575 } 12540 }
@@ -12578,7 +12543,7 @@ letcmd(int argc, char **argv)
12578} 12543}
12579#endif /* CONFIG_ASH_MATH_SUPPORT */ 12544#endif /* CONFIG_ASH_MATH_SUPPORT */
12580 12545
12581/* $NetBSD: miscbltin.c,v 1.31 2002/11/24 22:35:41 christos Exp $ */ 12546/* miscbltin.c */
12582 12547
12583/* 12548/*
12584 * Miscellaneous builtins. 12549 * Miscellaneous builtins.
@@ -12646,7 +12611,7 @@ readcmd(int argc, char **argv)
12646 case 'n': 12611 case 'n':
12647 nchars = strtol(optionarg, &p, 10); 12612 nchars = strtol(optionarg, &p, 10);
12648 if (*p) 12613 if (*p)
12649 error("invalid count"); 12614 sh_error("invalid count");
12650 nch_flag = (nchars > 0); 12615 nch_flag = (nchars > 0);
12651 break; 12616 break;
12652 case 's': 12617 case 's':
@@ -12663,19 +12628,19 @@ readcmd(int argc, char **argv)
12663 int scale; 12628 int scale;
12664 ts.tv_usec = strtol(p, &p2, 10); 12629 ts.tv_usec = strtol(p, &p2, 10);
12665 if (*p2) 12630 if (*p2)
12666 error("invalid timeout"); 12631 sh_error("invalid timeout");
12667 scale = p2 - p; 12632 scale = p2 - p;
12668 /* normalize to usec */ 12633 /* normalize to usec */
12669 if (scale > 6) 12634 if (scale > 6)
12670 error("invalid timeout"); 12635 sh_error("invalid timeout");
12671 while (scale++ < 6) 12636 while (scale++ < 6)
12672 ts.tv_usec *= 10; 12637 ts.tv_usec *= 10;
12673 } 12638 }
12674 } else if (*p) { 12639 } else if (*p) {
12675 error("invalid timeout"); 12640 sh_error("invalid timeout");
12676 } 12641 }
12677 if ( ! ts.tv_sec && ! ts.tv_usec) 12642 if ( ! ts.tv_sec && ! ts.tv_usec)
12678 error("invalid timeout"); 12643 sh_error("invalid timeout");
12679 break; 12644 break;
12680#endif 12645#endif
12681 case 'r': 12646 case 'r':
@@ -12689,7 +12654,7 @@ readcmd(int argc, char **argv)
12689 out2str(prompt); 12654 out2str(prompt);
12690 } 12655 }
12691 if (*(ap = argptr) == NULL) 12656 if (*(ap = argptr) == NULL)
12692 error("arg count"); 12657 sh_error("arg count");
12693 if ((ifs = bltinlookup("IFS")) == NULL) 12658 if ((ifs = bltinlookup("IFS")) == NULL)
12694 ifs = defifs; 12659 ifs = defifs;
12695#if defined(CONFIG_ASH_READ_NCHARS) 12660#if defined(CONFIG_ASH_READ_NCHARS)
@@ -12832,14 +12797,14 @@ static int umaskcmd(int argc, char **argv)
12832 mask = 0; 12797 mask = 0;
12833 do { 12798 do {
12834 if (*ap >= '8' || *ap < '0') 12799 if (*ap >= '8' || *ap < '0')
12835 error(illnum, argv[1]); 12800 sh_error(illnum, argv[1]);
12836 mask = (mask << 3) + (*ap - '0'); 12801 mask = (mask << 3) + (*ap - '0');
12837 } while (*++ap != '\0'); 12802 } while (*++ap != '\0');
12838 umask(mask); 12803 umask(mask);
12839 } else { 12804 } else {
12840 mask = ~mask & 0777; 12805 mask = ~mask & 0777;
12841 if (!bb_parse_mode(ap, &mask)) { 12806 if (!bb_parse_mode(ap, &mask)) {
12842 error("Illegal mode: %s", ap); 12807 sh_error("Illegal mode: %s", ap);
12843 } 12808 }
12844 umask(~mask & 0777); 12809 umask(~mask & 0777);
12845 } 12810 }
@@ -12989,7 +12954,7 @@ ulimitcmd(int argc, char **argv)
12989 char *p = *argptr; 12954 char *p = *argptr;
12990 12955
12991 if (all || argptr[1]) 12956 if (all || argptr[1])
12992 error("too many arguments"); 12957 sh_error("too many arguments");
12993 if (strncmp(p, "unlimited\n", 9) == 0) 12958 if (strncmp(p, "unlimited\n", 9) == 0)
12994 val = RLIM_INFINITY; 12959 val = RLIM_INFINITY;
12995 else { 12960 else {
@@ -13002,7 +12967,7 @@ ulimitcmd(int argc, char **argv)
13002 break; 12967 break;
13003 } 12968 }
13004 if (c) 12969 if (c)
13005 error("bad number"); 12970 sh_error("bad number");
13006 val *= l->factor; 12971 val *= l->factor;
13007 } 12972 }
13008 } 12973 }
@@ -13022,7 +12987,7 @@ ulimitcmd(int argc, char **argv)
13022 if (how & SOFT) 12987 if (how & SOFT)
13023 limit.rlim_cur = val; 12988 limit.rlim_cur = val;
13024 if (setrlimit(l->cmd, &limit) < 0) 12989 if (setrlimit(l->cmd, &limit) < 0)
13025 error("error setting limit (%m)"); 12990 sh_error("error setting limit (%m)");
13026 } else { 12991 } else {
13027 printlim(how, &limit, l); 12992 printlim(how, &limit, l);
13028 } 12993 }