Sat Nov 17 21:55:24 2012 UTC ()
Unbreak the NOTE_TRACK event of EVFILT_PROC. When attaching to the child
process, proc_find can't be used as the child is still in state SIDL.


(joerg)
diff -r1.504 -r1.505 src/distrib/sets/lists/tests/mi
diff -r1.76 -r1.77 src/sys/kern/kern_event.c
diff -r1.2 -r1.3 src/tests/kernel/kqueue/Makefile
diff -r0 -r1.1 src/tests/kernel/kqueue/t_proc3.c

cvs diff -r1.504 -r1.505 src/distrib/sets/lists/tests/mi (expand / switch to unified diff)

--- src/distrib/sets/lists/tests/mi 2012/11/12 09:03:52 1.504
+++ src/distrib/sets/lists/tests/mi 2012/11/17 21:55:24 1.505
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1# $NetBSD: mi,v 1.504 2012/11/12 09:03:52 njoly Exp $ 1# $NetBSD: mi,v 1.505 2012/11/17 21:55:24 joerg Exp $
2# 2#
3# Note: don't delete entries from here - mark them as "obsolete" instead. 3# Note: don't delete entries from here - mark them as "obsolete" instead.
4# 4#
5./etc/mtree/set.tests tests-sys-root 5./etc/mtree/set.tests tests-sys-root
6./usr/libdata/debug/usr/tests tests-base-debug 6./usr/libdata/debug/usr/tests tests-base-debug
7./usr/libdata/debug/usr/tests/atf tests-atf-debug 7./usr/libdata/debug/usr/tests/atf tests-atf-debug
8./usr/libdata/debug/usr/tests/atf/atf-c tests-atf-debug 8./usr/libdata/debug/usr/tests/atf/atf-c tests-atf-debug
9./usr/libdata/debug/usr/tests/atf/atf-c/atf_c_test.debug tests-atf-debug debug,atf 9./usr/libdata/debug/usr/tests/atf/atf-c/atf_c_test.debug tests-atf-debug debug,atf
10./usr/libdata/debug/usr/tests/atf/atf-c/build_test.debug tests-atf-debug debug,atf 10./usr/libdata/debug/usr/tests/atf/atf-c/build_test.debug tests-atf-debug debug,atf
11./usr/libdata/debug/usr/tests/atf/atf-c/check_test.debug tests-atf-debug debug,atf 11./usr/libdata/debug/usr/tests/atf/atf-c/check_test.debug tests-atf-debug debug,atf
12./usr/libdata/debug/usr/tests/atf/atf-c/config_test.debug tests-atf-debug debug,atf 12./usr/libdata/debug/usr/tests/atf/atf-c/config_test.debug tests-atf-debug debug,atf
13./usr/libdata/debug/usr/tests/atf/atf-c/detail tests-atf-debug 13./usr/libdata/debug/usr/tests/atf/atf-c/detail tests-atf-debug
14./usr/libdata/debug/usr/tests/atf/atf-c/detail/dynstr_test.debug tests-atf-debug debug,atf 14./usr/libdata/debug/usr/tests/atf/atf-c/detail/dynstr_test.debug tests-atf-debug debug,atf
@@ -311,26 +311,27 @@ @@ -311,26 +311,27 @@
311./usr/libdata/debug/usr/tests/kernel tests-kernel-tests 311./usr/libdata/debug/usr/tests/kernel tests-kernel-tests
312./usr/libdata/debug/usr/tests/kernel/h_ps_strings1.debug tests-kernel-tests debug,atf 312./usr/libdata/debug/usr/tests/kernel/h_ps_strings1.debug tests-kernel-tests debug,atf
313./usr/libdata/debug/usr/tests/kernel/h_ps_strings2.debug tests-kernel-tests debug,atf 313./usr/libdata/debug/usr/tests/kernel/h_ps_strings2.debug tests-kernel-tests debug,atf
314./usr/libdata/debug/usr/tests/kernel/kqueue tests-kernel-tests 314./usr/libdata/debug/usr/tests/kernel/kqueue tests-kernel-tests
315./usr/libdata/debug/usr/tests/kernel/kqueue/read tests-kernel-tests 315./usr/libdata/debug/usr/tests/kernel/kqueue/read tests-kernel-tests
316./usr/libdata/debug/usr/tests/kernel/kqueue/read/t_fifo.debug tests-kernel-tests debug,atf 316./usr/libdata/debug/usr/tests/kernel/kqueue/read/t_fifo.debug tests-kernel-tests debug,atf
317./usr/libdata/debug/usr/tests/kernel/kqueue/read/t_file.debug tests-kernel-tests debug,atf 317./usr/libdata/debug/usr/tests/kernel/kqueue/read/t_file.debug tests-kernel-tests debug,atf
318./usr/libdata/debug/usr/tests/kernel/kqueue/read/t_file2.debug tests-kernel-tests debug,atf 318./usr/libdata/debug/usr/tests/kernel/kqueue/read/t_file2.debug tests-kernel-tests debug,atf
319./usr/libdata/debug/usr/tests/kernel/kqueue/read/t_pipe.debug tests-kernel-tests debug,atf 319./usr/libdata/debug/usr/tests/kernel/kqueue/read/t_pipe.debug tests-kernel-tests debug,atf
320./usr/libdata/debug/usr/tests/kernel/kqueue/read/t_ttypty.debug tests-kernel-tests debug,atf 320./usr/libdata/debug/usr/tests/kernel/kqueue/read/t_ttypty.debug tests-kernel-tests debug,atf
321./usr/libdata/debug/usr/tests/kernel/kqueue/t_ioctl.debug tests-kernel-tests debug,atf 321./usr/libdata/debug/usr/tests/kernel/kqueue/t_ioctl.debug tests-kernel-tests debug,atf
322./usr/libdata/debug/usr/tests/kernel/kqueue/t_proc1.debug tests-kernel-tests debug,atf 322./usr/libdata/debug/usr/tests/kernel/kqueue/t_proc1.debug tests-kernel-tests debug,atf
323./usr/libdata/debug/usr/tests/kernel/kqueue/t_proc2.debug tests-kernel-tests debug,atf 323./usr/libdata/debug/usr/tests/kernel/kqueue/t_proc2.debug tests-kernel-tests debug,atf
 324./usr/libdata/debug/usr/tests/kernel/kqueue/t_proc3.debug tests-kernel-tests debug,atf
