ash: preparatory work for pipefail and code shrink. -44 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
7a7b034482
commit
285ad155c4
129
shell/ash.c
129
shell/ash.c
@ -100,15 +100,15 @@ static const char *const optletters_optnames[] = {
|
||||
"a" "allexport",
|
||||
"b" "notify",
|
||||
"u" "nounset",
|
||||
"\0" "vi"
|
||||
"\0" "vi",
|
||||
#if DEBUG
|
||||
,"\0" "nolog"
|
||||
,"\0" "debug"
|
||||
#endif
|
||||
};
|
||||
|
||||
#define optletters(n) optletters_optnames[(n)][0]
|
||||
#define optnames(n) (&optletters_optnames[(n)][1])
|
||||
#define optletters(n) optletters_optnames[n][0]
|
||||
#define optnames(n) (optletters_optnames[n] + 1)
|
||||
|
||||
enum { NOPTS = ARRAY_SIZE(optletters_optnames) };
|
||||
|
||||
@ -3194,8 +3194,8 @@ unaliascmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
|
||||
/* ============ jobs.c */
|
||||
|
||||
/* Mode argument to forkshell. Don't change FORK_FG or FORK_BG. */
|
||||
#define FORK_FG 0
|
||||
#define FORK_BG 1
|
||||
#define FORK_FG 0
|
||||
#define FORK_BG 1
|
||||
#define FORK_NOJOB 2
|
||||
|
||||
/* mode flags for showjob(s) */
|
||||
@ -3210,9 +3210,9 @@ unaliascmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
|
||||
* array of pids.
|
||||
*/
|
||||
struct procstat {
|
||||
pid_t pid; /* process id */
|
||||
int status; /* last process status from wait() */
|
||||
char *cmd; /* text of command being run */
|
||||
pid_t ps_pid; /* process id */
|
||||
int ps_status; /* last process status from wait() */
|
||||
char *ps_cmd; /* text of command being run */
|
||||
};
|
||||
|
||||
struct job {
|
||||
@ -3518,7 +3518,7 @@ getjob(const char *name, int getctl)
|
||||
|
||||
found = NULL;
|
||||
while (jp) {
|
||||
if (match(jp->ps[0].cmd, p)) {
|
||||
if (match(jp->ps[0].ps_cmd, p)) {
|
||||
if (found)
|
||||
goto err;
|
||||
found = jp;
|
||||
@ -3552,8 +3552,8 @@ freejob(struct job *jp)
|
||||
|
||||
INT_OFF;
|
||||
for (i = jp->nprocs, ps = jp->ps; --i >= 0; ps++) {
|
||||
if (ps->cmd != nullstr)
|
||||
free(ps->cmd);
|
||||
if (ps->ps_cmd != nullstr)
|
||||
free(ps->ps_cmd);
|
||||
}
|
||||
if (jp->ps != &jp->ps0)
|
||||
free(jp->ps);
|
||||
@ -3655,7 +3655,7 @@ killcmd(int argc, char **argv)
|
||||
do {
|
||||
if (argv[i][0] == '%') {
|
||||
struct job *jp = getjob(argv[i], 0);
|
||||
unsigned pid = jp->ps[0].pid;
|
||||
unsigned pid = jp->ps[0].ps_pid;
|
||||
/* Enough space for ' -NNN<nul>' */
|
||||
argv[i] = alloca(sizeof(int)*3 + 3);
|
||||
/* kill_main has matching code to expect
|
||||
@ -3669,15 +3669,15 @@ killcmd(int argc, char **argv)
|
||||
}
|
||||
|
||||
static void
|
||||
showpipe(struct job *jp, FILE *out)
|
||||
showpipe(struct job *jp /*, FILE *out*/)
|
||||
{
|
||||
struct procstat *sp;
|
||||
struct procstat *spend;
|
||||
struct procstat *ps;
|
||||
struct procstat *psend;
|
||||
|
||||
spend = jp->ps + jp->nprocs;
|
||||
for (sp = jp->ps + 1; sp < spend; sp++)
|
||||
fprintf(out, " | %s", sp->cmd);
|
||||
outcslow('\n', out);
|
||||
psend = jp->ps + jp->nprocs;
|
||||
for (ps = jp->ps + 1; ps < psend; ps++)
|
||||
printf(" | %s", ps->ps_cmd);
|
||||
outcslow('\n', stdout);
|
||||
flush_stdout_stderr();
|
||||
}
|
||||
|
||||
@ -3694,15 +3694,15 @@ restartjob(struct job *jp, int mode)
|
||||
if (jp->state == JOBDONE)
|
||||
goto out;
|
||||
jp->state = JOBRUNNING;
|
||||
pgid = jp->ps->pid;
|
||||
pgid = jp->ps[0].ps_pid;
|
||||
if (mode == FORK_FG)
|
||||
xtcsetpgrp(ttyfd, pgid);
|
||||
killpg(pgid, SIGCONT);
|
||||
ps = jp->ps;
|
||||
i = jp->nprocs;
|
||||
do {
|
||||
if (WIFSTOPPED(ps->status)) {
|
||||
ps->status = -1;
|
||||
if (WIFSTOPPED(ps->ps_status)) {
|
||||
ps->ps_status = -1;
|
||||
}
|
||||
ps++;
|
||||
} while (--i);
|
||||
@ -3716,22 +3716,20 @@ static int FAST_FUNC
|
||||
fg_bgcmd(int argc UNUSED_PARAM, char **argv)
|
||||
{
|
||||
struct job *jp;
|
||||
FILE *out;
|
||||
int mode;
|
||||
int retval;
|
||||
|
||||
mode = (**argv == 'f') ? FORK_FG : FORK_BG;
|
||||
nextopt(nullstr);
|
||||
argv = argptr;
|
||||
out = stdout;
|
||||
do {
|
||||
jp = getjob(*argv, 1);
|
||||
if (mode == FORK_BG) {
|
||||
set_curjob(jp, CUR_RUNNING);
|
||||
fprintf(out, "[%d] ", jobno(jp));
|
||||
printf("[%d] ", jobno(jp));
|
||||
}
|
||||
outstr(jp->ps->cmd, out);
|
||||
showpipe(jp, out);
|
||||
out1str(jp->ps[0].ps_cmd);
|
||||
showpipe(jp /*, stdout*/);
|
||||
retval = restartjob(jp, mode);
|
||||
} while (*argv && *++argv);
|
||||
return retval;
|
||||
@ -3790,8 +3788,9 @@ dowait(int wait_flags, struct job *job)
|
||||
/* Do a wait system call. If job control is compiled in, we accept
|
||||
* stopped processes. wait_flags may have WNOHANG, preventing blocking.
|
||||
* NB: _not_ safe_waitpid, we need to detect EINTR */
|
||||
pid = waitpid(-1, &status,
|
||||
(doing_jobctl ? (wait_flags | WUNTRACED) : wait_flags));
|
||||
if (doing_jobctl)
|
||||
wait_flags |= WUNTRACED;
|
||||
pid = waitpid(-1, &status, wait_flags);
|
||||
TRACE(("wait returns pid=%d, status=0x%x, errno=%d(%s)\n",
|
||||
pid, status, errno, strerror(errno)));
|
||||
if (pid <= 0)
|
||||
@ -3800,32 +3799,32 @@ dowait(int wait_flags, struct job *job)
|
||||
INT_OFF;
|
||||
thisjob = NULL;
|
||||
for (jp = curjob; jp; jp = jp->prev_job) {
|
||||
struct procstat *sp;
|
||||
struct procstat *spend;
|
||||
struct procstat *ps;
|
||||
struct procstat *psend;
|
||||
if (jp->state == JOBDONE)
|
||||
continue;
|
||||
state = JOBDONE;
|
||||
spend = jp->ps + jp->nprocs;
|
||||
sp = jp->ps;
|
||||
ps = jp->ps;
|
||||
psend = ps + jp->nprocs;
|
||||
do {
|
||||
if (sp->pid == pid) {
|
||||
if (ps->ps_pid == pid) {
|
||||
TRACE(("Job %d: changing status of proc %d "
|
||||
"from 0x%x to 0x%x\n",
|
||||
jobno(jp), pid, sp->status, status));
|
||||
sp->status = status;
|
||||
jobno(jp), pid, ps->ps_status, status));
|
||||
ps->ps_status = status;
|
||||
thisjob = jp;
|
||||
}
|
||||
if (sp->status == -1)
|
||||
if (ps->ps_status == -1)
|
||||
state = JOBRUNNING;
|
||||
#if JOBS
|
||||
if (state == JOBRUNNING)
|
||||
continue;
|
||||
if (WIFSTOPPED(sp->status)) {
|
||||
jp->stopstatus = sp->status;
|
||||
if (WIFSTOPPED(ps->ps_status)) {
|
||||
jp->stopstatus = ps->ps_status;
|
||||
state = JOBSTOPPED;
|
||||
}
|
||||
#endif
|
||||
} while (++sp < spend);
|
||||
} while (++ps < psend);
|
||||
if (thisjob)
|
||||
goto gotjob;
|
||||
}
|
||||
@ -3891,7 +3890,7 @@ showjob(FILE *out, struct job *jp, int mode)
|
||||
|
||||
if (mode & SHOW_ONLY_PGID) { /* jobs -p */
|
||||
/* just output process (group) id of pipeline */
|
||||
fprintf(out, "%d\n", ps->pid);
|
||||
fprintf(out, "%d\n", ps->ps_pid);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -3904,7 +3903,7 @@ showjob(FILE *out, struct job *jp, int mode)
|
||||
s[col - 3] = '-';
|
||||
|
||||
if (mode & SHOW_PIDS)
|
||||
col += fmtstr(s + col, 16, "%d ", ps->pid);
|
||||
col += fmtstr(s + col, 16, "%d ", ps->ps_pid);
|
||||
|
||||
psend = ps + jp->nprocs;
|
||||
|
||||
@ -3912,7 +3911,7 @@ showjob(FILE *out, struct job *jp, int mode)
|
||||
strcpy(s + col, "Running");
|
||||
col += sizeof("Running") - 1;
|
||||
} else {
|
||||
int status = psend[-1].status;
|
||||
int status = psend[-1].ps_status;
|
||||
if (jp->state == JOBSTOPPED)
|
||||
status = jp->stopstatus;
|
||||
col += sprint_status(s + col, status, 0);
|
||||
@ -3928,20 +3927,20 @@ showjob(FILE *out, struct job *jp, int mode)
|
||||
* making it impossible to know 1st process status.
|
||||
*/
|
||||
goto start;
|
||||
while (1) {
|
||||
do {
|
||||
/* for each process */
|
||||
s[0] = '\0';
|
||||
col = 33;
|
||||
if (mode & SHOW_PIDS)
|
||||
col = fmtstr(s, 48, "\n%*c%d ", indent_col, ' ', ps->pid) - 1;
|
||||
col = fmtstr(s, 48, "\n%*c%d ", indent_col, ' ', ps->ps_pid) - 1;
|
||||
start:
|
||||
fprintf(out, "%s%*c", s, 33 - col >= 0 ? 33 - col : 0, ' ');
|
||||
if (ps != jp->ps)
|
||||
fprintf(out, "| ");
|
||||
fprintf(out, "%s", ps->cmd);
|
||||
if (++ps == psend)
|
||||
break;
|
||||
}
|
||||
fprintf(out, "%s%*c%s%s",
|
||||
s,
|
||||
33 - col >= 0 ? 33 - col : 0, ' ',
|
||||
ps == jp->ps ? "" : "| ",
|
||||
ps->ps_cmd
|
||||
);
|
||||
} while (++ps != psend);
|
||||
outcslow('\n', out);
|
||||
|
||||
jp->changed = 0;
|
||||
@ -3992,8 +3991,9 @@ jobscmd(int argc UNUSED_PARAM, char **argv)
|
||||
do
|
||||
showjob(stdout, getjob(*argv, 0), mode);
|
||||
while (*++argv);
|
||||
} else
|
||||
} else {
|
||||
showjobs(stdout, mode);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -4005,7 +4005,7 @@ getstatus(struct job *job)
|
||||
int status;
|
||||
int retval;
|
||||
|
||||
status = job->ps[job->nprocs - 1].status;
|
||||
status = job->ps[job->nprocs - 1].ps_status;
|
||||
retval = WEXITSTATUS(status);
|
||||
if (!WIFEXITED(status)) {
|
||||
#if JOBS
|
||||
@ -4072,7 +4072,7 @@ waitcmd(int argc UNUSED_PARAM, char **argv)
|
||||
while (1) {
|
||||
if (!job)
|
||||
goto repeat;
|
||||
if (job->ps[job->nprocs - 1].pid == pid)
|
||||
if (job->ps[job->nprocs - 1].ps_pid == pid)
|
||||
break;
|
||||
job = job->prev_job;
|
||||
}
|
||||
@ -4576,7 +4576,7 @@ forkchild(struct job *jp, union node *n, int mode)
|
||||
if (jp->nprocs == 0)
|
||||
pgrp = getpid();
|
||||
else
|
||||
pgrp = jp->ps[0].pid;
|
||||
pgrp = jp->ps[0].ps_pid;
|
||||
/* this can fail because we are doing it in the parent also */
|
||||
setpgid(0, pgrp);
|
||||
if (mode == FORK_FG)
|
||||
@ -4648,7 +4648,7 @@ forkparent(struct job *jp, union node *n, int mode, pid_t pid)
|
||||
if (jp->nprocs == 0)
|
||||
pgrp = pid;
|
||||
else
|
||||
pgrp = jp->ps[0].pid;
|
||||
pgrp = jp->ps[0].ps_pid;
|
||||
/* This can fail because we are doing it in the child also */
|
||||
setpgid(pid, pgrp);
|
||||
}
|
||||
@ -4659,12 +4659,12 @@ forkparent(struct job *jp, union node *n, int mode, pid_t pid)
|
||||
}
|
||||
if (jp) {
|
||||
struct procstat *ps = &jp->ps[jp->nprocs++];
|
||||
ps->pid = pid;
|
||||
ps->status = -1;
|
||||
ps->cmd = nullstr;
|
||||
ps->ps_pid = pid;
|
||||
ps->ps_status = -1;
|
||||
ps->ps_cmd = nullstr;
|
||||
#if JOBS
|
||||
if (doing_jobctl && n)
|
||||
ps->cmd = commandtext(n);
|
||||
ps->ps_cmd = commandtext(n);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@ -7683,7 +7683,7 @@ describe_command(char *command, int describe_command_verbose)
|
||||
return 127;
|
||||
}
|
||||
out:
|
||||
outstr("\n", stdout);
|
||||
out1str("\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -11852,8 +11852,9 @@ evalcmd(int argc UNUSED_PARAM, char **argv)
|
||||
}
|
||||
|
||||
/*
|
||||
* Read and execute commands. "Top" is nonzero for the top level command
|
||||
* loop; it turns on prompting if the shell is interactive.
|
||||
* Read and execute commands.
|
||||
* "Top" is nonzero for the top level command loop;
|
||||
* it turns on prompting if the shell is interactive.
|
||||
*/
|
||||
static int
|
||||
cmdloop(int top)
|
||||
|
Loading…
Reference in New Issue
Block a user