git: 54579376c05e - main - Change kqueue1() to be compatible with NetBSD

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Wed, 05 Apr 2023 03:33:44 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=54579376c05e7a039cde5f424c641fa29348835f

commit 54579376c05e7a039cde5f424c641fa29348835f
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2023-03-31 22:31:41 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2023-04-05 03:29:49 +0000

    Change kqueue1() to be compatible with NetBSD
    
    by making it accept some open(2) flags.  More precisely, only
    O_CLOEXEC is supported, the flag is translated into the KQUEUE_CLOEXEC flag
    for kqueuex(2), and O_NONBLOCK is silently ignored.
    
    Reported and tested by: vishwin
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D39377
---
 lib/libc/gen/Makefile.inc |  1 +
 lib/libc/gen/Symbol.map   |  1 +
 lib/libc/gen/kqueue1.c    | 52 +++++++++++++++++++++++++++++++++++++++++++++++
 lib/libc/sys/kqueue.2     |  8 ++++++++
 sys/sys/event.h           |  1 +
 5 files changed, 63 insertions(+)

diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc
index 860e96bcd291..317bb307cf3a 100644
--- a/lib/libc/gen/Makefile.inc
+++ b/lib/libc/gen/Makefile.inc
@@ -97,6 +97,7 @@ SRCS+=	__getosreldate.c \
 	isinf.c \
 	isnan.c \
 	jrand48.c \
+	kqueue1.c \
 	lcong48.c \
 	libc_dlopen.c \
 	lockf.c \
diff --git a/lib/libc/gen/Symbol.map b/lib/libc/gen/Symbol.map
index 0a20a41d0e20..84432432f4e6 100644
--- a/lib/libc/gen/Symbol.map
+++ b/lib/libc/gen/Symbol.map
@@ -436,6 +436,7 @@ FBSD_1.6 {
 };
 
 FBSD_1.7 {
+	 kqueue1;
 	 posix_spawn_file_actions_addchdir_np;
 	 posix_spawn_file_actions_addclosefrom_np;
 	 posix_spawn_file_actions_addfchdir_np;
diff --git a/lib/libc/gen/kqueue1.c b/lib/libc/gen/kqueue1.c
new file mode 100644
index 000000000000..b27a8f63019e
--- /dev/null
+++ b/lib/libc/gen/kqueue1.c
@@ -0,0 +1,52 @@
+/*-
+ * Copyright (c) 2023 The FreeBSD Foundation
+ *
+ * This software were developed by Konstantin Belousov <kib@FreeBSD.org>
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/event.h>
+#include <errno.h>
+#include <fcntl.h>
+
+/*
+ * Provide some NetBSD compatibility.  They support a set of O_*
+ * flags, we only carry O_CLOEXEC, and accept but ignore O_NONBLOCK.
+ */
+int
+kqueue1(int openflags)
+{
+	u_int flags;
+
+	if ((openflags & ~(O_CLOEXEC | O_NONBLOCK)) != 0) {
+		errno = EINVAL;
+		return (-1);
+	}
+
+	flags = 0;
+	if ((openflags & O_CLOEXEC) != 0)
+		flags |= KQUEUE_CLOEXEC;
+	return (kqueuex(flags));
+}
diff --git a/lib/libc/sys/kqueue.2 b/lib/libc/sys/kqueue.2
index cad4361f2b3c..81bd1c3e52f4 100644
--- a/lib/libc/sys/kqueue.2
+++ b/lib/libc/sys/kqueue.2
@@ -107,6 +107,14 @@ The
 call is equivalent to
 .Ql fd = kqueuex(0) .
 .Pp
+For compatibility with
+.Nx ,
+the
+.Fn kqueue1
+function is provided, which accepts the
+.Dv O_CLOEXEC
+flag with the expected semantic.
+.Pp
 The
 .Fn kevent
 system call
diff --git a/sys/sys/event.h b/sys/sys/event.h
index b902f195723e..fe117371b452 100644
--- a/sys/sys/event.h
+++ b/sys/sys/event.h
@@ -362,6 +362,7 @@ struct timespec;
 __BEGIN_DECLS
 int     kqueue(void);
 int     kqueuex(unsigned flags);
+int     kqueue1(int flags);
 int     kevent(int kq, const struct kevent *changelist, int nchanges,
 	    struct kevent *eventlist, int nevents,
 	    const struct timespec *timeout);