324./usr/libdata/debug/usr/tests/kernel/kqueue/t_sig.debug tests-kernel-tests debug,atf 325./usr/libdata/debug/usr/tests/kernel/kqueue/t_sig.debug tests-kernel-tests debug,atf
325./usr/libdata/debug/usr/tests/kernel/kqueue/write tests-kernel-tests 326./usr/libdata/debug/usr/tests/kernel/kqueue/write tests-kernel-tests
326./usr/libdata/debug/usr/tests/kernel/kqueue/write/t_fifo.debug tests-kernel-tests debug,atf 327./usr/libdata/debug/usr/tests/kernel/kqueue/write/t_fifo.debug tests-kernel-tests debug,atf
327./usr/libdata/debug/usr/tests/kernel/kqueue/write/t_pipe.debug tests-kernel-tests debug,atf 328./usr/libdata/debug/usr/tests/kernel/kqueue/write/t_pipe.debug tests-kernel-tests debug,atf
328./usr/libdata/debug/usr/tests/kernel/kqueue/write/t_ttypty.debug tests-kernel-tests debug,atf 329./usr/libdata/debug/usr/tests/kernel/kqueue/write/t_ttypty.debug tests-kernel-tests debug,atf
329./usr/libdata/debug/usr/tests/kernel/posix_spawn tests-kernel-tests obsolete 330./usr/libdata/debug/usr/tests/kernel/posix_spawn tests-kernel-tests obsolete
330./usr/libdata/debug/usr/tests/kernel/posix_spawn/t_spawn.debug tests-kernel-tests obsolete 331./usr/libdata/debug/usr/tests/kernel/posix_spawn/t_spawn.debug tests-kernel-tests obsolete
331./usr/libdata/debug/usr/tests/kernel/posix_spawn/t_spawnattr.debug tests-kernel-tests obsolete 332./usr/libdata/debug/usr/tests/kernel/posix_spawn/t_spawnattr.debug tests-kernel-tests obsolete
332./usr/libdata/debug/usr/tests/kernel/posix_spawn/t_fileactions.debug tests-kernel-tests obsolete 333./usr/libdata/debug/usr/tests/kernel/posix_spawn/t_fileactions.debug tests-kernel-tests obsolete
333./usr/libdata/debug/usr/tests/kernel/posix_spawn/h_spawn.debug tests-kernel-tests obsolete 334./usr/libdata/debug/usr/tests/kernel/posix_spawn/h_spawn.debug tests-kernel-tests obsolete
334./usr/libdata/debug/usr/tests/kernel/posix_spawn/h_fileactions.debug tests-kernel-tests obsolete 335./usr/libdata/debug/usr/tests/kernel/posix_spawn/h_fileactions.debug tests-kernel-tests obsolete
335./usr/libdata/debug/usr/tests/kernel/posix_spawn/h_spawnattr.debug tests-kernel-tests obsolete 336./usr/libdata/debug/usr/tests/kernel/posix_spawn/h_spawnattr.debug tests-kernel-tests obsolete
336./usr/libdata/debug/usr/tests/kernel/t_extattrctl.debug tests-kernel-tests debug,atf,rump 337./usr/libdata/debug/usr/tests/kernel/t_extattrctl.debug tests-kernel-tests debug,atf,rump
@@ -2131,26 +2132,27 @@ @@ -2131,26 +2132,27 @@
2131./usr/tests/kernel/h_ps_strings2 tests-kernel-tests atf 2132./usr/tests/kernel/h_ps_strings2 tests-kernel-tests atf
2132./usr/tests/kernel/kqueue tests-kernel-tests 2133./usr/tests/kernel/kqueue tests-kernel-tests
2133./usr/tests/kernel/kqueue/Atffile tests-kernel-tests atf 2134./usr/tests/kernel/kqueue/Atffile tests-kernel-tests atf
2134./usr/tests/kernel/kqueue/read tests-kernel-tests 2135./usr/tests/kernel/kqueue/read tests-kernel-tests
2135./usr/tests/kernel/kqueue/read/Atffile tests-kernel-tests atf 2136./usr/tests/kernel/kqueue/read/Atffile tests-kernel-tests atf
2136./usr/tests/kernel/kqueue/read/t_fifo tests-kernel-tests atf 2137./usr/tests/kernel/kqueue/read/t_fifo tests-kernel-tests atf
2137./usr/tests/kernel/kqueue/read/t_file tests-kernel-tests atf 2138./usr/tests/kernel/kqueue/read/t_file tests-kernel-tests atf
2138./usr/tests/kernel/kqueue/read/t_file2 tests-kernel-tests atf 2139./usr/tests/kernel/kqueue/read/t_file2 tests-kernel-tests atf
2139./usr/tests/kernel/kqueue/read/t_pipe tests-kernel-tests atf 2140./usr/tests/kernel/kqueue/read/t_pipe tests-kernel-tests atf
2140./usr/tests/kernel/kqueue/read/t_ttypty tests-kernel-tests atf 2141./usr/tests/kernel/kqueue/read/t_ttypty tests-kernel-tests atf
2141./usr/tests/kernel/kqueue/t_ioctl tests-kernel-tests atf 2142./usr/tests/kernel/kqueue/t_ioctl tests-kernel-tests atf
2142./usr/tests/kernel/kqueue/t_proc1 tests-kernel-tests atf 2143./usr/tests/kernel/kqueue/t_proc1 tests-kernel-tests atf
2143./usr/tests/kernel/kqueue/t_proc2 tests-kernel-tests atf 2144./usr/tests/kernel/kqueue/t_proc2 tests-kernel-tests atf
 2145./usr/tests/kernel/kqueue/t_proc3 tests-kernel-tests atf
