* When debugging is on, debugging info will be written to ./trace and
* a quit signal will generate a core dump.
*/
+#define DEBUG 0
#define IFS_BROKEN
#include "busybox.h"
-#ifdef DEBUG
+#if DEBUG
#define _GNU_SOURCE
#endif
#include <time.h>
#include <fnmatch.h>
-#include "pwd_.h"
-
#ifdef CONFIG_ASH_JOB_CONTROL
#define JOBS 1
#else
-#undef JOBS
+#define JOBS 0
#endif
#if JOBS || defined(CONFIG_ASH_READ_NCHARS)
#error "Do not even bother, ash will not run on uClinux"
#endif
-#ifdef DEBUG
+#if DEBUG
#define _DIAGASSERT(assert_expr) assert(assert_expr)
#else
#define _DIAGASSERT(assert_expr)
static const char illnum[] = "Illegal number: %s";
static const char homestr[] = "HOME";
-#ifdef DEBUG
+#if DEBUG
#define TRACE(param) trace param
#define TRACEV(param) tracev param
#else
{ BUILTIN_REGULAR "wait", waitcmd },
};
-#define NUMBUILTINS (sizeof (builtincmd) / sizeof (struct builtincmd) )
-
-static const char *safe_applets[] = {
- "[", "test", "echo", "cat",
- "ln", "cp", "touch", "mkdir", "rm",
- "cut", "hexdump", "awk", "sort",
- "find", "xargs", "ls", "dd",
- "chown", "chmod"
-};
+#define NUMBUILTINS (sizeof(builtincmd) / sizeof(builtincmd[0]))
struct cmdentry {
#endif
#ifdef CONFIG_LOCALE_SUPPORT
-#include <locale.h>
static void change_lc_all(const char *value);
static void change_lc_ctype(const char *value);
#endif
#define uflag optlist[12]
#define viflag optlist[13]
-#ifdef DEBUG
+#if DEBUG
#define nolog optlist[14]
#define debug optlist[15]
#endif
"b" "notify",
"u" "nounset",
"\0" "vi",
-#ifdef DEBUG
+#if DEBUG
"\0" "nolog",
"\0" "debug",
#endif
/* show.h */
-#ifdef DEBUG
+#if DEBUG
static void showtree(union node *);
static void trace(const char *, ...);
static void tracev(const char *, va_list);
static int is_safe_applet(char *name)
{
- int n = sizeof(safe_applets) / sizeof(char *);
+ /* It isn't a bug to have non-existent applet here... */
+ /* ...just a waste of space... */
+ static const char safe_applets[][8] = {
+ "["
+ USE_AWK (, "awk" )
+ USE_CAT (, "cat" )
+ USE_CHMOD (, "chmod" )
+ USE_CHOWN (, "chown" )
+ USE_CP (, "cp" )
+ USE_CUT (, "cut" )
+ USE_DD (, "dd" )
+ USE_ECHO (, "echo" )
+ USE_FIND (, "find" )
+ USE_HEXDUMP(, "hexdump")
+ USE_LN (, "ln" )
+ USE_LS (, "ls" )
+ USE_MKDIR (, "mkdir" )
+ USE_RM (, "rm" )
+ USE_SORT (, "sort" )
+ USE_TEST (, "test" )
+ USE_TOUCH (, "touch" )
+ USE_XARGS (, "xargs" )
+ };
+ int n = sizeof(safe_applets) / sizeof(safe_applets[0]);
int i;
for (i = 0; i < n; i++)
if (strcmp(safe_applets[i], name) == 0)
INTOFF;
*app = freealias(*app);
INTON;
- return (0);
+ return 0;
}
- return (1);
+ return 1;
}
static void
struct alias *ap = *__lookupalias(name);
if (check && ap && (ap->flag & ALIASINUSE))
- return (NULL);
- return (ap);
+ return NULL;
+ return ap;
}
/*
for (ap = atab[i]; ap; ap = ap->next) {
printalias(ap);
}
- return (0);
+ return 0;
}
while ((n = *++argv) != NULL) {
if ((v = strchr(n+1, '=')) == NULL) { /* n+1: funny ksh stuff */
}
}
- return (ret);
+ return ret;
}
static int
while ((i = nextopt("a")) != '\0') {
if (i == 'a') {
rmaliases();
- return (0);
+ return 0;
}
}
for (i = 0; *argptr; argptr++) {
}
}
- return (i);
+ return i;
}
static struct alias *
dest = *argptr;
if (!dest)
dest = bltinlookup(homestr);
- else if (dest[0] == '-' && dest[1] == '\0') {
+ else if (LONE_DASH(dest)) {
dest = bltinlookup("OLDPWD");
flags |= CD_PRINT;
}
}
p = strtok(cdcomppath, "/");
while (p) {
- switch(*p) {
+ switch (*p) {
case '.':
if (p[1] == '.' && p[2] == '\0') {
while (new > lim) {
static void
exraise(int e)
{
-#ifdef DEBUG
+#if DEBUG
if (handler == NULL)
abort();
#endif
static void
exverror(int cond, const char *msg, va_list ap)
{
-#ifdef DEBUG
+#if DEBUG
if (msg) {
TRACE(("exverror(%d, \"", cond));
TRACEV((msg, ap));
getpid(), n, n->type, flags));
switch (n->type) {
default:
-#ifdef DEBUG
+#if DEBUG
out1fmt("Node type = %d\n", n->type);
fflush(stdout);
break;
for (redir = n ; redir ; redir = redir->nfile.next) {
struct arglist fn;
+ memset(&fn, 0, sizeof(struct arglist));
fn.lastp = &fn.list;
switch (redir->type) {
case NFROMTO:
case NTOFD:
if (redir->ndup.vname) {
expandarg(redir->ndup.vname, &fn, EXP_FULL | EXP_TILDE);
- fixredir(redir, fn.list->text, 1);
+ if (fn.list != NULL)
+ fixredir(redir, fn.list->text, 1);
+ else
+ sh_error("redir error");
}
break;
}
clearredir(1);
envp = environment();
- if (strchr(argv[0], '/') != NULL
- || is_safe_applet(argv[0])
+ if (strchr(argv[0], '/')
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
- || find_applet_by_name(argv[0])
+ || find_applet_by_name(argv[0])
#endif
- ) {
+ ) {
tryexec(argv[0], argv, envp);
e = errno;
} else {
int argc = 0;
char **c;
- if(strchr(cmd, '/') == NULL && is_safe_applet(cmd) && (a = find_applet_by_name(cmd)) != NULL) {
+ if (strchr(cmd, '/') == NULL
+ && (a = find_applet_by_name(cmd)) != NULL
+ && is_safe_applet(cmd)
+ ) {
c = argv;
while (*c != NULL) {
c++; argc++;
exit(a->main(argc, argv));
}
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
- if(find_applet_by_name(cmd) != NULL) {
+ if (find_applet_by_name(cmd) != NULL) {
/* re-exec ourselves with the new arguments */
execve(CONFIG_BUSYBOX_EXEC_PATH,argv,envp);
/* If they called chroot or otherwise made the binary no longer
verify |= VERIFY_VERBOSE;
else if (c == 'v')
verify |= VERIFY_BRIEF;
-#ifdef DEBUG
+#if DEBUG
else if (c != 'p')
abort();
#endif
name = p + 1;
while ((c = *++p) != '\0') {
- switch(c) {
+ switch (c) {
case CTLESC:
- return (startp);
+ return startp;
case CTLQUOTEMARK:
- return (startp);
+ return startp;
case ':':
if (flag & EXP_VARTILDE)
goto done;
startloc = expdest - (char *)stackblock();
strtodest(home, SQSYNTAX, quotes);
recordregion(startloc, expdest - (char *)stackblock(), 0);
- return (p);
+ return p;
lose:
*p = c;
- return (startp);
+ return startp;
}
while (*p != CTLARI) {
p--;
-#ifdef DEBUG
+#if DEBUG
if (p < start) {
sh_error("missing CTLARI (shouldn't happen)");
}
}
subtype -= VSTRIMRIGHT;
-#ifdef DEBUG
+#if DEBUG
if (subtype < 0 || subtype > 3)
abort();
#endif
goto end;
}
-#ifdef DEBUG
+#if DEBUG
switch (subtype) {
case VSTRIMLEFT:
case VSTRIMLEFTMAX:
}
q = r;
if (len > 0) {
- q = mempcpy(q, str, len);
+ q = memcpy(q, str, len) + len;
}
}
inquotes = (flag & RMESCAPE_QUOTED) ^ RMESCAPE_QUOTED;
jpp = curp;
switch (mode) {
default:
-#ifdef DEBUG
+#if DEBUG
abort();
#endif
case CUR_DELETE:
while ((c = nextopt("ls:")) != '\0')
switch (c) {
default:
-#ifdef DEBUG
+#if DEBUG
abort();
#endif
case 'l':
}
#endif /* JOBS */
-#if defined(JOBS) || defined(DEBUG)
+#if JOBS || DEBUG
static int
jobno(const struct job *jp)
{
if (*p == '\0')
continue;
for (q = p ; *q ; q++);
-#ifdef DEBUG
+#if DEBUG
if (q[-1] != '/')
abort();
#endif
goto state4;
}
handler = &jmploc;
-#ifdef DEBUG
+#if DEBUG
opentrace();
trputs("Shell args: "); trargs(argv);
#endif
#if PROFILE
monitor(0);
#endif
-#if GPROF
+#ifdef GPROF
{
extern void _mcleanup(void);
_mcleanup();
static int
echocmd(int argc, char **argv)
{
- return bb_echo(argc, argv);
+ return bb_echo(argv);
}
#endif
void
stunalloc(pointer p)
{
-#ifdef DEBUG
+#if DEBUG
if (!p || (stacknxt < (char *)p) || ((char *)p < stackp->space)) {
write(2, "stunalloc\n", 10);
abort();
stnputs(const char *s, size_t n, char *p)
{
p = makestrspace(n, p);
- p = mempcpy(p, s, n);
+ p = memcpy(p, s, n) + n;
return p;
}
q = p = makestrspace(len + 3, p);
*q++ = '\'';
- q = mempcpy(q, s, len);
+ q = memcpy(q, s, len) + len;
*q++ = '\'';
s += len;
q = p = makestrspace(len + 3, p);
*q++ = '"';
- q = mempcpy(q, s, len);
+ q = memcpy(q, s, len) + len;
*q++ = '"';
s += len;
static char *
-nodesavestr(char *s)
+nodesavestr(char *s)
{
- char *rtn = funcstring;
+ char *rtn = funcstring;
- funcstring = stpcpy(funcstring, s) + 1;
+ strcpy(funcstring, s);
+ funcstring += strlen(s) + 1;
return rtn;
}
void
optschanged(void)
{
-#ifdef DEBUG
+#if DEBUG
opentrace();
#endif
setinteractive(iflag);
argptr++;
if ((c = *p++) == '-') {
val = 1;
- if (p[0] == '\0' || (p[0] == '-' && p[1] == '\0')) {
+ if (p[0] == '\0' || LONE_DASH(p)) {
if (!cmdline) {
/* "-" means turn off -x and -v */
if (p[0] == '\0')
goto out;
}
optnext++;
- if (p[0] == '-' && p[1] == '\0') /* check for "--" */
+ if (LONE_DASH(p)) /* check for "--" */
goto atend;
}
if (p == NULL || *p != '-' || *++p == '\0')
return '\0';
argptr++;
- if (p[0] == '-' && p[1] == '\0') /* check for "--" */
+ if (LONE_DASH(p)) /* check for "--" */
return '\0';
}
c = *p++;
if (is_digit(text[0]) && text[1] == '\0')
n->ndup.dupfd = digit_val(text[0]);
- else if (text[0] == '-' && text[1] == '\0')
+ else if (LONE_DASH(text))
n->ndup.dupfd = -1;
else {
readtoken(void)
{
int t;
-#ifdef DEBUG
+#if DEBUG
int alreadyseen = tokpushback;
#endif
}
out:
checkkwd = 0;
-#ifdef DEBUG
+#if DEBUG
if (!alreadyseen)
TRACE(("token %s %s\n", tokname(t), t == TWORD ? wordtext : ""));
else
TRACE(("reread token %s %s\n", tokname(t), t == TWORD ? wordtext : ""));
#endif
- return (t);
+ return t;
}
CHECKEND(); /* set c to PEOF if at end of here document */
for (;;) { /* until end of line or end of word */
CHECKSTRSPACE(4, out); /* permit 4 calls to USTPUTC */
- switch(SIT(c, syntax)) {
+ switch (SIT(c, syntax)) {
case CNL: /* '\n' */
if (syntax == BASESYNTAX)
goto endword; /* exit outer loop */
goto ecreate;
break;
default:
-#ifdef DEBUG
+#if DEBUG
abort();
#endif
/* Fall through to eliminate warning. */
/* show.c */
-#ifdef DEBUG
+#if DEBUG
static void shtree(union node *, int, char *, FILE*);
static void shcmd(union node *, FILE *);
static void sharg(union node *, FILE *);
return;
indent(ind, pfx, fp);
- switch(n->type) {
+ switch (n->type) {
case NSEMI:
s = "; ";
goto binop;
sh_error("%s: bad trap", *ap);
INTOFF;
if (action) {
- if (action[0] == '-' && action[1] == '\0')
+ if (LONE_DASH(action))
action = NULL;
else
action = savestr(action);
action = S_CATCH;
break;
case SIGQUIT:
-#ifdef DEBUG
+#if DEBUG
if (debug)
break;
#endif
}
}
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
- {
- extern const struct BB_applet applets[];
- extern const size_t NUM_APPLETS;
-
- for (i = 0; i < NUM_APPLETS; i++) {
-
- col += out1fmt("%c%s", ((col == 0) ? '\t' : ' '), applets[i].name);
- if (col > 60) {
- out1fmt("\n");
- col = 0;
- }
+ for (i = 0; i < NUM_APPLETS; i++) {
+ col += out1fmt("%c%s", ((col == 0) ? '\t' : ' '), applets[i].name);
+ if (col > 60) {
+ out1fmt("\n");
+ col = 0;
}
}
#endif
vallen = strlen(val);
}
INTOFF;
- p = mempcpy(nameeq = ckmalloc(namelen + vallen + 2), name, namelen);
+ nameeq = ckmalloc(namelen + vallen + 2);
+ p = memcpy(nameeq, name, namelen) + namelen;
if (val) {
*p++ = '=';
- p = mempcpy(p, val, vallen);
+ p = memcpy(p, val, vallen) + vallen;
}
*p = '\0';
setvareq(nameeq, flags | VNOSAVE);
INTOFF;
lvp = ckmalloc(sizeof (struct localvar));
- if (name[0] == '-' && name[1] == '\0') {
+ if (LONE_DASH(name)) {
char *p;
p = ckmalloc(sizeof(optlist));
lvp->text = memcpy(p, optlist, sizeof(optlist));
}
INTON;
- return (result);
+ return result;
}
letcmd(int argc, char **argv)
{
char **ap;
- arith_t i;
+ arith_t i = 0;
ap = argv + 1;
if(!*ap)
i = dash_arith(*ap);
}
- return (!i);
+ return !i;
}
#endif /* CONFIG_ASH_MATH_SUPPORT */
#undef rflag
-#ifdef __GLIBC__
-#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 1
+#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ < 1
typedef enum __rlimit_resource rlim_t;
#endif
-#endif
/*
while ((i = nextopt("p:r")) != '\0')
#endif
{
- switch(i) {
+ switch (i) {
case 'p':
prompt = optionarg;
break;
FD_ZERO (&set);
FD_SET (0, &set);
- i = select (FD_SETSIZE, &set, NULL, NULL, &ts);
+ i = select(FD_SETSIZE, &set, NULL, NULL, &ts);
if (!i) {
#if defined(CONFIG_ASH_READ_NCHARS)
if (nch_flag)
/* protect geting var value, is number now */
numptr_m1->var = NULL;
return 0;
-err: return(-1);
+ err:
+ return -1;
}
/* longest must first */
* a number, since it evaluates to one). Think about it.
* It makes sense. */
if (lasttok != TOK_NUM) {
- switch(op) {
+ switch (op) {
case TOK_ADD:
op = TOK_UPLUS;
break;
#endif /* CONFIG_ASH_MATH_SUPPORT */
-#ifdef DEBUG
+#if DEBUG
const char *applet_name = "debug stuff usage";
int main(int argc, char **argv)
{