NetBSD re-synchronization of the source tree

This brings our tree to NetBSD 7.0, as found on -current on the
10-10-2015.

This updates:
 - LLVM to 3.6.1
 - GCC to GCC 5.1
 - Replace minix/commands/zdump with usr.bin/zdump
 - external/bsd/libelf has moved to /external/bsd/elftoolchain/
 - Import ctwm
 - Drop sprintf from libminc

Change-Id: I149836ac18e9326be9353958bab9b266efb056f0
This commit is contained in:
2015-10-15 17:01:16 +02:00
parent 8933525b85
commit 0a6a1f1d05
32425 changed files with 2998623 additions and 1342348 deletions

View File

@@ -1,5 +1,6 @@
# $NetBSD: Makefile,v 1.3 2012/11/17 21:55:24 joerg Exp $
# $NetBSD: Makefile,v 1.4 2015/01/14 22:22:32 christos Exp $
WARNS?=6
NOMAN= # defined
.include <bsd.own.mk>
@@ -14,5 +15,6 @@ TESTS_C+= t_proc1
TESTS_C+= t_proc2
TESTS_C+= t_proc3
TESTS_C+= t_sig
TESTS_C+= t_vnode
.include <bsd.test.mk>

View File

@@ -1,4 +1,4 @@
/* $NetBSD: t_ioctl.c,v 1.1 2009/02/20 21:39:57 jmmv Exp $ */
/* $NetBSD: t_ioctl.c,v 1.2 2015/01/14 22:22:32 christos Exp $ */
/*-
* Copyright (c) 2002, 2008 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
__RCSID("$NetBSD: t_ioctl.c,v 1.1 2009/02/20 21:39:57 jmmv Exp $");
__RCSID("$NetBSD: t_ioctl.c,v 1.2 2015/01/14 22:22:32 christos Exp $");
#include <sys/event.h>
#include <sys/ioctl.h>
@@ -53,7 +53,8 @@ ATF_TC_BODY(kfilter_byfilter, tc)
{
char buf[32];
struct kfilter_mapping km;
int i, kq;
int kq;
uint32_t i;
RL(kq = kqueue());

View File

@@ -1,4 +1,4 @@
/* $NetBSD: t_proc1.c,v 1.1 2009/02/20 21:39:57 jmmv Exp $ */
/* $NetBSD: t_proc1.c,v 1.2 2015/01/14 22:22:32 christos Exp $ */
/*-
* Copyright (c) 2002, 2008 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
__RCSID("$NetBSD: t_proc1.c,v 1.1 2009/02/20 21:39:57 jmmv Exp $");
__RCSID("$NetBSD: t_proc1.c,v 1.2 2015/01/14 22:22:32 christos Exp $");
/*
* this also used to trigger problem fixed in
@@ -99,7 +99,8 @@ ATF_TC_BODY(proc1, tc)
{
struct kevent event[1];
pid_t pid;
int kq, want, status;
int kq, status;
u_int want;
RL(kq = kqueue());
@@ -112,7 +113,7 @@ ATF_TC_BODY(proc1, tc)
(void)sleep(1); /* give child some time to come up */
event[0].ident = pid;
event[0].ident = (uintptr_t)pid;
event[0].filter = EVFILT_PROC;
event[0].flags = EV_ADD | EV_ENABLE;
event[0].fflags = NOTE_EXIT | NOTE_FORK | NOTE_EXEC; /* | NOTE_TRACK;*/

View File

@@ -1,4 +1,4 @@
/* $NetBSD: t_proc2.c,v 1.1 2009/02/20 21:39:57 jmmv Exp $ */
/* $NetBSD: t_proc2.c,v 1.2 2015/01/14 22:22:32 christos Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
__RCSID("$NetBSD: t_proc2.c,v 1.1 2009/02/20 21:39:57 jmmv Exp $");
__RCSID("$NetBSD: t_proc2.c,v 1.2 2015/01/14 22:22:32 christos Exp $");
#include <sys/event.h>
#include <sys/time.h>
@@ -106,7 +106,8 @@ ATF_TC_BODY(proc2, tc)
/* NOTREACHED */
}
EV_SET(&ke, pid, EVFILT_PROC, EV_ADD, NOTE_FORK|NOTE_TRACK, 0, 0);
EV_SET(&ke, (uintptr_t)pid, EVFILT_PROC, EV_ADD, NOTE_FORK|NOTE_TRACK,
0, 0);
RL(kevent(kq, &ke, 1, NULL, 0, &timeout));

