xref: /openbsd-src/regress/sys/kern/kqueue/kqueue-fork.c (revision bd35765dfde630203782d36f741b7bde1f9f8a3e)
1*bd35765dSbluhm /*	$OpenBSD: kqueue-fork.c,v 1.3 2016/09/20 23:05:27 bluhm Exp $	*/
25a789c51Sart /*
35a789c51Sart  *	Written by Artur Grabowski <art@openbsd.org> 2002 Public Domain
45a789c51Sart  */
55a789c51Sart 
65a789c51Sart #include <sys/types.h>
75a789c51Sart #include <sys/event.h>
85a789c51Sart #include <sys/wait.h>
95a789c51Sart 
10*bd35765dSbluhm #include <err.h>
11*bd35765dSbluhm #include <stdio.h>
12*bd35765dSbluhm #include <stdlib.h>
13*bd35765dSbluhm #include <unistd.h>
14*bd35765dSbluhm 
15*bd35765dSbluhm #include "main.h"
16db3296cfSderaadt 
175a789c51Sart int
check_inheritance(void)185a789c51Sart check_inheritance(void)
195a789c51Sart {
205a789c51Sart 	int kq, status;
215a789c51Sart 
22*bd35765dSbluhm 	ASS((kq = kqueue()) >= 0,
23*bd35765dSbluhm 	    warn("kqueue"));
245a789c51Sart 
255a789c51Sart 	/*
265a789c51Sart 	 * Check if the kqueue is properly closed on fork().
275a789c51Sart 	 */
285a789c51Sart 
295a789c51Sart 	switch (fork()) {
305a789c51Sart 	case -1:
315a789c51Sart 		err(1, "fork");
325a789c51Sart 	case 0:
335a789c51Sart 		if (close(kq) < 0)
345a789c51Sart 			_exit(0);
355a789c51Sart 		warnx("fork didn't close kqueue");
365a789c51Sart 		_exit(1);
375a789c51Sart 	}
385a789c51Sart 	if (wait(&status) < 0)
395a789c51Sart 		err(1, "wait");
405a789c51Sart 
415a789c51Sart 	if (!WIFEXITED(status))
425a789c51Sart 		errx(1, "child didn't exit?");
435a789c51Sart 
445a789c51Sart 	close(kq);
455a789c51Sart 	return (WEXITSTATUS(status) != 0);
465a789c51Sart }
47