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)185a789c51Sartcheck_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