Author: pjd
Date: Sun Jan 26 11:02:51 2020
New Revision: 357141
URL: https://svnweb.freebsd.org/changeset/base/357141

Log:
  Implement -o flag which tells pwait(1) to exit if any of the given processes
  has terminated.
  
  Sponsored by: Fudo Security

Modified:
  head/bin/pwait/pwait.1
  head/bin/pwait/pwait.c

Modified: head/bin/pwait/pwait.1
==============================================================================
--- head/bin/pwait/pwait.1      Sun Jan 26 10:54:16 2020        (r357140)
+++ head/bin/pwait/pwait.1      Sun Jan 26 11:02:51 2020        (r357141)
@@ -32,7 +32,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 7, 2017
+.Dd January 26, 2020
 .Dt PWAIT 1
 .Os
 .Sh NAME
@@ -41,7 +41,7 @@
 .Sh SYNOPSIS
 .Nm
 .Op Fl t Ar duration
-.Op Fl v
+.Op Fl ov
 .Ar pid
 \&...
 .Sh DESCRIPTION
@@ -51,6 +51,8 @@ utility will wait until each of the given processes ha
 .Pp
 The following option is available:
 .Bl -tag -width indent
+.It Fl o
+Exit when any of the given processes has terminated.
 .It Fl t Ar duration
 If any process is still running after
 .Ar duration ,

Modified: head/bin/pwait/pwait.c
==============================================================================
--- head/bin/pwait/pwait.c      Sun Jan 26 10:54:16 2020        (r357140)
+++ head/bin/pwait/pwait.c      Sun Jan 26 11:02:51 2020        (r357141)
@@ -53,7 +53,7 @@ static void
 usage(void)
 {
 
-       errx(EX_USAGE, "usage: pwait [-t timeout] [-v] pid ...");
+       errx(EX_USAGE, "usage: pwait [-t timeout] [-ov] pid ...");
 }
 
 /*
@@ -65,16 +65,22 @@ main(int argc, char *argv[])
        struct itimerval itv;
        int kq;
        struct kevent *e;
-       int tflag, verbose;
+       int oflag, tflag, verbose;
        int opt, nleft, n, i, status;
        long pid;
        char *s, *end;
        double timeout;
 
-       tflag = verbose = 0;
+       oflag = 0;
+       tflag = 0;
+       verbose = 0;
        memset(&itv, 0, sizeof(itv));
-       while ((opt = getopt(argc, argv, "t:v")) != -1) {
+
+       while ((opt = getopt(argc, argv, "t:ov")) != -1) {
                switch (opt) {
+               case 'o':
+                       oflag = 1;
+                       break;
                case 't':
                        tflag = 1;
                        errno = 0;
@@ -144,10 +150,13 @@ main(int argc, char *argv[])
                        continue;
                }
                EV_SET(e + nleft, pid, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, NULL);
-               if (kevent(kq, e + nleft, 1, NULL, 0, NULL) == -1)
+               if (kevent(kq, e + nleft, 1, NULL, 0, NULL) == -1) {
                        warn("%ld", pid);
-               else
+                       if (oflag)
+                               exit(EX_OK);
+               } else {
                        nleft++;
+               }
        }
 
        if (nleft > 0 && tflag) {
@@ -187,6 +196,8 @@ main(int argc, char *argv[])
                                        printf("%ld: terminated.\n",
                                            (long)e[i].ident);
                        }
+                       if (oflag)
+                               exit(EX_OK);
                        --nleft;
                }
        }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to