Module Name:    src
Committed By:   christos
Date:           Sat Aug 19 22:56:44 UTC 2023

Modified Files:
        src/tests: Makefile
Added Files:
        src/tests/compat: Makefile
        src/tests/compat/linux: Makefile h_common.sh h_inotify_directory.c
            h_inotify_init.c h_inotify_single_file.c h_inotify_watch_change.c
            h_linux.c h_linux.h h_not_supported.sh t_inotify.sh
        src/tests/compat/linux/arch/x86_64: h_syscall.c

Log Message:
Tests for the compat_linux inotify framework from GSoC 2023 (Theodore Preduta)


To generate a diff of this commit:
cvs rdiff -u -r1.46 -r1.47 src/tests/Makefile
cvs rdiff -u -r0 -r1.1 src/tests/compat/Makefile
cvs rdiff -u -r0 -r1.1 src/tests/compat/linux/Makefile \
    src/tests/compat/linux/h_common.sh \
    src/tests/compat/linux/h_inotify_directory.c \
    src/tests/compat/linux/h_inotify_init.c \
    src/tests/compat/linux/h_inotify_single_file.c \
    src/tests/compat/linux/h_inotify_watch_change.c \
    src/tests/compat/linux/h_linux.c src/tests/compat/linux/h_linux.h \
    src/tests/compat/linux/h_not_supported.sh \
    src/tests/compat/linux/t_inotify.sh
cvs rdiff -u -r0 -r1.1 src/tests/compat/linux/arch/x86_64/h_syscall.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/Makefile
diff -u src/tests/Makefile:1.46 src/tests/Makefile:1.47
--- src/tests/Makefile:1.46	Sun May 21 11:28:42 2017
+++ src/tests/Makefile	Sat Aug 19 18:56:43 2023
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.46 2017/05/21 15:28:42 riastradh Exp $
+# $NetBSD: Makefile,v 1.47 2023/08/19 22:56:43 christos Exp $
 
 .include <bsd.own.mk>
 
@@ -6,7 +6,7 @@
 
 TESTSDIR=	${TESTSBASE}
 
-TESTS_SUBDIRS=		bin dev games include kernel lib libexec net
+TESTS_SUBDIRS=		bin compat dev games include kernel lib libexec net
 TESTS_SUBDIRS+=		sbin sys usr.bin usr.sbin
 
 . if (${MKRUMP} != "no") && !defined(BSD_MK_COMPAT_FILE)

Added files:

Index: src/tests/compat/Makefile
diff -u /dev/null src/tests/compat/Makefile:1.1
--- /dev/null	Sat Aug 19 18:56:44 2023
+++ src/tests/compat/Makefile	Sat Aug 19 18:56:44 2023
@@ -0,0 +1,7 @@
+.include <bsd.own.mk>
+
+TESTSDIR=		${TESTSBASE}/compat
+
+TESTS_SUBDIRS=		linux
+
+.include <bsd.test.mk>

