svn commit: r357141 - head/bin/pwait

Pawel Jakub Dawidek pjd at FreeBSD.org
Sun Jan 26 11:02:52 UTC 2020


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;
 		}
 	}


More information about the svn-src-all mailing list