mirror of https://github.com/mirror/busybox.git
Make private ash config options be public
parent
b75b6e2c35
commit
d35c5df08c
210
shell/ash.c
210
shell/ash.c
|
@ -33,46 +33,6 @@
|
|||
*/
|
||||
|
||||
|
||||
/* These defines allow you to adjust the feature set to be compiled
|
||||
* into the ash shell. As a rule, enabling these options will make
|
||||
* ash get bigger... With all of these options off, ash adds about
|
||||
* 60k to busybox on an x86 system.*/
|
||||
|
||||
|
||||
/* Enable job control. This allows you to run jobs in the background,
|
||||
* which is great when ash is being used as an interactive shell, but
|
||||
* it completely useless for is all you are doing is running scripts.
|
||||
* This adds about 2.5k on an x86 system. */
|
||||
#undef JOBS
|
||||
|
||||
/* This enables alias support in ash. If you want to support things
|
||||
* like "alias ls='ls -l'" with ash, enable this. This is only useful
|
||||
* when ash is used as an intractive shell. This adds about 1.5k */
|
||||
#define ASH_ALIAS
|
||||
|
||||
/* If you need ash to act as a full Posix shell, with full math
|
||||
* support, enable this. This adds a bit over 2k an x86 system. */
|
||||
//#undef ASH_MATH_SUPPORT
|
||||
#define ASH_MATH_SUPPORT
|
||||
|
||||
/* Getopts is used by shell procedures to parse positional parameters.
|
||||
* You probably want to leave this disabled, and use the busybox getopt
|
||||
* applet if you want to do this sort of thing. There are some scripts
|
||||
* out there that use it, so it you need it, enable. Most people will
|
||||
* leave this disabled. This adds 1k on an x86 system. */
|
||||
#undef ASH_GETOPTS
|
||||
|
||||
/* This allows you to override shell builtins and use whatever is on
|
||||
* the filesystem. This is most useful when ash is acting as a
|
||||
* standalone shell. Adds about 272 bytes. */
|
||||
#undef ASH_CMDCMD
|
||||
|
||||
/* Check for new mail on interactive shells? */
|
||||
#undef ASH_MAIL
|
||||
|
||||
/* Optimize size vs speed as size */
|
||||
#define ASH_OPTIMIZE_FOR_SIZE
|
||||
|
||||
/* Enable this to compile in extra debugging noise. When debugging is
|
||||
* on, debugging info will be written to $HOME/trace and a quit signal
|
||||
* will generate a core dump. */
|
||||
|
@ -118,7 +78,7 @@
|
|||
#include <glob.h>
|
||||
#endif
|
||||
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
#include <termios.h>
|
||||
#endif
|
||||
|
||||
|
@ -281,7 +241,7 @@ static volatile int suppressint;
|
|||
static volatile int intpending;
|
||||
|
||||
#define INTOFF suppressint++
|
||||
#ifndef ASH_OPTIMIZE_FOR_SIZE
|
||||
#ifndef CONFIG_ASH_OPTIMIZE_FOR_SIZE
|
||||
#define INTON { if (--suppressint == 0 && intpending) onint(); }
|
||||
#define FORCEINTON {suppressint = 0; if (intpending) onint();}
|
||||
#else
|
||||
|
@ -608,7 +568,7 @@ struct strpush {
|
|||
struct strpush *prev; /* preceding string on stack */
|
||||
char *prevstring;
|
||||
int prevnleft;
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
struct alias *ap; /* if push was associated with an alias */
|
||||
#endif
|
||||
char *string; /* remember the string since it may change */
|
||||
|
@ -685,14 +645,14 @@ static inline void outstr (const char *p, FILE *file) { fputs(p, file); }
|
|||
static void out1str(const char *p) { outstr(p, stdout); }
|
||||
static void out2str(const char *p) { outstr(p, stderr); }
|
||||
|
||||
#ifndef ASH_OPTIMIZE_FOR_SIZE
|
||||
#ifndef CONFIG_ASH_OPTIMIZE_FOR_SIZE
|
||||
#define out2c(c) putc((c), stderr)
|
||||
#else
|
||||
static void out2c(int c) { putc(c, stderr); }
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef ASH_OPTIMIZE_FOR_SIZE
|
||||
#ifdef CONFIG_ASH_OPTIMIZE_FOR_SIZE
|
||||
#define USE_SIT_FUNCTION
|
||||
#endif
|
||||
|
||||
|
@ -1313,7 +1273,7 @@ static char *optptr; /* used by nextopt */
|
|||
static char *minusc; /* argument to -c option */
|
||||
|
||||
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
|
||||
#define ALIASINUSE 1
|
||||
#define ALIASDEAD 2
|
||||
|
@ -1507,7 +1467,7 @@ __lookupalias(const char *name)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef ASH_MATH_SUPPORT
|
||||
#ifdef CONFIG_ASH_MATH_SUPPORT
|
||||
/* The generated file arith.c has been replaced with a custom hand
|
||||
* written implementation written by Aaron Lehmann <aaronl@vitelus.com>.
|
||||
* This is now part of libbb, so that it can be used by all the shells
|
||||
|
@ -1524,7 +1484,7 @@ static int pendingsigs; /* indicates some signal received */
|
|||
* This file was generated by the mkbuiltins program.
|
||||
*/
|
||||
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
static int bgcmd (int, char **);
|
||||
static int fgcmd (int, char **);
|
||||
static int killcmd (int, char **);
|
||||
|
@ -1532,7 +1492,7 @@ static int killcmd (int, char **);
|
|||
static int bltincmd (int, char **);
|
||||
static int cdcmd (int, char **);
|
||||
static int breakcmd (int, char **);
|
||||
#ifdef ASH_CMDCMD
|
||||
#ifdef CONFIG_ASH_CMDCMD
|
||||
static int commandcmd (int, char **);
|
||||
#endif
|
||||
static int dotcmd (int, char **);
|
||||
|
@ -1553,7 +1513,7 @@ static int setvarcmd (int, char **);
|
|||
static int shiftcmd (int, char **);
|
||||
static int trapcmd (int, char **);
|
||||
static int umaskcmd (int, char **);
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
static int aliascmd (int, char **);
|
||||
static int unaliascmd (int, char **);
|
||||
#endif
|
||||
|
@ -1561,11 +1521,11 @@ static int unsetcmd (int, char **);
|
|||
static int waitcmd (int, char **);
|
||||
static int ulimitcmd (int, char **);
|
||||
static int timescmd (int, char **);
|
||||
#ifdef ASH_MATH_SUPPORT
|
||||
#ifdef CONFIG_ASH_MATH_SUPPORT
|
||||
static int letcmd (int, char **);
|
||||
#endif
|
||||
static int typecmd (int, char **);
|
||||
#ifdef ASH_GETOPTS
|
||||
#ifdef CONFIG_ASH_GETOPTS
|
||||
static int getoptscmd (int, char **);
|
||||
#endif
|
||||
|
||||
|
@ -1606,17 +1566,17 @@ struct builtincmd {
|
|||
static const struct builtincmd builtincmds[] = {
|
||||
{ BUILTIN_SPECIAL ".", dotcmd }, /* first, see declare DOTCMD */
|
||||
{ BUILTIN_SPECIAL ":", true_main },
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
{ BUILTIN_REG_ASSG "alias", aliascmd },
|
||||
#endif
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
{ BUILTIN_REGULAR "bg", bgcmd },
|
||||
#endif
|
||||
{ BUILTIN_SPECIAL "break", breakcmd },
|
||||
{ BUILTIN_SPECIAL "builtin", bltincmd },
|
||||
{ BUILTIN_REGULAR "cd", cdcmd },
|
||||
{ BUILTIN_NOSPEC "chdir", cdcmd },
|
||||
#ifdef ASH_CMDCMD
|
||||
#ifdef CONFIG_ASH_CMDCMD
|
||||
{ BUILTIN_REGULAR "command", commandcmd },
|
||||
#endif
|
||||
{ BUILTIN_SPECIAL "continue", breakcmd },
|
||||
|
@ -1626,19 +1586,19 @@ static const struct builtincmd builtincmds[] = {
|
|||
{ BUILTIN_SPEC_ASSG "export", exportcmd },
|
||||
{ BUILTIN_REGULAR "false", false_main },
|
||||
{ BUILTIN_REGULAR "fc", histcmd },
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
{ BUILTIN_REGULAR "fg", fgcmd },
|
||||
#endif
|
||||
#ifdef ASH_GETOPTS
|
||||
#ifdef CONFIG_ASH_GETOPTS
|
||||
{ BUILTIN_REGULAR "getopts", getoptscmd },
|
||||
#endif
|
||||
{ BUILTIN_NOSPEC "hash", hashcmd },
|
||||
{ BUILTIN_NOSPEC "help", helpcmd },
|
||||
{ BUILTIN_REGULAR "jobs", jobscmd },
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
{ BUILTIN_REGULAR "kill", killcmd },
|
||||
#endif
|
||||
#ifdef ASH_MATH_SUPPORT
|
||||
#ifdef CONFIG_ASH_MATH_SUPPORT
|
||||
{ BUILTIN_REGULAR "let", letcmd },
|
||||
#endif
|
||||
{ BUILTIN_ASSIGN "local", localcmd },
|
||||
|
@ -1655,7 +1615,7 @@ static const struct builtincmd builtincmds[] = {
|
|||
{ BUILTIN_NOSPEC "type", typecmd },
|
||||
{ BUILTIN_NOSPEC "ulimit", ulimitcmd },
|
||||
{ BUILTIN_REGULAR "umask", umaskcmd },
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
{ BUILTIN_REGULAR "unalias", unaliascmd },
|
||||
#endif
|
||||
{ BUILTIN_SPECIAL "unset", unsetcmd },
|
||||
|
@ -1669,7 +1629,7 @@ static struct builtincmd *EXECCMD;
|
|||
static struct builtincmd *EVALCMD;
|
||||
|
||||
/* states */
|
||||
#define JOBSTOPPED 1 /* all procs are stopped */
|
||||
#define CONFIG_ASH_JOB_CONTROLTOPPED 1 /* all procs are stopped */
|
||||
#define JOBDONE 2 /* all procs are completed */
|
||||
|
||||
/*
|
||||
|
@ -1688,7 +1648,7 @@ struct procstat {
|
|||
|
||||
static int job_warning; /* user was warned about stopped jobs */
|
||||
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
static void setjobctl(int enable);
|
||||
#else
|
||||
#define setjobctl(on) /* do nothing */
|
||||
|
@ -1703,7 +1663,7 @@ struct job {
|
|||
char state; /* true if job is finished */
|
||||
char used; /* true if this entry is in used */
|
||||
char changed; /* true if status has changed */
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
char jobctl; /* job running under job control */
|
||||
#endif
|
||||
};
|
||||
|
@ -1711,7 +1671,7 @@ struct job {
|
|||
static struct job *jobtab; /* array of jobs */
|
||||
static int njobs; /* size of array */
|
||||
static int backgndpid = -1; /* pid of last background process */
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
static int initialpgrp; /* pgrp of shell on invocation */
|
||||
static int curjob; /* current job */
|
||||
static int jobctl;
|
||||
|
@ -2085,7 +2045,7 @@ errmsg(int e, int action)
|
|||
}
|
||||
|
||||
|
||||
#ifdef ASH_OPTIMIZE_FOR_SIZE
|
||||
#ifdef CONFIG_ASH_OPTIMIZE_FOR_SIZE
|
||||
static void
|
||||
__inton() {
|
||||
if (--suppressint == 0 && intpending) {
|
||||
|
@ -3053,7 +3013,7 @@ true_main(int argc, char **argv)
|
|||
|
||||
static void setsignal(int signo);
|
||||
|
||||
#ifdef ASH_MAIL
|
||||
#ifdef CONFIG_ASH_MAIL
|
||||
static void chkmail(int silent);
|
||||
#endif
|
||||
|
||||
|
@ -3068,7 +3028,7 @@ setinteractive(int on)
|
|||
setsignal(SIGINT);
|
||||
setsignal(SIGQUIT);
|
||||
setsignal(SIGTERM);
|
||||
#ifdef ASH_MAIL
|
||||
#ifdef CONFIG_ASH_MAIL
|
||||
chkmail(1);
|
||||
#endif
|
||||
is_interactive = on;
|
||||
|
@ -3183,7 +3143,7 @@ static void
|
|||
initshellproc(void)
|
||||
{
|
||||
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
/* from alias.c: */
|
||||
{
|
||||
rmaliases();
|
||||
|
@ -3202,7 +3162,7 @@ initshellproc(void)
|
|||
/* from jobs.c: */
|
||||
{
|
||||
backgndpid = -1;
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
jobctl = 0;
|
||||
#endif
|
||||
}
|
||||
|
@ -3247,7 +3207,7 @@ static void pushfile (void);
|
|||
* Nul characters in the input are silently discarded.
|
||||
*/
|
||||
|
||||
#ifndef ASH_OPTIMIZE_FOR_SIZE
|
||||
#ifndef CONFIG_ASH_OPTIMIZE_FOR_SIZE
|
||||
#define pgetc_macro() (--parsenleft >= 0? *parsenextc++ : preadbuffer())
|
||||
static int
|
||||
pgetc(void)
|
||||
|
@ -3497,7 +3457,7 @@ hashcmd(int argc, char **argv)
|
|||
int verbose;
|
||||
struct cmdentry entry;
|
||||
char *name;
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
const struct alias *ap;
|
||||
#endif
|
||||
|
||||
|
@ -3526,7 +3486,7 @@ hashcmd(int argc, char **argv)
|
|||
&& (cmdp->cmdtype == CMDNORMAL
|
||||
|| (cmdp->cmdtype == CMDBUILTIN && builtinloc >= 0)))
|
||||
delete_cmd_entry();
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
/* Then look at the aliases */
|
||||
if ((ap = *__lookupalias(name)) != NULL) {
|
||||
if (verbose=='v')
|
||||
|
@ -4075,7 +4035,7 @@ typecmd(int argc, char **argv)
|
|||
return err;
|
||||
}
|
||||
|
||||
#ifdef ASH_CMDCMD
|
||||
#ifdef CONFIG_ASH_CMDCMD
|
||||
static int
|
||||
commandcmd(int argc, char **argv)
|
||||
{
|
||||
|
@ -4479,7 +4439,7 @@ argstr(char *p, int flag)
|
|||
expbackq(argbackq->n, c & CTLQUOTE, flag);
|
||||
argbackq = argbackq->next;
|
||||
break;
|
||||
#ifdef ASH_MATH_SUPPORT
|
||||
#ifdef CONFIG_ASH_MATH_SUPPORT
|
||||
case CTLENDARI:
|
||||
expari(flag);
|
||||
break;
|
||||
|
@ -4592,7 +4552,7 @@ removerecordregions(int endoff)
|
|||
}
|
||||
|
||||
|
||||
#ifdef ASH_MATH_SUPPORT
|
||||
#ifdef CONFIG_ASH_MATH_SUPPORT
|
||||
/*
|
||||
* Expand arithmetic expression. Backup to start of expression,
|
||||
* evaluate, place result in (backed up) result, adjust string position.
|
||||
|
@ -5844,7 +5804,7 @@ static inline void putprompt(const char *s) {
|
|||
* Same as pgetc(), but ignores PEOA.
|
||||
*/
|
||||
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
static int
|
||||
pgetc2(void)
|
||||
{
|
||||
|
@ -5855,7 +5815,7 @@ pgetc2(void)
|
|||
return c;
|
||||
}
|
||||
#else
|
||||
static inline int pgetc2() { return pgetc_macro(); }
|
||||
static inline int pgetc2(void) { return pgetc_macro(); }
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -5925,7 +5885,7 @@ popstring(void)
|
|||
struct strpush *sp = parsefile->strpush;
|
||||
|
||||
INTOFF;
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
if (sp->ap) {
|
||||
if (parsenextc[-1] == ' ' || parsenextc[-1] == '\t') {
|
||||
if (!checkalias) {
|
||||
|
@ -5970,7 +5930,7 @@ preadbuffer(void)
|
|||
char savec;
|
||||
|
||||
while (parsefile->strpush) {
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
if (parsenleft == -1 && parsefile->strpush->ap &&
|
||||
parsenextc[-1] != ' ' && parsenextc[-1] != '\t') {
|
||||
return PEOA;
|
||||
|
@ -6050,7 +6010,7 @@ pushstring(char *s, int len, void *ap)
|
|||
sp = parsefile->strpush = &(parsefile->basestrpush);
|
||||
sp->prevstring = parsenextc;
|
||||
sp->prevnleft = parsenleft;
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
sp->ap = (struct alias *)ap;
|
||||
if (ap) {
|
||||
((struct alias *)ap)->flag |= ALIASINUSE;
|
||||
|
@ -6103,7 +6063,7 @@ pushfile(void)
|
|||
parsefile = pf;
|
||||
}
|
||||
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
static void restartjob (struct job *);
|
||||
#endif
|
||||
static void freejob (struct job *);
|
||||
|
@ -6128,7 +6088,7 @@ fd0_redirected_p (void)
|
|||
|
||||
static void dupredirect (const union node *, int, int fd1dup);
|
||||
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
/*
|
||||
* Turn job control on and off.
|
||||
*
|
||||
|
@ -6198,7 +6158,7 @@ static void setjobctl(int enable)
|
|||
#endif
|
||||
|
||||
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
static int
|
||||
killcmd(int argc, char **argv)
|
||||
{
|
||||
|
@ -6405,7 +6365,7 @@ showjobs(int change)
|
|||
snprintf(s, 64, "Exit %d",
|
||||
WEXITSTATUS(ps->status));
|
||||
} else {
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
if (WIFSTOPPED(ps->status))
|
||||
i = WSTOPSIG(ps->status);
|
||||
else /* WIFSIGNALED(ps->status) */
|
||||
|
@ -6453,7 +6413,7 @@ freejob(struct job *jp)
|
|||
if (jp->ps != &jp->ps0)
|
||||
ckfree(jp->ps);
|
||||
jp->used = 0;
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
if (curjob == jp - jobtab + 1)
|
||||
curjob = 0;
|
||||
#endif
|
||||
|
@ -6486,7 +6446,7 @@ start:
|
|||
}
|
||||
if (WIFEXITED(status))
|
||||
retval = WEXITSTATUS(status);
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
else if (WIFSTOPPED(status))
|
||||
retval = WSTOPSIG(status) + 128;
|
||||
#endif
|
||||
|
@ -6526,7 +6486,7 @@ getjob(const char *name)
|
|||
int i;
|
||||
|
||||
if (name == NULL) {
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
currentjob:
|
||||
if ((jobno = curjob) == 0 || jobtab[jobno - 1].used == 0)
|
||||
error("No current job");
|
||||
|
@ -6540,7 +6500,7 @@ currentjob:
|
|||
if (jobno > 0 && jobno <= njobs
|
||||
&& jobtab[jobno - 1].used != 0)
|
||||
return &jobtab[jobno - 1];
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
} else if (name[1] == '%' && name[2] == '\0') {
|
||||
goto currentjob;
|
||||
#endif
|
||||
|
@ -6608,7 +6568,7 @@ makejob(const union node *node, int nprocs)
|
|||
jp->used = 1;
|
||||
jp->changed = 0;
|
||||
jp->nprocs = 0;
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
jp->jobctl = jobctl;
|
||||
#endif
|
||||
if (nprocs > 1) {
|
||||
|
@ -6644,7 +6604,7 @@ static int
|
|||
forkshell(struct job *jp, const union node *n, int mode)
|
||||
{
|
||||
int pid;
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
int pgrp;
|
||||
#endif
|
||||
const char *devnull = _PATH_DEVNULL;
|
||||
|
@ -6674,7 +6634,7 @@ forkshell(struct job *jp, const union node *n, int mode)
|
|||
closescript();
|
||||
INTON;
|
||||
clear_traps();
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
jobctl = 0; /* do job control only in root shell */
|
||||
if (wasroot && mode != FORK_NOJOB && mflag) {
|
||||
if (jp == NULL || jp->nprocs == 0)
|
||||
|
@ -6717,7 +6677,7 @@ forkshell(struct job *jp, const union node *n, int mode)
|
|||
}
|
||||
return pid;
|
||||
}
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
if (rootshell && mode != FORK_NOJOB && mflag) {
|
||||
if (jp == NULL || jp->nprocs == 0)
|
||||
pgrp = pid;
|
||||
|
@ -6765,7 +6725,7 @@ forkshell(struct job *jp, const union node *n, int mode)
|
|||
static int
|
||||
waitforjob(struct job *jp)
|
||||
{
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
int mypgrp = getpgrp();
|
||||
#endif
|
||||
int status;
|
||||
|
@ -6774,7 +6734,7 @@ waitforjob(struct job *jp)
|
|||
|
||||
INTOFF;
|
||||
intreceived = 0;
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
if (!jobctl) {
|
||||
#else
|
||||
if (!iflag) {
|
||||
|
@ -6787,7 +6747,7 @@ waitforjob(struct job *jp)
|
|||
while (jp->state == 0) {
|
||||
dowait(1, jp);
|
||||
}
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
if (!jobctl) {
|
||||
#else
|
||||
if (!iflag) {
|
||||
|
@ -6795,7 +6755,7 @@ waitforjob(struct job *jp)
|
|||
sigaction(SIGINT, &oact, 0);
|
||||
if (intreceived && trap[SIGINT]) kill(getpid(), SIGINT);
|
||||
}
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
if (jp->jobctl) {
|
||||
#ifdef OLD_TTY_DRIVER
|
||||
if (ioctl(2, TIOCSPGRP, (char *)&mypgrp) < 0)
|
||||
|
@ -6805,20 +6765,20 @@ waitforjob(struct job *jp)
|
|||
error("tcsetpgrp failed, errno=%d\n", errno);
|
||||
#endif
|
||||
}
|
||||
if (jp->state == JOBSTOPPED)
|
||||
if (jp->state == CONFIG_ASH_JOB_CONTROLTOPPED)
|
||||
curjob = jp - jobtab + 1;
|
||||
#endif
|
||||
status = jp->ps[jp->nprocs - 1].status;
|
||||
/* convert to 8 bits */
|
||||
if (WIFEXITED(status))
|
||||
st = WEXITSTATUS(status);
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
else if (WIFSTOPPED(status))
|
||||
st = WSTOPSIG(status) + 128;
|
||||
#endif
|
||||
else
|
||||
st = WTERMSIG(status) + 128;
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
if (jp->jobctl) {
|
||||
/*
|
||||
* This is truly gross.
|
||||
|
@ -6875,7 +6835,7 @@ waitproc(int block, int *status)
|
|||
int flags;
|
||||
|
||||
flags = 0;
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
if (jobctl)
|
||||
flags |= WUNTRACED;
|
||||
#endif
|
||||
|
@ -6924,11 +6884,11 @@ dowait(int block, struct job *job)
|
|||
done = 0;
|
||||
}
|
||||
if (stopped) { /* stopped or done */
|
||||
int state = done? JOBDONE : JOBSTOPPED;
|
||||
int state = done? JOBDONE : CONFIG_ASH_JOB_CONTROLTOPPED;
|
||||
if (jp->state != state) {
|
||||
TRACE(("Job %d: changing state from %d to %d\n", jp - jobtab + 1, jp->state, state));
|
||||
jp->state = state;
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
if (done && curjob == jp - jobtab + 1)
|
||||
curjob = 0; /* no current job */
|
||||
#endif
|
||||
|
@ -6939,7 +6899,7 @@ dowait(int block, struct job *job)
|
|||
INTON;
|
||||
if (! rootshell || ! iflag || (job && thisjob == job)) {
|
||||
core = WCOREDUMP(status);
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
if (WIFSTOPPED(status)) sig = WSTOPSIG(status);
|
||||
else
|
||||
#endif
|
||||
|
@ -6949,7 +6909,7 @@ dowait(int block, struct job *job)
|
|||
if (sig != 0 && sig != SIGINT && sig != SIGPIPE) {
|
||||
if (thisjob != job)
|
||||
out2fmt("%d: ", pid);
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
if (sig == SIGTSTP && rootshell && iflag)
|
||||
out2fmt("%%%ld ",
|
||||
(long)(job - jobtab + 1));
|
||||
|
@ -6990,7 +6950,7 @@ stoppedjobs(void)
|
|||
for (jobno = 1, jp = jobtab; jobno <= njobs; jobno++, jp++) {
|
||||
if (jp->used == 0)
|
||||
continue;
|
||||
if (jp->state == JOBSTOPPED) {
|
||||
if (jp->state == CONFIG_ASH_JOB_CONTROLTOPPED) {
|
||||
out2str("You have stopped jobs.\n");
|
||||
job_warning = 2;
|
||||
return (1);
|
||||
|
@ -7408,7 +7368,7 @@ static void waitonint(int sig) {
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef ASH_MAIL
|
||||
#ifdef CONFIG_ASH_MAIL
|
||||
|
||||
/*
|
||||
* Routines to check for mail.
|
||||
|
@ -7469,7 +7429,7 @@ chkmail(int silent)
|
|||
popstackmark(&smark);
|
||||
}
|
||||
|
||||
#endif /* ASH_MAIL */
|
||||
#endif /* CONFIG_ASH_MAIL */
|
||||
|
||||
#define PROFILE 0
|
||||
|
||||
|
@ -7636,7 +7596,7 @@ cmdloop(int top)
|
|||
if (iflag && top) {
|
||||
inter++;
|
||||
showjobs(1);
|
||||
#ifdef ASH_MAIL
|
||||
#ifdef CONFIG_ASH_MAIL
|
||||
chkmail(0);
|
||||
#endif
|
||||
flushall();
|
||||
|
@ -8861,7 +8821,7 @@ nodexstrdup(const char *s)
|
|||
return rtn;
|
||||
}
|
||||
|
||||
#ifdef ASH_GETOPTS
|
||||
#ifdef CONFIG_ASH_GETOPTS
|
||||
static int getopts (char *, char *, char **, int *, int *);
|
||||
#endif
|
||||
|
||||
|
@ -9135,7 +9095,7 @@ static void change_lc_ctype(const char *value)
|
|||
|
||||
#endif
|
||||
|
||||
#ifdef ASH_GETOPTS
|
||||
#ifdef CONFIG_ASH_GETOPTS
|
||||
/*
|
||||
* The getopts builtin. Shellparam.optnext points to the next argument
|
||||
* to be processed. Shellparam.optptr points to the next character to
|
||||
|
@ -9997,7 +9957,7 @@ static int
|
|||
readtoken() {
|
||||
int t;
|
||||
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
int savecheckalias = checkalias;
|
||||
int savecheckkwd = checkkwd;
|
||||
struct alias *ap;
|
||||
|
@ -10007,13 +9967,13 @@ readtoken() {
|
|||
int alreadyseen = tokpushback;
|
||||
#endif
|
||||
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
top:
|
||||
#endif
|
||||
|
||||
t = xxreadtoken();
|
||||
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
checkalias = savecheckalias;
|
||||
#endif
|
||||
|
||||
|
@ -10051,7 +10011,7 @@ top:
|
|||
}
|
||||
} else if (checkalias == 2 && isassignment(wordtext)) {
|
||||
lasttoken = t = TASSIGN;
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
} else if (checkalias) {
|
||||
if (!quoteflag && (ap = *__lookupalias(wordtext)) != NULL && !(ap->flag & ALIASINUSE)) {
|
||||
if (*ap->val) {
|
||||
|
@ -10125,7 +10085,7 @@ xxreadtoken() {
|
|||
c = pgetc_macro();
|
||||
|
||||
if ((c!=' ') && (c!='\t')
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
&& (c!=PEOA)
|
||||
#endif
|
||||
) {
|
||||
|
@ -10191,7 +10151,7 @@ xxreadtoken() {
|
|||
c = pgetc_macro();
|
||||
switch (c) {
|
||||
case ' ': case '\t':
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
case PEOA:
|
||||
#endif
|
||||
continue;
|
||||
|
@ -10394,7 +10354,7 @@ readtoken1(int firstc, int syntax, const char *eofmark, int striptabs)
|
|||
USTPUTC(c, out);
|
||||
}
|
||||
break;
|
||||
#ifdef ASH_MATH_SUPPORT
|
||||
#ifdef CONFIG_ASH_MATH_SUPPORT
|
||||
case CLP: /* '(' in arithmetic */
|
||||
parenlevel++;
|
||||
USTPUTC(c, out);
|
||||
|
@ -10435,7 +10395,7 @@ readtoken1(int firstc, int syntax, const char *eofmark, int striptabs)
|
|||
default:
|
||||
if (varnest == 0)
|
||||
goto endword; /* exit outer loop */
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
if (c != PEOA)
|
||||
#endif
|
||||
USTPUTC(c, out);
|
||||
|
@ -10484,7 +10444,7 @@ endword:
|
|||
|
||||
checkend: {
|
||||
if (eofmark) {
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
if (c == PEOA) {
|
||||
c = pgetc2();
|
||||
}
|
||||
|
@ -10765,7 +10725,7 @@ parsebackq: {
|
|||
/* fall through */
|
||||
|
||||
case PEOF:
|
||||
#ifdef ASH_ALIAS
|
||||
#ifdef CONFIG_ASH_ALIAS
|
||||
case PEOA:
|
||||
#endif
|
||||
startlinno = plinno;
|
||||
|
@ -11768,7 +11728,7 @@ setsignal(int signo)
|
|||
if (iflag)
|
||||
action = S_IGN;
|
||||
break;
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
case SIGTSTP:
|
||||
case SIGTTOU:
|
||||
if (mflag)
|
||||
|
@ -11892,7 +11852,7 @@ exitshell(int status)
|
|||
}
|
||||
l1: handler = &loc2; /* probably unnecessary */
|
||||
flushall();
|
||||
#ifdef JOBS
|
||||
#ifdef CONFIG_ASH_JOB_CONTROL
|
||||
setjobctl(0);
|
||||
#endif
|
||||
l2: _exit(status);
|
||||
|
@ -12031,7 +11991,7 @@ setvareq(char *s, int flags)
|
|||
vp->flags |= flags;
|
||||
vp->text = s;
|
||||
|
||||
#ifdef ASH_MAIL
|
||||
#ifdef CONFIG_ASH_MAIL
|
||||
/*
|
||||
* We could roll this to a function, to handle it as
|
||||
* a regular variable function callback, but why bother?
|
||||
|
@ -12470,7 +12430,7 @@ findvar(struct var **vpp, const char *name)
|
|||
/*
|
||||
* Copyright (c) 1999 Herbert Xu <herbert@debian.org>
|
||||
* This file contains code for the times builtin.
|
||||
* $Id: ash.c,v 1.45 2001/12/31 06:16:54 aaronl Exp $
|
||||
* $Id: ash.c,v 1.46 2002/01/09 15:37:36 andersen Exp $
|
||||
*/
|
||||
static int timescmd (int argc, char **argv)
|
||||
{
|
||||
|
@ -12490,7 +12450,7 @@ static int timescmd (int argc, char **argv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef ASH_MATH_SUPPORT
|
||||
#ifdef CONFIG_ASH_MATH_SUPPORT
|
||||
/* The let builtin. */
|
||||
int letcmd(int argc, char **argv)
|
||||
{
|
||||
|
|
|
@ -30,10 +30,23 @@ if [ "$CONFIG_FEATURE_SH_IS_MSH" = "y" ] ; then
|
|||
fi
|
||||
|
||||
bool 'ash' CONFIG_ASH
|
||||
if [ "$CONFIG_ASH" = "y" ] ; then
|
||||
comment 'Ash Shell Options'
|
||||
bool 'Enable Job control' CONFIG_ASH_JOB_CONTROL
|
||||
bool 'Enable alias support' CONFIG_ASH_ALIAS
|
||||
bool 'Enable Posix math support' CONFIG_ASH_MATH_SUPPORT
|
||||
bool 'Enable getopt builtin to parse positional parameters' CONFIG_ASH_GETOPTS
|
||||
bool 'Enable cmdcmd to override shell builtins' CONFIG_ASH_CMDCMD
|
||||
bool 'Check for new mail on interactive shells' CONFIG_ASH_MAIL
|
||||
bool 'Optimize for size instead of speed' CONFIG_ASH_OPTIMIZE_FOR_SIZE
|
||||
comment ''
|
||||
fi
|
||||
|
||||
bool 'hush' CONFIG_HUSH
|
||||
bool 'lash' CONFIG_LASH
|
||||
bool 'msh' CONFIG_MSH
|
||||
|
||||
|
||||
comment 'Bourne Shell Options'
|
||||
bool 'command line editing' CONFIG_FEATURE_COMMAND_EDITING
|
||||
bool 'tab completion' CONFIG_FEATURE_COMMAND_TAB_COMPLETION
|
||||
|
|
Loading…
Reference in New Issue