Module Name: src Committed By: christos Date: Sun Jul 30 18:31:14 UTC 2023
Modified Files: src/sys/compat/linux/common: linux_misc.c src/sys/kern: sys_epoll.c src/sys/sys: epoll.h src/tests/kernel: t_epoll.c Log Message: Add EPOLL_CLOEXEC (Theodore Preduta) To generate a diff of this commit: cvs rdiff -u -r1.260 -r1.261 src/sys/compat/linux/common/linux_misc.c cvs rdiff -u -r1.3 -r1.4 src/sys/kern/sys_epoll.c cvs rdiff -u -r1.1 -r1.2 src/sys/sys/epoll.h cvs rdiff -u -r1.1 -r1.2 src/tests/kernel/t_epoll.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/linux/common/linux_misc.c diff -u src/sys/compat/linux/common/linux_misc.c:1.260 src/sys/compat/linux/common/linux_misc.c:1.261 --- src/sys/compat/linux/common/linux_misc.c:1.260 Sat Jul 29 11:04:29 2023 +++ src/sys/compat/linux/common/linux_misc.c Sun Jul 30 14:31:13 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_misc.c,v 1.260 2023/07/29 15:04:29 christos Exp $ */ +/* $NetBSD: linux_misc.c,v 1.261 2023/07/30 18:31:13 christos Exp $ */ /*- * Copyright (c) 1995, 1998, 1999, 2008 The NetBSD Foundation, Inc. @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.260 2023/07/29 15:04:29 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.261 2023/07/30 18:31:13 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1725,7 +1725,7 @@ linux_sys_epoll_create1(struct lwp *l, SCARG(&ca, flags) = 0; if ((SCARG(uap, flags) & LINUX_O_CLOEXEC) != 0) - SCARG(&ca, flags) |= O_CLOEXEC; + SCARG(&ca, flags) |= EPOLL_CLOEXEC; return sys_epoll_create1(l, &ca, retval); } Index: src/sys/kern/sys_epoll.c diff -u src/sys/kern/sys_epoll.c:1.3 src/sys/kern/sys_epoll.c:1.4 --- src/sys/kern/sys_epoll.c:1.3 Sun Jul 30 00:39:00 2023 +++ src/sys/kern/sys_epoll.c Sun Jul 30 14:31:13 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_epoll.c,v 1.3 2023/07/30 04:39:00 rin Exp $ */ +/* $NetBSD: sys_epoll.c,v 1.4 2023/07/30 18:31:13 christos Exp $ */ /*- * SPDX-License-Identifier: BSD-2-Clause @@ -28,7 +28,7 @@ * SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_epoll.c,v 1.3 2023/07/30 04:39:00 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_epoll.c,v 1.4 2023/07/30 18:31:13 christos Exp $"); #include <sys/param.h> @@ -100,10 +100,12 @@ sys_epoll_create1(struct lwp *l, const s } */ struct sys_kqueue1_args kqa; - if ((SCARG(uap, flags) & ~(O_CLOEXEC)) != 0) + if ((SCARG(uap, flags) & ~(EPOLL_CLOEXEC)) != 0) return EINVAL; - SCARG(&kqa, flags) = SCARG(uap, flags); + SCARG(&kqa, flags) = 0; + if (SCARG(uap, flags) & EPOLL_CLOEXEC) + SCARG(&kqa, flags) |= O_CLOEXEC; return sys_kqueue1(l, &kqa, retval); } Index: src/sys/sys/epoll.h diff -u src/sys/sys/epoll.h:1.1 src/sys/sys/epoll.h:1.2 --- src/sys/sys/epoll.h:1.1 Fri Jul 28 14:19:01 2023 +++ src/sys/sys/epoll.h Sun Jul 30 14:31:14 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: epoll.h,v 1.1 2023/07/28 18:19:01 christos Exp $ */ +/* $NetBSD: epoll.h,v 1.2 2023/07/30 18:31:14 christos Exp $ */ /*- * Copyright (c) 2007 Roman Divacky @@ -31,10 +31,13 @@ #ifndef _SYS_EPOLL_H_ #define _SYS_EPOLL_H_ +#include <sys/fcntl.h> /* for O_CLOEXEC */ #include <sys/types.h> /* for uint32_t, uint64_t */ #include <sys/sigtypes.h> /* for sigset_t */ struct timespec; +#define EPOLL_CLOEXEC O_CLOEXEC + #define EPOLLIN 0x00000001 #define EPOLLPRI 0x00000002 #define EPOLLOUT 0x00000004 Index: src/tests/kernel/t_epoll.c diff -u src/tests/kernel/t_epoll.c:1.1 src/tests/kernel/t_epoll.c:1.2 --- src/tests/kernel/t_epoll.c:1.1 Fri Jul 28 14:19:01 2023 +++ src/tests/kernel/t_epoll.c Sun Jul 30 14:31:14 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: t_epoll.c,v 1.1 2023/07/28 18:19:01 christos Exp $ */ +/* $NetBSD: t_epoll.c,v 1.2 2023/07/30 18:31:14 christos Exp $ */ /*- * Copyright (c) 2023 The NetBSD Foundation, Inc. @@ -29,11 +29,12 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__RCSID("$NetBSD: t_epoll.c,v 1.1 2023/07/28 18:19:01 christos Exp $"); +__RCSID("$NetBSD: t_epoll.c,v 1.2 2023/07/30 18:31:14 christos Exp $"); #include <sys/param.h> #include <sys/types.h> #include <sys/epoll.h> +#include <sys/fcntl.h> #include <errno.h> #include <atf-c.h> @@ -60,6 +61,26 @@ ATF_TC_BODY(create_size, tc) RL(epoll_create(1)); } +ATF_TC(create_cloexec); +ATF_TC_HEAD(create_cloexec, tc) +{ + + atf_tc_set_md_var(tc, "descr", + "Checks that epoll_create1 sets close on exec when desired"); +} +ATF_TC_BODY(create_cloexec, tc) +{ + int fd; + + RL(fd = epoll_create1(0)); + ATF_REQUIRE_MSG((fcntl(fd, F_GETFD) & FD_CLOEXEC) == 0, + "Close on exec set unexpectedly."); + + RL(fd = epoll_create1(EPOLL_CLOEXEC)); + ATF_REQUIRE_MSG((fcntl(fd, F_GETFD) & FD_CLOEXEC) != 0, + "Close on exec was not set."); +} + ATF_TC(bad_epfd); ATF_TC_HEAD(bad_epfd, tc) { @@ -214,6 +235,7 @@ ATF_TC_BODY(watch_depth, tc) ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, create_size); + ATF_TP_ADD_TC(tp, create_cloexec); ATF_TP_ADD_TC(tp, bad_epfd); ATF_TP_ADD_TC(tp, bad_fd); ATF_TP_ADD_TC(tp, not_added);