Make private ash config options be public
This commit is contained in:
		
							
								
								
									
										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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user