summaryrefslogtreecommitdiffstats
path: root/bin/sh/jobs.c
diff options
context:
space:
mode:
authorstefanf <stefanf@FreeBSD.org>2006-10-07 16:51:16 +0000
committerstefanf <stefanf@FreeBSD.org>2006-10-07 16:51:16 +0000
commit7819e9ab69305b9516d6f50f05b04633464eebf2 (patch)
tree33f628da3a1045ce4d4696ace27d45c9bf566174 /bin/sh/jobs.c
parentd315543cc46a8d7ef4390e4a3ca07b7985bb705f (diff)
downloadFreeBSD-src-7819e9ab69305b9516d6f50f05b04633464eebf2.zip
FreeBSD-src-7819e9ab69305b9516d6f50f05b04633464eebf2.tar.gz
Add the POSIX option -p to the jobs builtin command. It prints the PID of the
process leader for each job. Now the last specified option for the output format (-l, -p or -s) wins, previously -s trumped -l. PR: 99926 Submitted by: Ed Schouten and novel (patches modified by me)
Diffstat (limited to 'bin/sh/jobs.c')
-rw-r--r--bin/sh/jobs.c40
1 files changed, 23 insertions, 17 deletions
diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c
index 7e1c2c5..be9acab 100644
--- a/bin/sh/jobs.c
+++ b/bin/sh/jobs.c
@@ -98,7 +98,7 @@ STATIC void setcurjob(struct job *);
STATIC void deljob(struct job *);
STATIC struct job *getcurjob(struct job *);
#endif
-STATIC void showjob(struct job *, pid_t, int, int);
+STATIC void showjob(struct job *, pid_t, int);
/*
@@ -265,18 +265,21 @@ int
jobscmd(int argc, char *argv[])
{
char *id;
- int ch, sformat, lformat;
+ int ch, mode;
optind = optreset = 1;
opterr = 0;
- sformat = lformat = 0;
- while ((ch = getopt(argc, argv, "ls")) != -1) {
+ mode = SHOWJOBS_DEFAULT;
+ while ((ch = getopt(argc, argv, "lps")) != -1) {
switch (ch) {
case 'l':
- lformat = 1;
+ mode = SHOWJOBS_VERBOSE;
+ break;
+ case 'p':
+ mode = SHOWJOBS_PGIDS;
break;
case 's':
- sformat = 1;
+ mode = SHOWJOBS_PIDS;
break;
case '?':
default:
@@ -287,24 +290,25 @@ jobscmd(int argc, char *argv[])
argv += optind;
if (argc == 0)
- showjobs(0, sformat, lformat);
+ showjobs(0, mode);
else
while ((id = *argv++) != NULL)
- showjob(getjob(id), 0, sformat, lformat);
+ showjob(getjob(id), 0, mode);
return (0);
}
STATIC void
-showjob(struct job *jp, pid_t pid, int sformat, int lformat)
+showjob(struct job *jp, pid_t pid, int mode)
{
char s[64];
struct procstat *ps;
struct job *j;
int col, curr, i, jobno, prev, procno;
+ pid_t ppid;
char c;
- procno = jp->nprocs;
+ procno = (mode == SHOWJOBS_PGIDS) ? 1 : jp->nprocs;
jobno = jp - jobtab + 1;
curr = prev = 0;
#if JOBS
@@ -315,11 +319,13 @@ showjob(struct job *jp, pid_t pid, int sformat, int lformat)
}
#endif
for (ps = jp->ps ; ; ps++) { /* for each process */
- if (sformat) {
- out1fmt("%d\n", (int)ps->pid);
+ if (mode == SHOWJOBS_PIDS || mode == SHOWJOBS_PGIDS) {
+ ppid = (mode == SHOWJOBS_PIDS) ? ps->pid :
+ getpgid(ps->pid);
+ out1fmt("%d\n", (int)ppid);
goto skip;
}
- if (!lformat && ps != jp->ps && pid == 0)
+ if (mode != SHOWJOBS_VERBOSE && ps != jp->ps && pid == 0)
goto skip;
if (pid != 0 && pid != ps->pid)
goto skip;
@@ -335,7 +341,7 @@ showjob(struct job *jp, pid_t pid, int sformat, int lformat)
fmtstr(s, 64, " %c ", c);
out1str(s);
col = strlen(s);
- if (lformat) {
+ if (mode == SHOWJOBS_VERBOSE) {
fmtstr(s, 64, "%d ", (int)ps->pid);
out1str(s);
col += strlen(s);
@@ -388,7 +394,7 @@ skip: if (--procno <= 0)
*/
void
-showjobs(int change, int sformat, int lformat)
+showjobs(int change, int mode)
{
int jobno;
struct job *jp;
@@ -404,7 +410,7 @@ showjobs(int change, int sformat, int lformat)
}
if (change && ! jp->changed)
continue;
- showjob(jp, 0, sformat, lformat);
+ showjob(jp, 0, mode);
jp->changed = 0;
if (jp->state == JOBDONE) {
freejob(jp);
@@ -992,7 +998,7 @@ dowait(int block, struct job *job)
out1str(" (core dumped)");
out1c('\n');
} else
- showjob(thisjob, pid, 0, 0);
+ showjob(thisjob, pid, SHOWJOBS_DEFAULT);
}
} else {
TRACE(("Not printing status, rootshell=%d, job=%p\n", rootshell, job));
OpenPOWER on IntegriCloud