2144./usr/tests/kernel/kqueue/t_sig tests-kernel-tests atf 2146./usr/tests/kernel/kqueue/t_sig tests-kernel-tests atf
2145./usr/tests/kernel/kqueue/write tests-kernel-tests 2147./usr/tests/kernel/kqueue/write tests-kernel-tests
2146./usr/tests/kernel/kqueue/write/Atffile tests-kernel-tests atf 2148./usr/tests/kernel/kqueue/write/Atffile tests-kernel-tests atf
2147./usr/tests/kernel/kqueue/write/t_fifo tests-kernel-tests atf 2149./usr/tests/kernel/kqueue/write/t_fifo tests-kernel-tests atf
2148./usr/tests/kernel/kqueue/write/t_pipe tests-kernel-tests atf 2150./usr/tests/kernel/kqueue/write/t_pipe tests-kernel-tests atf
2149./usr/tests/kernel/kqueue/write/t_ttypty tests-kernel-tests atf 2151./usr/tests/kernel/kqueue/write/t_ttypty tests-kernel-tests atf
2150./usr/tests/kernel/posix_spawn tests-kernel-tests obsolete 2152./usr/tests/kernel/posix_spawn tests-kernel-tests obsolete
2151./usr/tests/kernel/posix_spawn/Atffile tests-kernel-tests obsolete 2153./usr/tests/kernel/posix_spawn/Atffile tests-kernel-tests obsolete
2152./usr/tests/kernel/posix_spawn/t_spawn tests-kernel-tests obsolete 2154./usr/tests/kernel/posix_spawn/t_spawn tests-kernel-tests obsolete
2153./usr/tests/kernel/posix_spawn/t_spawnattr tests-kernel-tests obsolete 2155./usr/tests/kernel/posix_spawn/t_spawnattr tests-kernel-tests obsolete
2154./usr/tests/kernel/posix_spawn/t_fileactions tests-kernel-tests obsolete 2156./usr/tests/kernel/posix_spawn/t_fileactions tests-kernel-tests obsolete
2155./usr/tests/kernel/posix_spawn/h_spawn tests-kernel-tests obsolete 2157./usr/tests/kernel/posix_spawn/h_spawn tests-kernel-tests obsolete
2156./usr/tests/kernel/posix_spawn/h_spawnattr tests-kernel-tests obsolete 2158./usr/tests/kernel/posix_spawn/h_spawnattr tests-kernel-tests obsolete

