Add the POSIX option -p to the jobs builtin command. It prints the PID of the
authorPeter Avalos <pavalos@dragonflybsd.org>
Sat, 13 Jan 2007 20:33:47 +0000 (20:33 +0000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Sat, 13 Jan 2007 20:33:47 +0000 (20:33 +0000)
process leader for each job.  Now the last specified option for the output
format (-l, -p or -s) wins, previously -s trumped -l.

Obtained-from:  FreeBSD

bin/sh/jobs.c
bin/sh/jobs.h
bin/sh/main.c
bin/sh/sh.1

index 1d61b7d..a70805f 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#)jobs.c  8.5 (Berkeley) 5/4/95
  * $FreeBSD: src/bin/sh/jobs.c,v 1.27.2.10 2003/04/04 08:16:26 tjr Exp $
- * $DragonFly: src/bin/sh/jobs.c,v 1.7 2005/01/13 23:20:07 dillon Exp $
+ * $DragonFly: src/bin/sh/jobs.c,v 1.8 2007/01/13 20:33:47 pavalos Exp $
  */
 
 #include <fcntl.h>
@@ -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);
@@ -994,7 +1000,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=0x%x\n", rootshell, job));
index 098b5b9..fd45933 100644 (file)
@@ -34,8 +34,8 @@
  * SUCH DAMAGE.
  *
  *     @(#)jobs.h      8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/jobs.h,v 1.12.2.2 2002/08/27 01:36:28 tjr Exp $
- * $DragonFly: src/bin/sh/jobs.h,v 1.2 2003/06/17 04:22:50 dillon Exp $
+ * $FreeBSD: src/bin/sh/jobs.h,v 1.19 2006/10/07 16:51:16 stefanf Exp $
+ * $DragonFly: src/bin/sh/jobs.h,v 1.3 2007/01/13 20:33:47 pavalos Exp $
  */
 
 /* Mode argument to forkshell.  Don't change FORK_FG or FORK_BG. */
@@ -79,6 +79,13 @@ struct job {
 #endif
 };
 
+enum {
+       SHOWJOBS_DEFAULT,       /* job number, status, command */
+       SHOWJOBS_VERBOSE,       /* job number, PID, status, command */
+       SHOWJOBS_PIDS,          /* PID only */
+       SHOWJOBS_PGIDS          /* PID of the group leader only */
+};
+
 extern pid_t backgndpid;       /* pid of last background process */
 extern int job_warning;                /* user was warned about stopped jobs */
 extern int in_waitcmd;         /* are we in waitcmd()? */
@@ -89,7 +96,7 @@ void setjobctl(int);
 int fgcmd(int, char **);
 int bgcmd(int, char **);
 int jobscmd(int, char **);
-void showjobs(int, int, int);
+void showjobs(int, int);
 int waitcmd(int, char **);
 int jobidcmd(int, char **);
 struct job *makejob(union node *, int);
index 5a8006d..5032cd1 100644 (file)
@@ -36,7 +36,7 @@
  * @(#) Copyright (c) 1991, 1993 The Regents of the University of California.  All rights reserved.
  * @(#)main.c  8.6 (Berkeley) 5/28/95
  * $FreeBSD: src/bin/sh/main.c,v 1.18.2.3 2002/07/19 04:38:51 tjr Exp $
- * $DragonFly: src/bin/sh/main.c,v 1.6 2006/09/28 22:29:44 pavalos Exp $
+ * $DragonFly: src/bin/sh/main.c,v 1.7 2007/01/13 20:33:47 pavalos Exp $
  */
 
 #include <stdio.h>
@@ -218,7 +218,7 @@ cmdloop(int top)
                inter = 0;
                if (iflag && top) {
                        inter++;
-                       showjobs(1, 0, 0);
+                       showjobs(1, SHOWJOBS_DEFAULT);
                        chkmail(0);
                        flushout(&output);
                }
index 1e68e16..6449bfd 100644 (file)
@@ -34,7 +34,7 @@
 .\"
 .\"    from: @(#)sh.1  8.6 (Berkeley) 5/4/95
 .\" $FreeBSD: src/bin/sh/sh.1,v 1.39.2.25 2003/02/13 19:28:08 fanf Exp $
-.\" $DragonFly: src/bin/sh/sh.1,v 1.6 2007/01/07 01:14:53 pavalos Exp $
+.\" $DragonFly: src/bin/sh/sh.1,v 1.7 2007/01/13 20:33:47 pavalos Exp $
 .\"
 .Dd December 4, 2005
 .Dt SH 1
@@ -1628,7 +1628,7 @@ Print the process id's of the processes in the specified
 If the
 .Ar job
 argument is omitted, use the current job.
-.It Ic jobs Oo Fl ls Oc Op Ar job ...
+.It Ic jobs Oo Fl lps Oc Op Ar job ...
 Print information about the specified jobs, or all jobs if no
 .Ar job
 argument is given.
@@ -1638,8 +1638,13 @@ If the
 .Fl l
 option is specified, the PID of each job is also printed.
 If the
+.Fl p
+option is specified, only the process IDs for the process group leaders
+are printed, one per line.
+If the
 .Fl s
-option is specified, only the PIDs of the jobs are printed, one per line.
+option is specified, only the PIDs of the job commands are printed, one per
+line.
 .It Ic pwd Op Fl LP
 Print the path of the current directory.  The built-in command may
 differ from the program of the same name because the