Index: src/tests/compat/linux/Makefile
diff -u /dev/null src/tests/compat/linux/Makefile:1.1
--- /dev/null	Sat Aug 19 18:56:44 2023
+++ src/tests/compat/linux/Makefile	Sat Aug 19 18:56:44 2023
@@ -0,0 +1,61 @@
+#	$NetBSD: Makefile,v 1.1 2023/08/19 22:56:44 christos Exp $
+
+.include <bsd.own.mk>
+
+TESTSDIR=	${TESTSBASE}/compat/linux
+TESTS_SH=	t_inotify
+
+TC_PROGS=	h_inotify_init
+TC_PROGS+=	h_inotify_directory
+TC_PROGS+=	h_inotify_single_file
+TC_PROGS+=	h_inotify_watch_change
+
+.PATH: ${.CURDIR}/arch/${MACHINE_ARCH}
+
+LDFLAGS+=	-nostartfiles -static
+CFLAGS+=	-I${.CURDIR}/../../../sys
+CFLAGS+=	-I${.CURDIR}
+CFLAGS+=	-D_STANDALONE
+
+FILESDIR=	${TESTSDIR}
+
+.for _P in ${TESTS_SH}
+.if ${MACHINE_ARCH} == "x86_64"
+TESTS_SH_SRC_${_P}=	h_common.sh
+.else
+TESTS_SH_SRC_${_P}=	h_not_supported.sh
+.endif
+TESTS_SH_SRC_${_P}+=	${_P}.sh
+.endfor
+
+.for _P in ${TC_PROGS}
+CLEANFILES+=		${_P}
+FILES+=			${_P}
+
+.if ${MACHINE_ARCH} == "x86_64"
+PROGS+=			${_P}.out
+SRCS.${_P}.out=		${_P}.c
+SRCS.${_P}.out+=	h_linux.c
+SRCS.${_P}.out+=	h_syscall.c
+MAN.${_P}.out=		# empty
+FILESMODE_${_P}=	${BINMODE}
+
+proginstall-${_P}.out:
+	# Do not install
+
+${_P}: ${_P}.out
+	${_MKTARGET_CREATE}
+	cp ${.ALLSRC} ${.TARGET}
+	${ELFEDIT} --output-osabi Linux ${.TARGET}
+.else
+${_P}:
+	echo '' > ${.TARGET}
+.endif
+
+realall: ${_P}
+.endfor
+
+CLEANFILES+=	${TESTS_SH}
+CLEANFILES+=	Atffile
+
+.include <bsd.test.mk>
Index: src/tests/compat/linux/h_common.sh
diff -u /dev/null src/tests/compat/linux/h_common.sh:1.1
--- /dev/null	Sat Aug 19 18:56:44 2023
+++ src/tests/compat/linux/h_common.sh	Sat Aug 19 18:56:44 2023
@@ -0,0 +1,34 @@
+# $NetBSD: h_common.sh,v 1.1 2023/08/19 22:56:44 christos Exp $
+#
+# Copyright (c) 2023 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by Theodore Preduta.
+#
+# 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+#/
+
+h_ensure_emul_exists() {
+	modstat | grep -q '^compat_linux\W' \
+		|| atf_skip "Linux emulation not loaded"
+}
Index: src/tests/compat/linux/h_inotify_directory.c
diff -u /dev/null src/tests/compat/linux/h_inotify_directory.c:1.1
--- /dev/null	Sat Aug 19 18:56:44 2023
+++ src/tests/compat/linux/h_inotify_directory.c	Sat Aug 19 18:56:44 2023
@@ -0,0 +1,108 @@
+/*	$NetBSD: h_inotify_directory.c,v 1.1 2023/08/19 22:56:44 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2023 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Theodore Preduta.
+ *
+ * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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/cdefs.h>
+__RCSID("$NetBSD: h_inotify_directory.c,v 1.1 2023/08/19 22:56:44 christos Exp $");
+
+#include "h_linux.h"
+
+#include <sys/null.h>
+
+#include <compat/linux/linux_syscall.h>
+#include <compat/linux/common/linux_inotify.h>
+
+#define	INOTIFY_ALL_DIRECTORY	(LINUX_IN_ATTRIB|LINUX_IN_CREATE \
+				|LINUX_IN_MOVE_SELF|LINUX_IN_MOVED_FROM \
+				|LINUX_IN_MOVED_TO|LINUX_IN_DELETE \
+				|LINUX_IN_DELETE_SELF)
+
+char buf[8192];
+
+struct {
+	uint32_t	mask;
+	bool		cookie;
+	char		name[16];
+} target_events[] = {
+	{ .mask = LINUX_IN_CREATE,	.cookie = 0,	.name = "test", },
+	{ .mask = LINUX_IN_MOVED_FROM,	.cookie = 1,	.name = "test", },
+	{ .mask = LINUX_IN_MOVED_TO,	.cookie = 1,	.name = "test2", },
+	{ .mask = LINUX_IN_DELETE,	.cookie = 0,	.name = "test2", },
+	{ .mask = LINUX_IN_MOVE_SELF,	.cookie = 0,	.name = "", },
+	{ .mask = LINUX_IN_DELETE_SELF,	.cookie = 0,	.name = "", },
+	{ .mask = LINUX_IN_IGNORED,	.cookie = 0,	.name = "", },
+};
+
+void
+_start(void)
+{
+	int fd, wd, targetfd;
+	char *cur_buf;
+	struct linux_inotify_event *cur_ie;
+
+	RS(mkdir("test", 0644));
+
+	RS(fd = syscall(LINUX_SYS_inotify_init));
+	RS(wd = syscall(LINUX_SYS_inotify_add_watch, fd, (register_t)"test",
+	    INOTIFY_ALL_DIRECTORY));
+
+	/* Create some events. */
+	RS(targetfd = open("test/test", LINUX_O_RDWR|LINUX_O_CREAT, 0644));
+	RS(write(targetfd, &targetfd, sizeof(targetfd)));
+	RS(close(targetfd));
+	RS(rename("test/test", "test/test2"));
+	RS(unlink("test/test2"));
+	RS(rename("test", "test2"));
+	RS(rmdir("test2"));
+
+	/* Check the events. */
+	RS(read(fd, buf, sizeof(buf)));
+	cur_buf = buf;
+	for (size_t i = 0; i < __arraycount(target_events); i++) {
+		cur_ie = (struct linux_inotify_event *)cur_buf;
+
+		REQUIRE(cur_ie->wd == wd);
+		REQUIRE(cur_ie->mask == target_events[i].mask);
+
+		if (target_events[i].cookie)
+			REQUIRE(cur_ie->cookie != 0);
+		else
+			REQUIRE(cur_ie->cookie == 0);
+
+		if (target_events[i].name[0] != '\0') {
+			REQUIRE(cur_ie->len > strlen(target_events[i].name));
+			REQUIRE(strcmp(cur_ie->name, target_events[i].name) == 0);
+		} else
+			REQUIRE(cur_ie->len == 0);
+
+		cur_buf += sizeof(struct linux_inotify_event) + cur_ie->len;
+	}
+
+	exit(0);
+}
Index: src/tests/compat/linux/h_inotify_init.c
diff -u /dev/null src/tests/compat/linux/h_inotify_init.c:1.1
--- /dev/null	Sat Aug 19 18:56:44 2023
+++ src/tests/compat/linux/h_inotify_init.c	Sat Aug 19 18:56:44 2023
@@ -0,0 +1,65 @@
+/*	$NetBSD: h_inotify_init.c,v 1.1 2023/08/19 22:56:44 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2023 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Theodore Preduta.
+ *
+ * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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/cdefs.h>
+__RCSID("$NetBSD: h_inotify_init.c,v 1.1 2023/08/19 22:56:44 christos Exp $");
+
+#include "h_linux.h"
+
+#include <compat/linux/linux_syscall.h>
+#include <compat/linux/common/linux_errno.h>
+#include <compat/linux/common/linux_fcntl.h>
+#include <compat/linux/common/linux_inotify.h>
+
+void
+_start(void)
+{
+	int fd;
+
+	/* Check that none of CLOEXEC or NONBLOCK are set. */
+	RS(fd = syscall(LINUX_SYS_inotify_init));
+	REQUIRE(fcntl(fd, LINUX_F_GETFD) == 0);
+	REQUIRE((fcntl(fd, LINUX_F_GETFL) & LINUX_O_NONBLOCK) == 0);
+	RS(close(fd));
+
+	/* Check that only NONBLOCK is set. */
+	RS(fd = syscall(LINUX_SYS_inotify_init1, LINUX_IN_NONBLOCK));
+	REQUIRE(fcntl(fd, LINUX_F_GETFD) == 0);
+	REQUIRE((fcntl(fd, LINUX_F_GETFL) & LINUX_O_NONBLOCK) != 0);
+	RS(close(fd));
+
+	/* Check that only CLOEXEC is set. */
+	RS(fd = syscall(LINUX_SYS_inotify_init1, LINUX_IN_CLOEXEC));
+	REQUIRE(fcntl(fd, LINUX_F_GETFD) != 0);
+	REQUIRE((fcntl(fd, LINUX_F_GETFL) & LINUX_O_NONBLOCK) == 0);
+	RS(close(fd));
+
+	exit(0);
+}
Index: src/tests/compat/linux/h_inotify_single_file.c
diff -u /dev/null src/tests/compat/linux/h_inotify_single_file.c:1.1
--- /dev/null	Sat Aug 19 18:56:44 2023
+++ src/tests/compat/linux/h_inotify_single_file.c	Sat Aug 19 18:56:44 2023
@@ -0,0 +1,87 @@
+/*	$NetBSD: h_inotify_single_file.c,v 1.1 2023/08/19 22:56:44 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2023 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Theodore Preduta.
+ *
+ * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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/cdefs.h>
+__RCSID("$NetBSD: h_inotify_single_file.c,v 1.1 2023/08/19 22:56:44 christos Exp $");
+
+#include "h_linux.h"
+
+#include <compat/linux/linux_syscall.h>
+#include <compat/linux/common/linux_inotify.h>
+
+#define	INOTIFY_ALL_FILE	(LINUX_IN_ATTRIB|LINUX_IN_CLOSE_NOWRITE \
+				|LINUX_IN_OPEN|LINUX_IN_MOVE_SELF \
+				|LINUX_IN_ACCESS|LINUX_IN_CLOSE_WRITE \
+				|LINUX_IN_MODIFY|LINUX_IN_DELETE_SELF)
+
+struct linux_inotify_event events[10];
+
+void
+_start(void)
+{
+	int fd, wd, targetfd, buf;
+
+	RS(targetfd = open("test", LINUX_O_RDWR|LINUX_O_CREAT, 0644));
+	RS(close(targetfd));
+
+	RS(fd = syscall(LINUX_SYS_inotify_init));
+	RS(wd = syscall(LINUX_SYS_inotify_add_watch, fd, (register_t)"test",
+	    INOTIFY_ALL_FILE));
+
+	/* Create some events. */
+	RS(targetfd = open("test", LINUX_O_RDWR|LINUX_O_CREAT, 0644));
+	RS(write(targetfd, &buf, sizeof(buf)));
+	RS(read(targetfd, &buf, sizeof(buf)));
+	RS(close(targetfd));
+	RS(targetfd = open("test", LINUX_O_RDONLY|LINUX_O_CREAT, 0644));
+	RS(close(targetfd));
+	RS(rename("test", "test2"));
+	RS(unlink("test2"));
+
+	/* Get and check the events. */
+	RS(read(fd, events, sizeof(events)));
+
+	for (size_t i = 0; i < __arraycount(events); i++)
+		REQUIRE(events[i].wd == wd && events[i].cookie == 0
+		    && events[i].len == 0);
+
+	REQUIRE(events[0].mask == LINUX_IN_OPEN);
+	REQUIRE(events[1].mask == LINUX_IN_MODIFY);
+	REQUIRE(events[2].mask == LINUX_IN_ACCESS);
+	REQUIRE(events[3].mask == LINUX_IN_CLOSE_WRITE);
+	REQUIRE(events[4].mask == LINUX_IN_OPEN);
+	REQUIRE(events[5].mask == LINUX_IN_CLOSE_NOWRITE);
+	REQUIRE(events[6].mask == LINUX_IN_MOVE_SELF);
+	REQUIRE(events[7].mask == LINUX_IN_ATTRIB);
+	REQUIRE(events[8].mask == LINUX_IN_DELETE_SELF);
+	REQUIRE(events[9].mask == LINUX_IN_IGNORED);
+
+	exit(0);
+}
Index: src/tests/compat/linux/h_inotify_watch_change.c
diff -u /dev/null src/tests/compat/linux/h_inotify_watch_change.c:1.1
--- /dev/null	Sat Aug 19 18:56:44 2023
+++ src/tests/compat/linux/h_inotify_watch_change.c	Sat Aug 19 18:56:44 2023
@@ -0,0 +1,88 @@
+/*	$NetBSD: h_inotify_watch_change.c,v 1.1 2023/08/19 22:56:44 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2023 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Theodore Preduta.
+ *
+ * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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/cdefs.h>
+__RCSID("$NetBSD: h_inotify_watch_change.c,v 1.1 2023/08/19 22:56:44 christos Exp $");
+
+#include "h_linux.h"
+
+#include <compat/linux/linux_syscall.h>
+#include <compat/linux/common/linux_inotify.h>
+
+struct linux_inotify_event events[2];
+
+void
+_start(void)
+{
+	int fd, wd, targetfd;
+	ssize_t nread;
+
+	RS(targetfd = open("test", LINUX_O_RDWR|LINUX_O_CREAT, 0644));
+	RS(close(targetfd));
+
+	RS(fd = syscall(LINUX_SYS_inotify_init));
+	RS(wd = syscall(LINUX_SYS_inotify_add_watch, fd, (register_t)"test",
+            LINUX_IN_CLOSE_NOWRITE));
+
+	/* We should only get the close event. */
+	RS(targetfd = open("test", LINUX_O_RDONLY|LINUX_O_CREAT, 0644));
+	RS(close(targetfd));
+
+	RS(nread = read(fd, events, sizeof(events)));
+	REQUIRE(nread == sizeof(events[0]));
+	REQUIRE(events[0].mask == LINUX_IN_CLOSE_NOWRITE);
+
+	/* Change the watch descriptor. */
+	RS(wd = syscall(LINUX_SYS_inotify_add_watch, fd, (register_t)"test",
+	    LINUX_IN_OPEN));
+
+	/* We should only get the open event. */
+	RS(targetfd = open("test", LINUX_O_RDONLY|LINUX_O_CREAT, 0644));
+	RS(close(targetfd));
+
+	RS(nread = read(fd, events, sizeof(events)));
+	REQUIRE(nread == sizeof(events[0]));
+	REQUIRE(events[0].mask == LINUX_IN_OPEN);
+
+	/* Add to the watch descriptor. */
+	RS(wd = syscall(LINUX_SYS_inotify_add_watch, fd, (register_t)"test",
+	    LINUX_IN_CLOSE_NOWRITE|LINUX_IN_MASK_ADD));
+
+	/* Now we should get both the open and the close. */
+	RS(targetfd = open("test", LINUX_O_RDONLY|LINUX_O_CREAT, 0644));
+	RS(close(targetfd));
+
+	RS(nread = read(fd, events, sizeof(events)));
+	REQUIRE(nread == 2 * sizeof(events[0]));
+	REQUIRE(events[0].mask == LINUX_IN_OPEN);
+	REQUIRE(events[1].mask == LINUX_IN_CLOSE_NOWRITE);
+
+	exit(0);
+}
Index: src/tests/compat/linux/h_linux.c
diff -u /dev/null src/tests/compat/linux/h_linux.c:1.1
--- /dev/null	Sat Aug 19 18:56:44 2023
+++ src/tests/compat/linux/h_linux.c	Sat Aug 19 18:56:44 2023
@@ -0,0 +1,36 @@
+/*	$NetBSD: h_linux.c,v 1.1 2023/08/19 22:56:44 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2023 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Theodore Preduta.
+ *
+ * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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/cdefs.h>
+__RCSID("$NetBSD: h_linux.c,v 1.1 2023/08/19 22:56:44 christos Exp $");
+
+#include "h_linux.h"
+
+int errno = 0;
Index: src/tests/compat/linux/h_linux.h
diff -u /dev/null src/tests/compat/linux/h_linux.h:1.1
--- /dev/null	Sat Aug 19 18:56:44 2023
+++ src/tests/compat/linux/h_linux.h	Sat Aug 19 18:56:44 2023
@@ -0,0 +1,76 @@
+/*	$NetBSD: h_linux.h,v 1.1 2023/08/19 22:56:44 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2023 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Theodore Preduta.
+ *
+ * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+#ifndef	SRC_TESTS_COMPAT_LINUX_H_LINUX_H_
+#define	SRC_TESTS_COMPAT_LINUX_H_LINUX_H_
+
+#include <sys/types.h>	/* For register_t. */
+
+#define	FAIL			(-1)
+
+#define	syscall(number, ...)	syscall6(number, ## __VA_ARGS__, \
+				    0, 0, 0, 0, 0, 0)
+
+#define	RS(x)			do { if ((x) == -1) exit(errno); } while (0)
+#define	REQUIRE(x)		do { if (!(x)) exit(FAIL); } while (0)
+
+/* Convinience wrappers for common syscalls. */
+#define	close(fd)		(int)syscall(LINUX_SYS_close, fd)
+#define	exit(status)		(void)syscall(LINUX_SYS_exit_group, status)
+#define	fcntl(fd, cmd, ...)	(int)syscall(LINUX_SYS_fcntl, fd, cmd, \
+			            ## __VA_ARGS__)
+#define	lseek(fd, off, whence)	(off_t)syscall(LINUX_SYS_lseek, fd, \
+				    (register_t)off, whence)
+#define	mkdir(path, mode)	(int)syscall(LINUX_SYS_mkdir, \
+				    (register_t)path, mode)
+#define	open(path, flags, ...)	(int)syscall(LINUX_SYS_open, \
+				    (register_t)path, flags, \
+				    ## __VA_ARGS__)
+#define	read(fd, buf, count)	(ssize_t)syscall(LINUX_SYS_read, fd, \
+				    (register_t)buf, count)
+#define	rename(from, to)	(int)syscall(LINUX_SYS___posix_rename, \
+				    (register_t)from, (register_t)to)
+#define	rmdir(path)		(int)syscall(LINUX_SYS_rmdir, \
+				    (register_t)path)
+#define	unlink(path)		(int)syscall(LINUX_SYS_unlink, \
+				    (register_t)path)
+#define	write(fd, buf, count)	(ssize_t)syscall(LINUX_SYS_write, fd, \
+				    (register_t)buf, count)
+
+/* GCC builtins. */
+#define	strcmp(s1, s2)		__builtin_strcmp(s1, s2)
+#define	strlen(s)		__builtin_strlen(s)
+
+long	syscall6(long number, register_t, register_t, register_t, register_t,
+	    register_t, register_t, ...);
+
+extern int errno;
+
+#endif /* !SRC_TESTS_COMPAT_LINUX_H_LINUX_H_ */
Index: src/tests/compat/linux/h_not_supported.sh
diff -u /dev/null src/tests/compat/linux/h_not_supported.sh:1.1
--- /dev/null	Sat Aug 19 18:56:44 2023
+++ src/tests/compat/linux/h_not_supported.sh	Sat Aug 19 18:56:44 2023
@@ -0,0 +1,33 @@
+# $NetBSD: h_not_supported.sh,v 1.1 2023/08/19 22:56:44 christos Exp $
+#
+# Copyright (c) 2023 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by Theodore Preduta.
+#
+# 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+#/
+
+h_ensure_emul_exists() {
+	atf_skip "Linux emulation tests are not supported on this architecture"
+}
Index: src/tests/compat/linux/t_inotify.sh
diff -u /dev/null src/tests/compat/linux/t_inotify.sh:1.1
--- /dev/null	Sat Aug 19 18:56:44 2023
+++ src/tests/compat/linux/t_inotify.sh	Sat Aug 19 18:56:44 2023
@@ -0,0 +1,79 @@
+# $NetBSD: t_inotify.sh,v 1.1 2023/08/19 22:56:44 christos Exp $
+#
+# Copyright (c) 2023 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by Theodore Preduta.
+#
+# 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+#/
+
+atf_test_case init
+init_head() {
+	atf_set "descr" "Tests inotify_init applies its flags correctly"
+}
+
+init_body() {
+	h_ensure_emul_exists
+	atf_check -s exit:0 "$(atf_get_srcdir)/h_inotify_init"
+}
+
+atf_test_case single_file
+single_file_head() {
+	atf_set "descr" \
+		"Tests correct events are generated when a single file is watched"
+}
+
+single_file_body() {
+	h_ensure_emul_exists
+	atf_check -s exit:0 "$(atf_get_srcdir)/h_inotify_single_file"
+}
+
+atf_test_case directory
+directory_head() {
+	atf_set "descr" \
+		"Tests correct events are generated when a directory is watched"
+}
+
+directory_body() {
+	h_ensure_emul_exists
+	atf_check -s exit:0 "$(atf_get_srcdir)/h_inotify_directory"
+}
+
+atf_test_case watch_change
+watch_change_head() {
+	atf_set "descr" \
+		"Tests the watch descriptor can be modified"
+}
+
+watch_change_body() {
+	h_ensure_emul_exists
+	atf_check -s exit:0 "$(atf_get_srcdir)/h_inotify_watch_change"
+}
+
+atf_init_test_cases() {
+	atf_add_test_case init
+	atf_add_test_case directory
+	atf_add_test_case single_file
+	atf_add_test_case watch_change
+}

