The branch main has been updated by bapt:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=404753664a5e145d98f1749d1c7bc046c8aa32c3

commit 404753664a5e145d98f1749d1c7bc046c8aa32c3
Author:     Baptiste Daroussin <[email protected]>
AuthorDate: 2026-02-02 16:29:49 +0000
Commit:     Baptiste Daroussin <[email protected]>
CommitDate: 2026-02-02 16:36:42 +0000

    diff3: use pdwait instead of homemade one
    
    MFC After:      3 days
---
 usr.bin/diff3/diff3.c | 56 +++++++++++++++++----------------------------------
 1 file changed, 19 insertions(+), 37 deletions(-)

diff --git a/usr.bin/diff3/diff3.c b/usr.bin/diff3/diff3.c
index 39523f6e6b38..d010a0b1d067 100644
--- a/usr.bin/diff3/diff3.c
+++ b/usr.bin/diff3/diff3.c
@@ -65,7 +65,6 @@
 #include <sys/capsicum.h>
 #include <sys/procdesc.h>
 #include <sys/types.h>
-#include <sys/event.h>
 #include <sys/wait.h>
 
 #include <capsicum_helpers.h>
@@ -921,11 +920,26 @@ increase(void)
        szchanges = newsz;
 }
 
+static void
+wait_and_check(int pd)
+{
+       int status;
+
+       while (pdwait(pd, &status, WEXITED, NULL, NULL) == -1) {
+               if (errno != EINTR)
+                       err(2, "pdwait");
+       }
+
+       if (WIFEXITED(status) && WEXITSTATUS(status) >= 2)
+               errx(2, "diff exited abnormally");
+       if (WIFSIGNALED(status))
+               errx(2, "diff killed by signal %d", WTERMSIG(status));
+}
 
 int
 main(int argc, char **argv)
 {
-       int ch, nblabels, status, m, n, kq, nke, nleft, i;
+       int ch, nblabels, m, n;
        char *labels[] = { NULL, NULL, NULL };
        const char *diffprog = DIFF_PATH;
        char *file1, *file2, *file3;
@@ -934,7 +948,6 @@ main(int argc, char **argv)
        int fd13[2], fd23[2];
        int pd13, pd23;
        cap_rights_t rights_ro;
-       struct kevent *e;
 
        nblabels = 0;
        eflag = EFLAG_NONE;
@@ -1016,14 +1029,6 @@ main(int argc, char **argv)
 
        cap_rights_init(&rights_ro, CAP_READ, CAP_FSTAT, CAP_SEEK);
 
-       kq = kqueue();
-       if (kq == -1)
-               err(2, "kqueue");
-
-       e = malloc(2 * sizeof(*e));
-       if (e == NULL)
-               err(2, "malloc");
-
        /* TODO stdio */
        file1 = argv[0];
        file2 = argv[1];
@@ -1069,20 +1074,10 @@ main(int argc, char **argv)
        diffargv[diffargc] = file1;
        diffargv[diffargc + 1] = file3;
        diffargv[diffargc + 2] = NULL;
-
-       nleft = 0;
        pd13 = diffexec(diffprog, diffargv, fd13);
-       EV_SET(e + nleft , pd13, EVFILT_PROCDESC, EV_ADD, NOTE_EXIT, 0, NULL);
-       if (kevent(kq, e + nleft, 1, NULL, 0, NULL) == -1)
-               err(2, "kevent1");
-       nleft++;
 
        diffargv[diffargc] = file2;
        pd23 = diffexec(diffprog, diffargv, fd23);
-       EV_SET(e + nleft , pd23, EVFILT_PROCDESC, EV_ADD, NOTE_EXIT, 0, NULL);
-       if (kevent(kq, e + nleft, 1, NULL, 0, NULL) == -1)
-               err(2, "kevent2");
-       nleft++;
 
        caph_cache_catpages();
        if (caph_enter() < 0)
@@ -1093,22 +1088,9 @@ main(int argc, char **argv)
        m = readin(fd13[0], &d13);
        n = readin(fd23[0], &d23);
 
-       /* waitpid cooked over pdforks */
-       while (nleft > 0) {
-               nke = kevent(kq, NULL, 0, e, nleft, NULL);
-               if (nke == -1)
-                       err(2, "kevent");
-               for (i = 0; i < nke; i++) {
-                       status = e[i].data;
-                       if (WIFEXITED(status) && WEXITSTATUS(status) >= 2)
-                               errx(2, "diff exited abnormally");
-                       else if (WIFSIGNALED(status))
-                               errx(2, "diff killed by signal %d",
-                                   WTERMSIG(status));
-               }
-               nleft -= nke;
-       }
-       free(e);
+       wait_and_check(pd13);
+       wait_and_check(pd23);
+
        merge(m, n);
 
        return (EXIT_SUCCESS);

Reply via email to