mirror of
https://github.com/sheumann/hush.git
synced 2024-09-12 00:55:11 +00:00
ash: cleanup part 2.2
This commit is contained in:
parent
5651bfc204
commit
fc06f2968b
294
shell/ash.c
294
shell/ash.c
@ -2983,6 +2983,7 @@ static int shiftcmd(int, char **);
|
|||||||
static int setcmd(int, char **);
|
static int setcmd(int, char **);
|
||||||
static int nextopt(const char *);
|
static int nextopt(const char *);
|
||||||
|
|
||||||
|
|
||||||
/* redir.h */
|
/* redir.h */
|
||||||
|
|
||||||
/* flags passed to redirect */
|
/* flags passed to redirect */
|
||||||
@ -2995,13 +2996,6 @@ static void clearredir(int);
|
|||||||
static int copyfd(int, int);
|
static int copyfd(int, int);
|
||||||
static int redirectsafe(union node *, int);
|
static int redirectsafe(union node *, int);
|
||||||
|
|
||||||
/* trap.h */
|
|
||||||
|
|
||||||
static void clear_traps(void);
|
|
||||||
static void setsignal(int);
|
|
||||||
static int dotrap(void);
|
|
||||||
|
|
||||||
|
|
||||||
static int is_safe_applet(char *name)
|
static int is_safe_applet(char *name)
|
||||||
{
|
{
|
||||||
/* It isn't a bug to have non-existent applet here... */
|
/* It isn't a bug to have non-existent applet here... */
|
||||||
@ -3038,6 +3032,7 @@ static int is_safe_applet(char *name)
|
|||||||
|
|
||||||
|
|
||||||
/* ============ Alias handling */
|
/* ============ Alias handling */
|
||||||
|
|
||||||
#if ENABLE_ASH_ALIAS
|
#if ENABLE_ASH_ALIAS
|
||||||
|
|
||||||
#define ALIASINUSE 1
|
#define ALIASINUSE 1
|
||||||
@ -3232,6 +3227,7 @@ unaliascmd(int argc, char **argv)
|
|||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* ASH_ALIAS */
|
#endif /* ASH_ALIAS */
|
||||||
|
|
||||||
|
|
||||||
@ -5653,6 +5649,43 @@ static int evalskip; /* set if we are skipping commands */
|
|||||||
static int skipcount; /* number of levels to skip */
|
static int skipcount; /* number of levels to skip */
|
||||||
static int funcnest; /* depth of function calls */
|
static int funcnest; /* depth of function calls */
|
||||||
|
|
||||||
|
/* forward decl way out to parsing code - dotrap needs it */
|
||||||
|
static int evalstring(char *s, int mask);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called to execute a trap. Perhaps we should avoid entering new trap
|
||||||
|
* handlers while we are executing a trap handler.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
dotrap(void)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
char *q;
|
||||||
|
int i;
|
||||||
|
int savestatus;
|
||||||
|
int skip = 0;
|
||||||
|
|
||||||
|
savestatus = exitstatus;
|
||||||
|
pendingsigs = 0;
|
||||||
|
xbarrier();
|
||||||
|
|
||||||
|
for (i = 0, q = gotsig; i < NSIG - 1; i++, q++) {
|
||||||
|
if (!*q)
|
||||||
|
continue;
|
||||||
|
*q = '\0';
|
||||||
|
|
||||||
|
p = trap[i + 1];
|
||||||
|
if (!p)
|
||||||
|
continue;
|
||||||
|
skip = evalstring(p, SKIPEVAL);
|
||||||
|
exitstatus = savestatus;
|
||||||
|
if (skip)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return skip;
|
||||||
|
}
|
||||||
|
|
||||||
/* forward declarations - evaluation is fairly recursive business... */
|
/* forward declarations - evaluation is fairly recursive business... */
|
||||||
static void evalloop(union node *, int);
|
static void evalloop(union node *, int);
|
||||||
static void evalfor(union node *, int);
|
static void evalfor(union node *, int);
|
||||||
@ -7319,6 +7352,93 @@ setinputstring(char *string)
|
|||||||
|
|
||||||
/* ============ jobs.c */
|
/* ============ jobs.c */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the signal handler for the specified signal. The routine figures
|
||||||
|
* out what it should be set to.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
setsignal(int signo)
|
||||||
|
{
|
||||||
|
int action;
|
||||||
|
char *t, tsig;
|
||||||
|
struct sigaction act;
|
||||||
|
|
||||||
|
t = trap[signo];
|
||||||
|
if (t == NULL)
|
||||||
|
action = S_DFL;
|
||||||
|
else if (*t != '\0')
|
||||||
|
action = S_CATCH;
|
||||||
|
else
|
||||||
|
action = S_IGN;
|
||||||
|
if (rootshell && action == S_DFL) {
|
||||||
|
switch (signo) {
|
||||||
|
case SIGINT:
|
||||||
|
if (iflag || minusc || sflag == 0)
|
||||||
|
action = S_CATCH;
|
||||||
|
break;
|
||||||
|
case SIGQUIT:
|
||||||
|
#if DEBUG
|
||||||
|
if (debug)
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
case SIGTERM:
|
||||||
|
if (iflag)
|
||||||
|
action = S_IGN;
|
||||||
|
break;
|
||||||
|
#if JOBS
|
||||||
|
case SIGTSTP:
|
||||||
|
case SIGTTOU:
|
||||||
|
if (mflag)
|
||||||
|
action = S_IGN;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t = &sigmode[signo - 1];
|
||||||
|
tsig = *t;
|
||||||
|
if (tsig == 0) {
|
||||||
|
/*
|
||||||
|
* current setting unknown
|
||||||
|
*/
|
||||||
|
if (sigaction(signo, 0, &act) == -1) {
|
||||||
|
/*
|
||||||
|
* Pretend it worked; maybe we should give a warning
|
||||||
|
* here, but other shells don't. We don't alter
|
||||||
|
* sigmode, so that we retry every time.
|
||||||
|
*/
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (act.sa_handler == SIG_IGN) {
|
||||||
|
if (mflag
|
||||||
|
&& (signo == SIGTSTP || signo == SIGTTIN || signo == SIGTTOU)
|
||||||
|
) {
|
||||||
|
tsig = S_IGN; /* don't hard ignore these */
|
||||||
|
} else
|
||||||
|
tsig = S_HARD_IGN;
|
||||||
|
} else {
|
||||||
|
tsig = S_RESET; /* force to be set */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (tsig == S_HARD_IGN || tsig == action)
|
||||||
|
return;
|
||||||
|
switch (action) {
|
||||||
|
case S_CATCH:
|
||||||
|
act.sa_handler = onsig;
|
||||||
|
break;
|
||||||
|
case S_IGN:
|
||||||
|
act.sa_handler = SIG_IGN;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
act.sa_handler = SIG_DFL;
|
||||||
|
}
|
||||||
|
*t = action;
|
||||||
|
act.sa_flags = 0;
|
||||||
|
sigfillset(&act.sa_mask);
|
||||||
|
sigaction(signo, &act, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/* mode flags for set_curjob */
|
/* mode flags for set_curjob */
|
||||||
#define CUR_DELETE 2
|
#define CUR_DELETE 2
|
||||||
#define CUR_RUNNING 1
|
#define CUR_RUNNING 1
|
||||||
@ -8497,6 +8617,25 @@ commandtext(union node *n)
|
|||||||
*
|
*
|
||||||
* Called with interrupts off.
|
* Called with interrupts off.
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
|
* Clear traps on a fork.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
clear_traps(void)
|
||||||
|
{
|
||||||
|
char **tp;
|
||||||
|
|
||||||
|
for (tp = trap; tp < &trap[NSIG]; tp++) {
|
||||||
|
if (*tp && **tp) { /* trap not NULL or SIG_IGN */
|
||||||
|
INT_OFF;
|
||||||
|
free(*tp);
|
||||||
|
*tp = NULL;
|
||||||
|
if (tp != &trap[0])
|
||||||
|
setsignal(tp - trap);
|
||||||
|
INT_ON;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
static void
|
static void
|
||||||
forkchild(struct job *jp, union node *n, int mode)
|
forkchild(struct job *jp, union node *n, int mode)
|
||||||
{
|
{
|
||||||
@ -11264,147 +11403,6 @@ trapcmd(int argc, char **argv)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Clear traps on a fork.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
clear_traps(void)
|
|
||||||
{
|
|
||||||
char **tp;
|
|
||||||
|
|
||||||
for (tp = trap; tp < &trap[NSIG]; tp++) {
|
|
||||||
if (*tp && **tp) { /* trap not NULL or SIG_IGN */
|
|
||||||
INT_OFF;
|
|
||||||
free(*tp);
|
|
||||||
*tp = NULL;
|
|
||||||
if (tp != &trap[0])
|
|
||||||
setsignal(tp - trap);
|
|
||||||
INT_ON;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the signal handler for the specified signal. The routine figures
|
|
||||||
* out what it should be set to.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setsignal(int signo)
|
|
||||||
{
|
|
||||||
int action;
|
|
||||||
char *t, tsig;
|
|
||||||
struct sigaction act;
|
|
||||||
|
|
||||||
t = trap[signo];
|
|
||||||
if (t == NULL)
|
|
||||||
action = S_DFL;
|
|
||||||
else if (*t != '\0')
|
|
||||||
action = S_CATCH;
|
|
||||||
else
|
|
||||||
action = S_IGN;
|
|
||||||
if (rootshell && action == S_DFL) {
|
|
||||||
switch (signo) {
|
|
||||||
case SIGINT:
|
|
||||||
if (iflag || minusc || sflag == 0)
|
|
||||||
action = S_CATCH;
|
|
||||||
break;
|
|
||||||
case SIGQUIT:
|
|
||||||
#if DEBUG
|
|
||||||
if (debug)
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
/* FALLTHROUGH */
|
|
||||||
case SIGTERM:
|
|
||||||
if (iflag)
|
|
||||||
action = S_IGN;
|
|
||||||
break;
|
|
||||||
#if JOBS
|
|
||||||
case SIGTSTP:
|
|
||||||
case SIGTTOU:
|
|
||||||
if (mflag)
|
|
||||||
action = S_IGN;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
t = &sigmode[signo - 1];
|
|
||||||
tsig = *t;
|
|
||||||
if (tsig == 0) {
|
|
||||||
/*
|
|
||||||
* current setting unknown
|
|
||||||
*/
|
|
||||||
if (sigaction(signo, 0, &act) == -1) {
|
|
||||||
/*
|
|
||||||
* Pretend it worked; maybe we should give a warning
|
|
||||||
* here, but other shells don't. We don't alter
|
|
||||||
* sigmode, so that we retry every time.
|
|
||||||
*/
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (act.sa_handler == SIG_IGN) {
|
|
||||||
if (mflag
|
|
||||||
&& (signo == SIGTSTP || signo == SIGTTIN || signo == SIGTTOU)
|
|
||||||
) {
|
|
||||||
tsig = S_IGN; /* don't hard ignore these */
|
|
||||||
} else
|
|
||||||
tsig = S_HARD_IGN;
|
|
||||||
} else {
|
|
||||||
tsig = S_RESET; /* force to be set */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tsig == S_HARD_IGN || tsig == action)
|
|
||||||
return;
|
|
||||||
switch (action) {
|
|
||||||
case S_CATCH:
|
|
||||||
act.sa_handler = onsig;
|
|
||||||
break;
|
|
||||||
case S_IGN:
|
|
||||||
act.sa_handler = SIG_IGN;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
act.sa_handler = SIG_DFL;
|
|
||||||
}
|
|
||||||
*t = action;
|
|
||||||
act.sa_flags = 0;
|
|
||||||
sigfillset(&act.sa_mask);
|
|
||||||
sigaction(signo, &act, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Called to execute a trap. Perhaps we should avoid entering new trap
|
|
||||||
* handlers while we are executing a trap handler.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
dotrap(void)
|
|
||||||
{
|
|
||||||
char *p;
|
|
||||||
char *q;
|
|
||||||
int i;
|
|
||||||
int savestatus;
|
|
||||||
int skip = 0;
|
|
||||||
|
|
||||||
savestatus = exitstatus;
|
|
||||||
pendingsigs = 0;
|
|
||||||
xbarrier();
|
|
||||||
|
|
||||||
for (i = 0, q = gotsig; i < NSIG - 1; i++, q++) {
|
|
||||||
if (!*q)
|
|
||||||
continue;
|
|
||||||
*q = '\0';
|
|
||||||
|
|
||||||
p = trap[i + 1];
|
|
||||||
if (!p)
|
|
||||||
continue;
|
|
||||||
skip = evalstring(p, SKIPEVAL);
|
|
||||||
exitstatus = savestatus;
|
|
||||||
if (skip)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return skip;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* ============ Builtins */
|
/* ============ Builtins */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user