Index: src/tests/compat/linux/arch/x86_64/h_syscall.c
diff -u /dev/null src/tests/compat/linux/arch/x86_64/h_syscall.c:1.1
--- /dev/null	Sat Aug 19 18:56:44 2023
+++ src/tests/compat/linux/arch/x86_64/h_syscall.c	Sat Aug 19 18:56:44 2023
@@ -0,0 +1,55 @@
+/*	$NetBSD: h_syscall.c,v 1.1 2023/08/19 22:56:44 christos Exp $	*/
+
+/*-
+ * Copyright (c) 2023 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Theodore Preduta.
+ *
+ * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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/cdefs.h>
+__RCSID("$NetBSD: h_syscall.c,v 1.1 2023/08/19 22:56:44 christos Exp $");
+#include "h_linux.h"
+
+long
+syscall6(long number, register_t arg1, register_t arg2, register_t arg3,
+    register_t arg4, register_t arg5, register_t arg6, ...)
+{
+	long retval;
+	register register_t r10 __asm__ ("r10") = arg4;
+	register register_t r8 __asm__ ("r8") = arg5;
+	register register_t r9 __asm__ ("r9") = arg6;
+
+	__asm__ __volatile__ ("syscall"
+	    : "=a"(retval)
+	    : "a"(number), "D"(arg1), "S"(arg2), "d"(arg3), "r"(r10), "r"(r8), "r"(r9)
+	    : "rcx", "r11", "memory");
+
+	if (retval < 0) {
+		errno = -retval;
+		return -1;
+	}
+
+	return retval;
+}

Reply via email to