cvs diff -r1.76 -r1.77 src/sys/kern/kern_event.c (expand / switch to unified diff)

--- src/sys/kern/kern_event.c 2012/06/02 15:54:02 1.76
+++ src/sys/kern/kern_event.c 2012/11/17 21:55:24 1.77
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: kern_event.c,v 1.76 2012/06/02 15:54:02 martin Exp $ */ 1/* $NetBSD: kern_event.c,v 1.77 2012/11/17 21:55:24 joerg Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. 4 * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * This code is derived from software contributed to The NetBSD Foundation 7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Andrew Doran. 8 * by Andrew Doran.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions 11 * modification, are permitted provided that the following conditions
12 * are met: 12 * are met:
13 * 1. Redistributions of source code must retain the above copyright 13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer. 14 * notice, this list of conditions and the following disclaimer.
@@ -48,27 +48,27 @@ @@ -48,27 +48,27 @@
48 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 48 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
55 * SUCH DAMAGE. 55 * SUCH DAMAGE.
56 * 56 *
57 * FreeBSD: src/sys/kern/kern_event.c,v 1.27 2001/07/05 17:10:44 rwatson Exp 57 * FreeBSD: src/sys/kern/kern_event.c,v 1.27 2001/07/05 17:10:44 rwatson Exp
58 */ 58 */
59 59
60#include <sys/cdefs.h> 60#include <sys/cdefs.h>
61__KERNEL_RCSID(0, "$NetBSD: kern_event.c,v 1.76 2012/06/02 15:54:02 martin Exp $"); 61__KERNEL_RCSID(0, "$NetBSD: kern_event.c,v 1.77 2012/11/17 21:55:24 joerg Exp $");
62 62
63#include <sys/param.h> 63#include <sys/param.h>
64#include <sys/systm.h> 64#include <sys/systm.h>
65#include <sys/kernel.h> 65#include <sys/kernel.h>
66#include <sys/proc.h> 66#include <sys/proc.h>
67#include <sys/file.h> 67#include <sys/file.h>
68#include <sys/select.h> 68#include <sys/select.h>
69#include <sys/queue.h> 69#include <sys/queue.h>
70#include <sys/event.h> 70#include <sys/event.h>
71#include <sys/eventvar.h> 71#include <sys/eventvar.h>
72#include <sys/poll.h> 72#include <sys/poll.h>
73#include <sys/kmem.h> 73#include <sys/kmem.h>
74#include <sys/stat.h> 74#include <sys/stat.h>
@@ -447,27 +447,39 @@ filt_kqueue(struct knote *kn, long hint) @@ -447,27 +447,39 @@ filt_kqueue(struct knote *kn, long hint)
447/* 447/*
448 * Filter attach method for EVFILT_PROC. 448 * Filter attach method for EVFILT_PROC.
449 */ 449 */
450static int 450static int
451filt_procattach(struct knote *kn) 451filt_procattach(struct knote *kn)
452{ 452{
453 struct proc *p, *curp; 453 struct proc *p, *curp;
454 struct lwp *curl; 454 struct lwp *curl;
455 455
456 curl = curlwp; 456 curl = curlwp;
457 curp = curl->l_proc; 457 curp = curl->l_proc;
458 458
459 mutex_enter(proc_lock); 459 mutex_enter(proc_lock);
460 p = proc_find(kn->kn_id); 460 if (kn->kn_flags & EV_FLAG1) {
 461 /*
 462 * NOTE_TRACK attaches to the child process too early
 463 * for proc_find, so do a raw look up and check the state
 464 * explicitly.
 465 */
 466 p = proc_find_raw(kn->kn_id);
 467 if (p != NULL && p->p_stat != SIDL)
 468 p = NULL;
 469 } else {
 470 p = proc_find(kn->kn_id);
 471 }
 472
461 if (p == NULL) { 473 if (p == NULL) {
462 mutex_exit(proc_lock); 474 mutex_exit(proc_lock);
463 return ESRCH; 475 return ESRCH;
464 } 476 }
465 477
466 /* 478 /*
467 * Fail if it's not owned by you, or the last exec gave us 479 * Fail if it's not owned by you, or the last exec gave us
468 * setuid/setgid privs (unless you're root). 480 * setuid/setgid privs (unless you're root).
469 */ 481 */
470 mutex_enter(p->p_lock); 482 mutex_enter(p->p_lock);
471 mutex_exit(proc_lock); 483 mutex_exit(proc_lock);
472 if (kauth_authorize_process(curl->l_cred, KAUTH_PROCESS_KEVENT_FILTER, 484 if (kauth_authorize_process(curl->l_cred, KAUTH_PROCESS_KEVENT_FILTER,
473 p, NULL, NULL, NULL) != 0) { 485 p, NULL, NULL, NULL) != 0) {

cvs diff -r1.2 -r1.3 src/tests/kernel/kqueue/Makefile (expand / switch to unified diff)

--- src/tests/kernel/kqueue/Makefile 2010/07/13 21:13:25 1.2
+++ src/tests/kernel/kqueue/Makefile 2012/11/17 21:55:24 1.3
@@ -1,17 +1,18 @@ @@ -1,17 +1,18 @@
1# $NetBSD: Makefile,v 1.2 2010/07/13 21:13:25 jmmv Exp $ 1# $NetBSD: Makefile,v 1.3 2012/11/17 21:55:24 joerg Exp $
2 2
3NOMAN= # defined 3NOMAN= # defined
4 4
5.include <bsd.own.mk> 5.include <bsd.own.mk>
6 6
7TESTSDIR= ${TESTSBASE}/kernel/kqueue 7TESTSDIR= ${TESTSBASE}/kernel/kqueue
8 8
9TESTS_SUBDIRS= read 9TESTS_SUBDIRS= read
10TESTS_SUBDIRS+= write 10TESTS_SUBDIRS+= write
11 11
12TESTS_C= t_ioctl 12TESTS_C= t_ioctl
13TESTS_C+= t_proc1 13TESTS_C+= t_proc1
14TESTS_C+= t_proc2 14TESTS_C+= t_proc2
 15TESTS_C+= t_proc3
15TESTS_C+= t_sig 16TESTS_C+= t_sig
16 17
17.include <bsd.test.mk> 18.include <bsd.test.mk>

File Added: src/tests/kernel/kqueue/t_proc3.c
/* $NetBSD: t_proc3.c,v 1.1 2012/11/17 21:55:24 joerg Exp $ */

/*-
 * Copyright (c) 2012 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Joerg Sonnenberger.
 *
 * 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: t_proc3.c,v 1.1 2012/11/17 21:55:24 joerg Exp $");

#include <sys/event.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>

#include <err.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <atf-c.h>

#include "../../h_macros.h"

ATF_TC(proc3);
ATF_TC_HEAD(proc3, tc)
{
	atf_tc_set_md_var(tc, "descr",
	    "Checks EVFILT_PROC for NOTE_TRACK on self bug ");
}

ATF_TC_BODY(proc3, tc)
{
	pid_t pid = 0;
	int kq, status;
	struct kevent ke;
	struct timespec timeout;

	RL(kq = kqueue());

	EV_SET(&ke, getpid(), EVFILT_PROC, EV_ADD, NOTE_TRACK, 0, 0);

	RL(kevent(kq, &ke, 1, NULL, 0, NULL));

	RL(pid = fork());
	if (pid == 0) {
		_exit(EXIT_SUCCESS);
		/* NOTREACHED */
	}

	RL(waitpid(pid, &status, 0));
	ATF_REQUIRE(WIFEXITED(status));
	ATF_REQUIRE_EQ(WEXITSTATUS(status), EXIT_SUCCESS);

	timeout.tv_sec = 0;
	timeout.tv_nsec = 0;
	ke.ident = 0;
	ke.fflags = 0;
	ke.flags = EV_ENABLE;

	RL(kevent(kq, NULL, 0, &ke, 1, &timeout));
	RL(close(kq));

	ATF_REQUIRE(ke.fflags & NOTE_CHILD);
	ATF_REQUIRE((ke.fflags & NOTE_TRACKERR) == 0);
	ATF_REQUIRE_EQ((pid_t)ke.ident, pid);
}

ATF_TP_ADD_TCS(tp)
{
	ATF_TP_ADD_TC(tp, proc3);

	return atf_no_error();
}