View File

@@ -1,4 +1,4 @@
/* $NetBSD: t_proc3.c,v 1.1 2012/11/17 21:55:24 joerg Exp $ */
/* $NetBSD: t_proc3.c,v 1.2 2015/01/14 22:22:32 christos Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: t_proc3.c,v 1.1 2012/11/17 21:55:24 joerg Exp $");
__RCSID("$NetBSD: t_proc3.c,v 1.2 2015/01/14 22:22:32 christos Exp $");
#include <sys/event.h>
#include <sys/time.h>
@@ -63,7 +63,7 @@ ATF_TC_BODY(proc3, tc)
RL(kq = kqueue());
EV_SET(&ke, getpid(), EVFILT_PROC, EV_ADD, NOTE_TRACK, 0, 0);
EV_SET(&ke, (uintptr_t)getpid(), EVFILT_PROC, EV_ADD, NOTE_TRACK, 0, 0);
RL(kevent(kq, &ke, 1, NULL, 0, NULL));

View File

@@ -0,0 +1,533 @@
#include <sys/event.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <atf-c.h>
/*
* Test cases for events triggered by manipulating a target directory
* content. Using EVFILT_VNODE filter on the target directory descriptor.
*
*/
static const char *dir_target = "foo";
static const char *dir_inside1 = "foo/bar1";
static const char *dir_inside2 = "foo/bar2";
static const char *dir_outside = "bar";
static const char *file_inside1 = "foo/baz1";
static const char *file_inside2 = "foo/baz2";
static const char *file_outside = "qux";
static const struct timespec ts = {0, 0};
static int kq = -1;
static int target = -1;
int init_target(void);
int init_kqueue(void);
int create_file(const char *);
void cleanup(void);
int
init_target(void)
{
if (mkdir(dir_target, S_IRWXU) < 0) {
return -1;
}
target = open(dir_target, O_RDONLY, 0);
return target;
}
int
init_kqueue(void)
{
struct kevent eventlist[1];
kq = kqueue();
if (kq < 0) {
return -1;
}
EV_SET(&eventlist[0], (uintptr_t)target, EVFILT_VNODE,
EV_ADD | EV_ONESHOT, NOTE_DELETE |
NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB |
NOTE_LINK | NOTE_RENAME | NOTE_REVOKE, 0, 0);
return kevent(kq, eventlist, 1, NULL, 0, NULL);
}
int
create_file(const char *file)
{
int fd;
fd = open(file, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
if (fd < 0) {
return -1;
}
return close(fd);
}
void
cleanup(void)
{
(void)unlink(file_inside1);
(void)unlink(file_inside2);
(void)unlink(file_outside);
(void)rmdir(dir_inside1);
(void)rmdir(dir_inside2);
(void)rmdir(dir_outside);
(void)rmdir(dir_target);
(void)close(kq);
(void)close(target);
}
ATF_TC_WITH_CLEANUP(dir_no_note_link_create_file_in);
ATF_TC_HEAD(dir_no_note_link_create_file_in, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) does not return NOTE_LINK for the directory "
"'foo' if a file 'foo/baz' is created.");
}
ATF_TC_BODY(dir_no_note_link_create_file_in, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(create_file(file_inside1) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, 0);
}
ATF_TC_CLEANUP(dir_no_note_link_create_file_in, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_no_note_link_delete_file_in);
ATF_TC_HEAD(dir_no_note_link_delete_file_in, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) does not return NOTE_LINK for the directory "
"'foo' if a file 'foo/baz' is deleted.");
}
ATF_TC_BODY(dir_no_note_link_delete_file_in, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(create_file(file_inside1) != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(unlink(file_inside1) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, 0);
}
ATF_TC_CLEANUP(dir_no_note_link_delete_file_in, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_no_note_link_mv_dir_within);
ATF_TC_HEAD(dir_no_note_link_mv_dir_within, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) does not return NOTE_LINK for the directory "
"'foo' if a directory 'foo/bar' is renamed to 'foo/baz'.");
}
ATF_TC_BODY(dir_no_note_link_mv_dir_within, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(rename(dir_inside1, dir_inside2) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, 0);
}
ATF_TC_CLEANUP(dir_no_note_link_mv_dir_within, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_no_note_link_mv_file_within);
ATF_TC_HEAD(dir_no_note_link_mv_file_within, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) does not return NOTE_LINK for the directory "
"'foo' if a file 'foo/baz' is renamed to 'foo/qux'.");
}
ATF_TC_BODY(dir_no_note_link_mv_file_within, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(create_file(file_inside1) != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(rename(file_inside1, file_inside2) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, 0);
}
ATF_TC_CLEANUP(dir_no_note_link_mv_file_within, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_note_link_create_dir_in);
ATF_TC_HEAD(dir_note_link_create_dir_in, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) returns NOTE_LINK for the directory "
"'foo' if a directory 'foo/bar' is created.");
}
ATF_TC_BODY(dir_note_link_create_dir_in, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, NOTE_LINK);
}
ATF_TC_CLEANUP(dir_note_link_create_dir_in, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_note_link_delete_dir_in);
ATF_TC_HEAD(dir_note_link_delete_dir_in, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) returns NOTE_LINK for the directory "
"'foo' if a directory 'foo/bar' is deleted.");
}
ATF_TC_BODY(dir_note_link_delete_dir_in, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(rmdir(dir_inside1) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, NOTE_LINK);
}
ATF_TC_CLEANUP(dir_note_link_delete_dir_in, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_note_link_mv_dir_in);
ATF_TC_HEAD(dir_note_link_mv_dir_in, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) returns NOTE_LINK for the directory "
"'foo' if a directory 'bar' is renamed to 'foo/bar'.");
}
ATF_TC_BODY(dir_note_link_mv_dir_in, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(mkdir(dir_outside, S_IRWXU) != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(rename(dir_outside, dir_inside1) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, NOTE_LINK);
}
ATF_TC_CLEANUP(dir_note_link_mv_dir_in, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_note_link_mv_dir_out);
ATF_TC_HEAD(dir_note_link_mv_dir_out, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) returns NOTE_LINK for the directory "
"'foo' if a directory 'foo/bar' is renamed to 'bar'.");
}
ATF_TC_BODY(dir_note_link_mv_dir_out, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(rename(dir_inside1, dir_outside) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_LINK, NOTE_LINK);
}
ATF_TC_CLEANUP(dir_note_link_mv_dir_out, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_note_write_create_dir_in);
ATF_TC_HEAD(dir_note_write_create_dir_in, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) returns NOTE_WRITE for the directory "
"'foo' if a directory 'foo/bar' is created.");
}
ATF_TC_BODY(dir_note_write_create_dir_in, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
}
ATF_TC_CLEANUP(dir_note_write_create_dir_in, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_note_write_create_file_in);
ATF_TC_HEAD(dir_note_write_create_file_in, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) returns NOTE_WRITE for the directory "
"'foo' if a file 'foo/baz' is created.");
}
ATF_TC_BODY(dir_note_write_create_file_in, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(create_file(file_inside1) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
}
ATF_TC_CLEANUP(dir_note_write_create_file_in, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_note_write_delete_dir_in);
ATF_TC_HEAD(dir_note_write_delete_dir_in, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) returns NOTE_WRITE for the directory "
"'foo' if a directory 'foo/bar' is deleted.");
}
ATF_TC_BODY(dir_note_write_delete_dir_in, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(rmdir(dir_inside1) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
}
ATF_TC_CLEANUP(dir_note_write_delete_dir_in, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_note_write_delete_file_in);
ATF_TC_HEAD(dir_note_write_delete_file_in, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) returns NOTE_WRITE for the directory "
"'foo' if a file 'foo/baz' is deleted.");
}
ATF_TC_BODY(dir_note_write_delete_file_in, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(create_file(file_inside1) != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(unlink(file_inside1) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
}
ATF_TC_CLEANUP(dir_note_write_delete_file_in, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_note_write_mv_dir_in);
ATF_TC_HEAD(dir_note_write_mv_dir_in, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) returns NOTE_WRITE for the directory "
"'foo' if a directory 'bar' is renamed to 'foo/bar'.");
}
ATF_TC_BODY(dir_note_write_mv_dir_in, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(mkdir(dir_outside, S_IRWXU) != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(rename(dir_outside, dir_inside1) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
}
ATF_TC_CLEANUP(dir_note_write_mv_dir_in, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_note_write_mv_dir_out);
ATF_TC_HEAD(dir_note_write_mv_dir_out, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) returns NOTE_WRITE for the directory "
"'foo' if a directory 'foo/bar' is renamed to 'bar'.");
}
ATF_TC_BODY(dir_note_write_mv_dir_out, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(rename(dir_inside1, dir_outside) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
}
ATF_TC_CLEANUP(dir_note_write_mv_dir_out, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_note_write_mv_dir_within);
ATF_TC_HEAD(dir_note_write_mv_dir_within, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) returns NOTE_WRITE for the directory "
"'foo' if a directory 'foo/bar' is renamed to 'foo/baz'.");
}
ATF_TC_BODY(dir_note_write_mv_dir_within, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(mkdir(dir_inside1, S_IRWXU) != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(rename(dir_inside1, dir_inside2) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
}
ATF_TC_CLEANUP(dir_note_write_mv_dir_within, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_note_write_mv_file_in);
ATF_TC_HEAD(dir_note_write_mv_file_in, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) returns NOTE_WRITE for the directory "
"'foo' if a file 'qux' is renamed to 'foo/baz'.");
}
ATF_TC_BODY(dir_note_write_mv_file_in, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(create_file(file_outside) != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(rename(file_outside, file_inside1) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
}
ATF_TC_CLEANUP(dir_note_write_mv_file_in, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_note_write_mv_file_out);
ATF_TC_HEAD(dir_note_write_mv_file_out, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) returns NOTE_WRITE for the directory "
"'foo' if a file 'foo/baz' is renamed to 'qux'.");
}
ATF_TC_BODY(dir_note_write_mv_file_out, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(create_file(file_inside1) != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(rename(file_inside1, file_outside) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
}
ATF_TC_CLEANUP(dir_note_write_mv_file_out, tc)
{
cleanup();
}
ATF_TC_WITH_CLEANUP(dir_note_write_mv_file_within);
ATF_TC_HEAD(dir_note_write_mv_file_within, tc)
{
atf_tc_set_md_var(tc, "descr", "This test case ensures "
"that kevent(2) returns NOTE_WRITE for the directory "
"'foo' if a file 'foo/baz' is renamed to 'foo/qux'.");
}
ATF_TC_BODY(dir_note_write_mv_file_within, tc)
{
struct kevent changelist[1];
ATF_REQUIRE(init_target() != -1);
ATF_REQUIRE(create_file(file_inside1) != -1);
ATF_REQUIRE(init_kqueue() != -1);
ATF_REQUIRE(rename(file_inside1, file_inside2) != -1);
ATF_REQUIRE(kevent(kq, NULL, 0, changelist, 1, &ts) != -1);
ATF_CHECK_EQ(changelist[0].fflags & NOTE_WRITE, NOTE_WRITE);
}
ATF_TC_CLEANUP(dir_note_write_mv_file_within, tc)
{
cleanup();
}
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, dir_no_note_link_create_file_in);
ATF_TP_ADD_TC(tp, dir_no_note_link_delete_file_in);
ATF_TP_ADD_TC(tp, dir_no_note_link_mv_dir_within);
ATF_TP_ADD_TC(tp, dir_no_note_link_mv_file_within);
ATF_TP_ADD_TC(tp, dir_note_link_create_dir_in);
ATF_TP_ADD_TC(tp, dir_note_link_delete_dir_in);
ATF_TP_ADD_TC(tp, dir_note_link_mv_dir_in);
ATF_TP_ADD_TC(tp, dir_note_link_mv_dir_out);
ATF_TP_ADD_TC(tp, dir_note_write_create_dir_in);
ATF_TP_ADD_TC(tp, dir_note_write_create_file_in);
ATF_TP_ADD_TC(tp, dir_note_write_delete_dir_in);
ATF_TP_ADD_TC(tp, dir_note_write_delete_file_in);
ATF_TP_ADD_TC(tp, dir_note_write_mv_dir_in);
ATF_TP_ADD_TC(tp, dir_note_write_mv_dir_out);
ATF_TP_ADD_TC(tp, dir_note_write_mv_dir_within);
ATF_TP_ADD_TC(tp, dir_note_write_mv_file_in);
ATF_TP_ADD_TC(tp, dir_note_write_mv_file_out);
ATF_TP_ADD_TC(tp, dir_note_write_mv_file_within);
return atf_no_error();
}