xref: /freebsd/tests/sys/audit/file-attribute-modify.c (revision 55cd45239691eb6657319412187ea98151fa9012)
16d203d2dSAlan Somers /*-
26d203d2dSAlan Somers  * Copyright (c) 2018 Aniket Pandey
36d203d2dSAlan Somers  *
46d203d2dSAlan Somers  * Redistribution and use in source and binary forms, with or without
56d203d2dSAlan Somers  * modification, are permitted provided that the following conditions
66d203d2dSAlan Somers  * are met:
76d203d2dSAlan Somers  * 1. Redistributions of source code must retain the above copyright
86d203d2dSAlan Somers  *    notice, this list of conditions and the following disclaimer.
96d203d2dSAlan Somers  * 2. Redistributions in binary form must reproduce the above copyright
106d203d2dSAlan Somers  *    notice, this list of conditions and the following disclaimer in the
116d203d2dSAlan Somers  *    documentation and/or other materials provided with the distribution.
126d203d2dSAlan Somers  *
136d203d2dSAlan Somers  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
146d203d2dSAlan Somers  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
156d203d2dSAlan Somers  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
166d203d2dSAlan Somers  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
176d203d2dSAlan Somers  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
186d203d2dSAlan Somers  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
196d203d2dSAlan Somers  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
206d203d2dSAlan Somers  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
216d203d2dSAlan Somers  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
226d203d2dSAlan Somers  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
236d203d2dSAlan Somers  * SUCH DAMAGE.
246d203d2dSAlan Somers  *
256d203d2dSAlan Somers  * $FreeBSD$
266d203d2dSAlan Somers  */
276d203d2dSAlan Somers 
28844fc5ebSAlan Somers #include <sys/types.h>
29844fc5ebSAlan Somers #include <sys/extattr.h>
306d203d2dSAlan Somers #include <sys/file.h>
31d1fb351cSAlan Somers #include <sys/mman.h>
3228845213SAlan Somers #include <sys/stat.h>
33d1fb351cSAlan Somers #include <sys/time.h>
346d203d2dSAlan Somers 
356d203d2dSAlan Somers #include <atf-c.h>
366d203d2dSAlan Somers #include <fcntl.h>
37d1fb351cSAlan Somers #include <stdint.h>
386d203d2dSAlan Somers #include <unistd.h>
396d203d2dSAlan Somers 
406d203d2dSAlan Somers #include "utils.h"
416d203d2dSAlan Somers 
426d203d2dSAlan Somers static pid_t pid;
435c9a4738SAlan Somers static uid_t uid = -1;
445c9a4738SAlan Somers static gid_t gid = -1;
45844fc5ebSAlan Somers static int filedesc, retval;
466d203d2dSAlan Somers static struct pollfd fds[1];
476d203d2dSAlan Somers static mode_t mode = 0777;
486d203d2dSAlan Somers static char extregex[80];
495641c23fSAlan Somers static char buff[] = "ezio";
506d203d2dSAlan Somers static const char *auclass = "fm";
51844fc5ebSAlan Somers static const char *name = "authorname";
526d203d2dSAlan Somers static const char *path = "fileforaudit";
5328845213SAlan Somers static const char *errpath = "adirhasnoname/fileforaudit";
5428845213SAlan Somers static const char *successreg = "fileforaudit.*return,success";
5528845213SAlan Somers static const char *failurereg = "fileforaudit.*return,failure";
566d203d2dSAlan Somers 
576d203d2dSAlan Somers 
586d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(flock_success);
596d203d2dSAlan Somers ATF_TC_HEAD(flock_success, tc)
606d203d2dSAlan Somers {
616d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
626d203d2dSAlan Somers 					"flock(2) call");
636d203d2dSAlan Somers }
646d203d2dSAlan Somers 
656d203d2dSAlan Somers ATF_TC_BODY(flock_success, tc)
666d203d2dSAlan Somers {
676d203d2dSAlan Somers 	pid = getpid();
686d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex), "flock.*%d.*return,success", pid);
696d203d2dSAlan Somers 
706d203d2dSAlan Somers 	/* File needs to exist to call flock(2) */
716d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
726d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
736d203d2dSAlan Somers 	ATF_REQUIRE_EQ(0, flock(filedesc, LOCK_SH));
746d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
756d203d2dSAlan Somers 	close(filedesc);
766d203d2dSAlan Somers }
776d203d2dSAlan Somers 
786d203d2dSAlan Somers ATF_TC_CLEANUP(flock_success, tc)
796d203d2dSAlan Somers {
806d203d2dSAlan Somers 	cleanup();
816d203d2dSAlan Somers }
826d203d2dSAlan Somers 
836d203d2dSAlan Somers 
846d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(flock_failure);
856d203d2dSAlan Somers ATF_TC_HEAD(flock_failure, tc)
866d203d2dSAlan Somers {
876d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
886d203d2dSAlan Somers 					"flock(2) call");
896d203d2dSAlan Somers }
906d203d2dSAlan Somers 
916d203d2dSAlan Somers ATF_TC_BODY(flock_failure, tc)
926d203d2dSAlan Somers {
936d203d2dSAlan Somers 	const char *regex = "flock.*return,failure : Bad file descriptor";
946d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
956d203d2dSAlan Somers 	ATF_REQUIRE_EQ(-1, flock(-1, LOCK_SH));
966d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
976d203d2dSAlan Somers }
986d203d2dSAlan Somers 
996d203d2dSAlan Somers ATF_TC_CLEANUP(flock_failure, tc)
1006d203d2dSAlan Somers {
1016d203d2dSAlan Somers 	cleanup();
1026d203d2dSAlan Somers }
1036d203d2dSAlan Somers 
1046d203d2dSAlan Somers 
1056d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fcntl_success);
1066d203d2dSAlan Somers ATF_TC_HEAD(fcntl_success, tc)
1076d203d2dSAlan Somers {
1086d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1096d203d2dSAlan Somers 					"fcntl(2) call");
1106d203d2dSAlan Somers }
1116d203d2dSAlan Somers 
1126d203d2dSAlan Somers ATF_TC_BODY(fcntl_success, tc)
1136d203d2dSAlan Somers {
1146d203d2dSAlan Somers 	int flagstatus;
1156d203d2dSAlan Somers 	/* File needs to exist to call fcntl(2) */
1166d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1176d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1186d203d2dSAlan Somers 
1196d203d2dSAlan Somers 	/* Retrieve the status flags of 'filedesc' and store it in flagstatus */
1206d203d2dSAlan Somers 	ATF_REQUIRE((flagstatus = fcntl(filedesc, F_GETFL, 0)) != -1);
1216d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex),
1226d203d2dSAlan Somers 			"fcntl.*return,success,%d", flagstatus);
1236d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
1246d203d2dSAlan Somers 	close(filedesc);
1256d203d2dSAlan Somers }
1266d203d2dSAlan Somers 
1276d203d2dSAlan Somers ATF_TC_CLEANUP(fcntl_success, tc)
1286d203d2dSAlan Somers {
1296d203d2dSAlan Somers 	cleanup();
1306d203d2dSAlan Somers }
1316d203d2dSAlan Somers 
1326d203d2dSAlan Somers 
1336d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fcntl_failure);
1346d203d2dSAlan Somers ATF_TC_HEAD(fcntl_failure, tc)
1356d203d2dSAlan Somers {
1366d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1376d203d2dSAlan Somers 					"fcntl(2) call");
1386d203d2dSAlan Somers }
1396d203d2dSAlan Somers 
1406d203d2dSAlan Somers ATF_TC_BODY(fcntl_failure, tc)
1416d203d2dSAlan Somers {
1426d203d2dSAlan Somers 	const char *regex = "fcntl.*return,failure : Bad file descriptor";
1436d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1446d203d2dSAlan Somers 	ATF_REQUIRE_EQ(-1, fcntl(-1, F_GETFL, 0));
1456d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
1466d203d2dSAlan Somers }
1476d203d2dSAlan Somers 
1486d203d2dSAlan Somers ATF_TC_CLEANUP(fcntl_failure, tc)
1496d203d2dSAlan Somers {
1506d203d2dSAlan Somers 	cleanup();
1516d203d2dSAlan Somers }
1526d203d2dSAlan Somers 
1536d203d2dSAlan Somers 
1546d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fsync_success);
1556d203d2dSAlan Somers ATF_TC_HEAD(fsync_success, tc)
1566d203d2dSAlan Somers {
1576d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1586d203d2dSAlan Somers 					"fsync(2) call");
1596d203d2dSAlan Somers }
1606d203d2dSAlan Somers 
1616d203d2dSAlan Somers ATF_TC_BODY(fsync_success, tc)
1626d203d2dSAlan Somers {
1636d203d2dSAlan Somers 	pid = getpid();
1646d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex), "fsync.*%d.*return,success", pid);
1656d203d2dSAlan Somers 
1666d203d2dSAlan Somers 	/* File needs to exist to call fsync(2) */
1676d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1686d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1696d203d2dSAlan Somers 	ATF_REQUIRE_EQ(0, fsync(filedesc));
1706d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
1716d203d2dSAlan Somers 	close(filedesc);
1726d203d2dSAlan Somers }
1736d203d2dSAlan Somers 
1746d203d2dSAlan Somers ATF_TC_CLEANUP(fsync_success, tc)
1756d203d2dSAlan Somers {
1766d203d2dSAlan Somers 	cleanup();
1776d203d2dSAlan Somers }
1786d203d2dSAlan Somers 
1796d203d2dSAlan Somers 
1806d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fsync_failure);
1816d203d2dSAlan Somers ATF_TC_HEAD(fsync_failure, tc)
1826d203d2dSAlan Somers {
1836d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1846d203d2dSAlan Somers 					"fsync(2) call");
1856d203d2dSAlan Somers }
1866d203d2dSAlan Somers 
1876d203d2dSAlan Somers ATF_TC_BODY(fsync_failure, tc)
1886d203d2dSAlan Somers {
1896d203d2dSAlan Somers 	const char *regex = "fsync.*return,failure : Bad file descriptor";
1906d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1916d203d2dSAlan Somers 	/* Failure reason: Invalid file descriptor */
1926d203d2dSAlan Somers 	ATF_REQUIRE_EQ(-1, fsync(-1));
1936d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
1946d203d2dSAlan Somers }
1956d203d2dSAlan Somers 
1966d203d2dSAlan Somers ATF_TC_CLEANUP(fsync_failure, tc)
1976d203d2dSAlan Somers {
1986d203d2dSAlan Somers 	cleanup();
1996d203d2dSAlan Somers }
2006d203d2dSAlan Somers 
2016d203d2dSAlan Somers 
20228845213SAlan Somers ATF_TC_WITH_CLEANUP(chmod_success);
20328845213SAlan Somers ATF_TC_HEAD(chmod_success, tc)
20428845213SAlan Somers {
20528845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
20628845213SAlan Somers 					"chmod(2) call");
20728845213SAlan Somers }
20828845213SAlan Somers 
20928845213SAlan Somers ATF_TC_BODY(chmod_success, tc)
21028845213SAlan Somers {
21128845213SAlan Somers 	/* File needs to exist to call chmod(2) */
21228845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
21328845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
21428845213SAlan Somers 	ATF_REQUIRE_EQ(0, chmod(path, mode));
21528845213SAlan Somers 	check_audit(fds, successreg, pipefd);
21628845213SAlan Somers 	close(filedesc);
21728845213SAlan Somers }
21828845213SAlan Somers 
21928845213SAlan Somers ATF_TC_CLEANUP(chmod_success, tc)
22028845213SAlan Somers {
22128845213SAlan Somers 	cleanup();
22228845213SAlan Somers }
22328845213SAlan Somers 
22428845213SAlan Somers 
22528845213SAlan Somers ATF_TC_WITH_CLEANUP(chmod_failure);
22628845213SAlan Somers ATF_TC_HEAD(chmod_failure, tc)
22728845213SAlan Somers {
22828845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
22928845213SAlan Somers 					"chmod(2) call");
23028845213SAlan Somers }
23128845213SAlan Somers 
23228845213SAlan Somers ATF_TC_BODY(chmod_failure, tc)
23328845213SAlan Somers {
23428845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
23528845213SAlan Somers 	/* Failure reason: file does not exist */
23628845213SAlan Somers 	ATF_REQUIRE_EQ(-1, chmod(errpath, mode));
23728845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
23828845213SAlan Somers }
23928845213SAlan Somers 
24028845213SAlan Somers ATF_TC_CLEANUP(chmod_failure, tc)
24128845213SAlan Somers {
24228845213SAlan Somers 	cleanup();
24328845213SAlan Somers }
24428845213SAlan Somers 
24528845213SAlan Somers 
24628845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmod_success);
24728845213SAlan Somers ATF_TC_HEAD(fchmod_success, tc)
24828845213SAlan Somers {
24928845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
25028845213SAlan Somers 					"fchmod(2) call");
25128845213SAlan Somers }
25228845213SAlan Somers 
25328845213SAlan Somers ATF_TC_BODY(fchmod_success, tc)
25428845213SAlan Somers {
25528845213SAlan Somers 	pid = getpid();
25628845213SAlan Somers 	snprintf(extregex, sizeof(extregex), "fchmod.*%d.*return,success", pid);
25728845213SAlan Somers 
25828845213SAlan Somers 	/* File needs to exist to call fchmod(2) */
25928845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
26028845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
26128845213SAlan Somers 	ATF_REQUIRE_EQ(0, fchmod(filedesc, mode));
26228845213SAlan Somers 	check_audit(fds, extregex, pipefd);
26328845213SAlan Somers 	close(filedesc);
26428845213SAlan Somers }
26528845213SAlan Somers 
26628845213SAlan Somers ATF_TC_CLEANUP(fchmod_success, tc)
26728845213SAlan Somers {
26828845213SAlan Somers 	cleanup();
26928845213SAlan Somers }
27028845213SAlan Somers 
27128845213SAlan Somers 
27228845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmod_failure);
27328845213SAlan Somers ATF_TC_HEAD(fchmod_failure, tc)
27428845213SAlan Somers {
27528845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
27628845213SAlan Somers 					"fchmod(2) call");
27728845213SAlan Somers }
27828845213SAlan Somers 
27928845213SAlan Somers ATF_TC_BODY(fchmod_failure, tc)
28028845213SAlan Somers {
28128845213SAlan Somers 	const char *regex = "fchmod.*return,failure : Bad file descriptor";
28228845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
28328845213SAlan Somers 	/* Failure reason: Invalid file descriptor */
28428845213SAlan Somers 	ATF_REQUIRE_EQ(-1, fchmod(-1, mode));
28528845213SAlan Somers 	check_audit(fds, regex, pipefd);
28628845213SAlan Somers }
28728845213SAlan Somers 
28828845213SAlan Somers ATF_TC_CLEANUP(fchmod_failure, tc)
28928845213SAlan Somers {
29028845213SAlan Somers 	cleanup();
29128845213SAlan Somers }
29228845213SAlan Somers 
29328845213SAlan Somers 
29428845213SAlan Somers ATF_TC_WITH_CLEANUP(lchmod_success);
29528845213SAlan Somers ATF_TC_HEAD(lchmod_success, tc)
29628845213SAlan Somers {
29728845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
29828845213SAlan Somers 					"lchmod(2) call");
29928845213SAlan Somers }
30028845213SAlan Somers 
30128845213SAlan Somers ATF_TC_BODY(lchmod_success, tc)
30228845213SAlan Somers {
30328845213SAlan Somers 	/* Symbolic link needs to exist to call lchmod(2) */
30428845213SAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
30528845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
30628845213SAlan Somers 	ATF_REQUIRE_EQ(0, lchmod(path, mode));
30728845213SAlan Somers 	check_audit(fds, successreg, pipefd);
30828845213SAlan Somers }
30928845213SAlan Somers 
31028845213SAlan Somers ATF_TC_CLEANUP(lchmod_success, tc)
31128845213SAlan Somers {
31228845213SAlan Somers 	cleanup();
31328845213SAlan Somers }
31428845213SAlan Somers 
31528845213SAlan Somers 
31628845213SAlan Somers ATF_TC_WITH_CLEANUP(lchmod_failure);
31728845213SAlan Somers ATF_TC_HEAD(lchmod_failure, tc)
31828845213SAlan Somers {
31928845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
32028845213SAlan Somers 					"lchmod(2) call");
32128845213SAlan Somers }
32228845213SAlan Somers 
32328845213SAlan Somers ATF_TC_BODY(lchmod_failure, tc)
32428845213SAlan Somers {
32528845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
32628845213SAlan Somers 	/* Failure reason: file does not exist */
32728845213SAlan Somers 	ATF_REQUIRE_EQ(-1, lchmod(errpath, mode));
32828845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
32928845213SAlan Somers }
33028845213SAlan Somers 
33128845213SAlan Somers ATF_TC_CLEANUP(lchmod_failure, tc)
33228845213SAlan Somers {
33328845213SAlan Somers 	cleanup();
33428845213SAlan Somers }
33528845213SAlan Somers 
33628845213SAlan Somers 
33728845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmodat_success);
33828845213SAlan Somers ATF_TC_HEAD(fchmodat_success, tc)
33928845213SAlan Somers {
34028845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
34128845213SAlan Somers 					"fchmodat(2) call");
34228845213SAlan Somers }
34328845213SAlan Somers 
34428845213SAlan Somers ATF_TC_BODY(fchmodat_success, tc)
34528845213SAlan Somers {
34628845213SAlan Somers 	/* File needs to exist to call fchmodat(2) */
34728845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
34828845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
34928845213SAlan Somers 	ATF_REQUIRE_EQ(0, fchmodat(AT_FDCWD, path, mode, 0));
35028845213SAlan Somers 	check_audit(fds, successreg, pipefd);
35128845213SAlan Somers 	close(filedesc);
35228845213SAlan Somers }
35328845213SAlan Somers 
35428845213SAlan Somers ATF_TC_CLEANUP(fchmodat_success, tc)
35528845213SAlan Somers {
35628845213SAlan Somers 	cleanup();
35728845213SAlan Somers }
35828845213SAlan Somers 
35928845213SAlan Somers 
36028845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmodat_failure);
36128845213SAlan Somers ATF_TC_HEAD(fchmodat_failure, tc)
36228845213SAlan Somers {
36328845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
36428845213SAlan Somers 					"fchmodat(2) call");
36528845213SAlan Somers }
36628845213SAlan Somers 
36728845213SAlan Somers ATF_TC_BODY(fchmodat_failure, tc)
36828845213SAlan Somers {
36928845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
37028845213SAlan Somers 	/* Failure reason: file does not exist */
37128845213SAlan Somers 	ATF_REQUIRE_EQ(-1, fchmodat(AT_FDCWD, errpath, mode, 0));
37228845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
37328845213SAlan Somers }
37428845213SAlan Somers 
37528845213SAlan Somers ATF_TC_CLEANUP(fchmodat_failure, tc)
37628845213SAlan Somers {
37728845213SAlan Somers 	cleanup();
37828845213SAlan Somers }
37928845213SAlan Somers 
38028845213SAlan Somers 
3815c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(chown_success);
3825c9a4738SAlan Somers ATF_TC_HEAD(chown_success, tc)
3835c9a4738SAlan Somers {
3845c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
3855c9a4738SAlan Somers 					"chown(2) call");
3865c9a4738SAlan Somers }
3875c9a4738SAlan Somers 
3885c9a4738SAlan Somers ATF_TC_BODY(chown_success, tc)
3895c9a4738SAlan Somers {
3905c9a4738SAlan Somers 	/* File needs to exist to call chown(2) */
3915c9a4738SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
3925c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
3935c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, chown(path, uid, gid));
3945c9a4738SAlan Somers 	check_audit(fds, successreg, pipefd);
3955c9a4738SAlan Somers 	close(filedesc);
3965c9a4738SAlan Somers }
3975c9a4738SAlan Somers 
3985c9a4738SAlan Somers ATF_TC_CLEANUP(chown_success, tc)
3995c9a4738SAlan Somers {
4005c9a4738SAlan Somers 	cleanup();
4015c9a4738SAlan Somers }
4025c9a4738SAlan Somers 
4035c9a4738SAlan Somers 
4045c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(chown_failure);
4055c9a4738SAlan Somers ATF_TC_HEAD(chown_failure, tc)
4065c9a4738SAlan Somers {
4075c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
4085c9a4738SAlan Somers 					"chown(2) call");
4095c9a4738SAlan Somers }
4105c9a4738SAlan Somers 
4115c9a4738SAlan Somers ATF_TC_BODY(chown_failure, tc)
4125c9a4738SAlan Somers {
4135c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
4145c9a4738SAlan Somers 	/* Failure reason: file does not exist */
4155c9a4738SAlan Somers 	ATF_REQUIRE_EQ(-1, chown(errpath, uid, gid));
4165c9a4738SAlan Somers 	check_audit(fds, failurereg, pipefd);
4175c9a4738SAlan Somers }
4185c9a4738SAlan Somers 
4195c9a4738SAlan Somers ATF_TC_CLEANUP(chown_failure, tc)
4205c9a4738SAlan Somers {
4215c9a4738SAlan Somers 	cleanup();
4225c9a4738SAlan Somers }
4235c9a4738SAlan Somers 
4245c9a4738SAlan Somers 
4255c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchown_success);
4265c9a4738SAlan Somers ATF_TC_HEAD(fchown_success, tc)
4275c9a4738SAlan Somers {
4285c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
4295c9a4738SAlan Somers 					"fchown(2) call");
4305c9a4738SAlan Somers }
4315c9a4738SAlan Somers 
4325c9a4738SAlan Somers ATF_TC_BODY(fchown_success, tc)
4335c9a4738SAlan Somers {
4345c9a4738SAlan Somers 	pid = getpid();
4355c9a4738SAlan Somers 	snprintf(extregex, sizeof(extregex), "fchown.*%d.*return,success", pid);
4365c9a4738SAlan Somers 
4375c9a4738SAlan Somers 	/* File needs to exist to call fchown(2) */
4385c9a4738SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
4395c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
4405c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, fchown(filedesc, uid, gid));
4415c9a4738SAlan Somers 	check_audit(fds, extregex, pipefd);
4425c9a4738SAlan Somers 	close(filedesc);
4435c9a4738SAlan Somers }
4445c9a4738SAlan Somers 
4455c9a4738SAlan Somers ATF_TC_CLEANUP(fchown_success, tc)
4465c9a4738SAlan Somers {
4475c9a4738SAlan Somers 	cleanup();
4485c9a4738SAlan Somers }
4495c9a4738SAlan Somers 
4505c9a4738SAlan Somers 
4515c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchown_failure);
4525c9a4738SAlan Somers ATF_TC_HEAD(fchown_failure, tc)
4535c9a4738SAlan Somers {
4545c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
4555c9a4738SAlan Somers 					"fchown(2) call");
4565c9a4738SAlan Somers }
4575c9a4738SAlan Somers 
4585c9a4738SAlan Somers ATF_TC_BODY(fchown_failure, tc)
4595c9a4738SAlan Somers {
4605c9a4738SAlan Somers 	const char *regex = "fchown.*return,failure : Bad file descriptor";
4615c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
4625c9a4738SAlan Somers 	/* Failure reason: Invalid file descriptor */
4635c9a4738SAlan Somers 	ATF_REQUIRE_EQ(-1, fchown(-1, uid, gid));
4645c9a4738SAlan Somers 	check_audit(fds, regex, pipefd);
4655c9a4738SAlan Somers }
4665c9a4738SAlan Somers 
4675c9a4738SAlan Somers ATF_TC_CLEANUP(fchown_failure, tc)
4685c9a4738SAlan Somers {
4695c9a4738SAlan Somers 	cleanup();
4705c9a4738SAlan Somers }
4715c9a4738SAlan Somers 
4725c9a4738SAlan Somers 
4735c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(lchown_success);
4745c9a4738SAlan Somers ATF_TC_HEAD(lchown_success, tc)
4755c9a4738SAlan Somers {
4765c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
4775c9a4738SAlan Somers 					"lchown(2) call");
4785c9a4738SAlan Somers }
4795c9a4738SAlan Somers 
4805c9a4738SAlan Somers ATF_TC_BODY(lchown_success, tc)
4815c9a4738SAlan Somers {
4825c9a4738SAlan Somers 	/* Symbolic link needs to exist to call lchown(2) */
4835c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
4845c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
4855c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, lchown(path, uid, gid));
4865c9a4738SAlan Somers 	check_audit(fds, successreg, pipefd);
4875c9a4738SAlan Somers }
4885c9a4738SAlan Somers 
4895c9a4738SAlan Somers ATF_TC_CLEANUP(lchown_success, tc)
4905c9a4738SAlan Somers {
4915c9a4738SAlan Somers 	cleanup();
4925c9a4738SAlan Somers }
4935c9a4738SAlan Somers 
4945c9a4738SAlan Somers 
4955c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(lchown_failure);
4965c9a4738SAlan Somers ATF_TC_HEAD(lchown_failure, tc)
4975c9a4738SAlan Somers {
4985c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
4995c9a4738SAlan Somers 					"lchown(2) call");
5005c9a4738SAlan Somers }
5015c9a4738SAlan Somers 
5025c9a4738SAlan Somers ATF_TC_BODY(lchown_failure, tc)
5035c9a4738SAlan Somers {
5045c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
5055c9a4738SAlan Somers 	/* Failure reason: Symbolic link does not exist */
5065c9a4738SAlan Somers 	ATF_REQUIRE_EQ(-1, lchown(errpath, uid, gid));
5075c9a4738SAlan Somers 	check_audit(fds, failurereg, pipefd);
5085c9a4738SAlan Somers }
5095c9a4738SAlan Somers 
5105c9a4738SAlan Somers ATF_TC_CLEANUP(lchown_failure, tc)
5115c9a4738SAlan Somers {
5125c9a4738SAlan Somers 	cleanup();
5135c9a4738SAlan Somers }
5145c9a4738SAlan Somers 
5155c9a4738SAlan Somers 
5165c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchownat_success);
5175c9a4738SAlan Somers ATF_TC_HEAD(fchownat_success, tc)
5185c9a4738SAlan Somers {
5195c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
5205c9a4738SAlan Somers 					"fchownat(2) call");
5215c9a4738SAlan Somers }
5225c9a4738SAlan Somers 
5235c9a4738SAlan Somers ATF_TC_BODY(fchownat_success, tc)
5245c9a4738SAlan Somers {
5255c9a4738SAlan Somers 	/* File needs to exist to call fchownat(2) */
5265c9a4738SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
5275c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
5285c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, fchownat(AT_FDCWD, path, uid, gid, 0));
5295c9a4738SAlan Somers 	check_audit(fds, successreg, pipefd);
5305c9a4738SAlan Somers 	close(filedesc);
5315c9a4738SAlan Somers }
5325c9a4738SAlan Somers 
5335c9a4738SAlan Somers ATF_TC_CLEANUP(fchownat_success, tc)
5345c9a4738SAlan Somers {
5355c9a4738SAlan Somers 	cleanup();
5365c9a4738SAlan Somers }
5375c9a4738SAlan Somers 
5385c9a4738SAlan Somers 
5395c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchownat_failure);
5405c9a4738SAlan Somers ATF_TC_HEAD(fchownat_failure, tc)
5415c9a4738SAlan Somers {
5425c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
5435c9a4738SAlan Somers 					"fchownat(2) call");
5445c9a4738SAlan Somers }
5455c9a4738SAlan Somers 
5465c9a4738SAlan Somers ATF_TC_BODY(fchownat_failure, tc)
5475c9a4738SAlan Somers {
5485c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
5495c9a4738SAlan Somers 	/* Failure reason: file does not exist */
5505c9a4738SAlan Somers 	ATF_REQUIRE_EQ(-1, fchownat(AT_FDCWD, errpath, uid, gid, 0));
5515c9a4738SAlan Somers 	check_audit(fds, failurereg, pipefd);
5525c9a4738SAlan Somers }
5535c9a4738SAlan Somers 
5545c9a4738SAlan Somers ATF_TC_CLEANUP(fchownat_failure, tc)
5555c9a4738SAlan Somers {
5565c9a4738SAlan Somers 	cleanup();
5575c9a4738SAlan Somers }
5585c9a4738SAlan Somers 
5595c9a4738SAlan Somers 
56068e520feSAlan Somers ATF_TC_WITH_CLEANUP(chflags_success);
56168e520feSAlan Somers ATF_TC_HEAD(chflags_success, tc)
56268e520feSAlan Somers {
56368e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
56468e520feSAlan Somers 					"chflags(2) call");
56568e520feSAlan Somers }
56668e520feSAlan Somers 
56768e520feSAlan Somers ATF_TC_BODY(chflags_success, tc)
56868e520feSAlan Somers {
56968e520feSAlan Somers 	/* File needs to exist to call chflags(2) */
57068e520feSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
57168e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
57268e520feSAlan Somers 	ATF_REQUIRE_EQ(0, chflags(path, UF_OFFLINE));
57368e520feSAlan Somers 	check_audit(fds, successreg, pipefd);
57468e520feSAlan Somers 	close(filedesc);
57568e520feSAlan Somers }
57668e520feSAlan Somers 
57768e520feSAlan Somers ATF_TC_CLEANUP(chflags_success, tc)
57868e520feSAlan Somers {
57968e520feSAlan Somers 	cleanup();
58068e520feSAlan Somers }
58168e520feSAlan Somers 
58268e520feSAlan Somers 
58368e520feSAlan Somers ATF_TC_WITH_CLEANUP(chflags_failure);
58468e520feSAlan Somers ATF_TC_HEAD(chflags_failure, tc)
58568e520feSAlan Somers {
58668e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
58768e520feSAlan Somers 					"chflags(2) call");
58868e520feSAlan Somers }
58968e520feSAlan Somers 
59068e520feSAlan Somers ATF_TC_BODY(chflags_failure, tc)
59168e520feSAlan Somers {
59268e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
59368e520feSAlan Somers 	/* Failure reason: file does not exist */
59468e520feSAlan Somers 	ATF_REQUIRE_EQ(-1, chflags(errpath, UF_OFFLINE));
59568e520feSAlan Somers 	check_audit(fds, failurereg, pipefd);
59668e520feSAlan Somers }
59768e520feSAlan Somers 
59868e520feSAlan Somers ATF_TC_CLEANUP(chflags_failure, tc)
59968e520feSAlan Somers {
60068e520feSAlan Somers 	cleanup();
60168e520feSAlan Somers }
60268e520feSAlan Somers 
60368e520feSAlan Somers 
60468e520feSAlan Somers ATF_TC_WITH_CLEANUP(fchflags_success);
60568e520feSAlan Somers ATF_TC_HEAD(fchflags_success, tc)
60668e520feSAlan Somers {
60768e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
60868e520feSAlan Somers 					"fchflags(2) call");
60968e520feSAlan Somers }
61068e520feSAlan Somers 
61168e520feSAlan Somers ATF_TC_BODY(fchflags_success, tc)
61268e520feSAlan Somers {
61368e520feSAlan Somers 	pid = getpid();
61468e520feSAlan Somers 	snprintf(extregex, sizeof(extregex), "fchflags.*%d.*ret.*success", pid);
61568e520feSAlan Somers 	/* File needs to exist to call fchflags(2) */
61668e520feSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
61768e520feSAlan Somers 
61868e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
61968e520feSAlan Somers 	ATF_REQUIRE_EQ(0, fchflags(filedesc, UF_OFFLINE));
62068e520feSAlan Somers 	check_audit(fds, extregex, pipefd);
62168e520feSAlan Somers 	close(filedesc);
62268e520feSAlan Somers }
62368e520feSAlan Somers 
62468e520feSAlan Somers ATF_TC_CLEANUP(fchflags_success, tc)
62568e520feSAlan Somers {
62668e520feSAlan Somers 	cleanup();
62768e520feSAlan Somers }
62868e520feSAlan Somers 
62968e520feSAlan Somers 
63068e520feSAlan Somers ATF_TC_WITH_CLEANUP(fchflags_failure);
63168e520feSAlan Somers ATF_TC_HEAD(fchflags_failure, tc)
63268e520feSAlan Somers {
63368e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
63468e520feSAlan Somers 					"fchflags(2) call");
63568e520feSAlan Somers }
63668e520feSAlan Somers 
63768e520feSAlan Somers ATF_TC_BODY(fchflags_failure, tc)
63868e520feSAlan Somers {
63968e520feSAlan Somers 	const char *regex = "fchflags.*return,failure : Bad file descriptor";
64068e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
64168e520feSAlan Somers 	/* Failure reason: Invalid file descriptor */
64268e520feSAlan Somers 	ATF_REQUIRE_EQ(-1, fchflags(-1, UF_OFFLINE));
64368e520feSAlan Somers 	check_audit(fds, regex, pipefd);
64468e520feSAlan Somers }
64568e520feSAlan Somers 
64668e520feSAlan Somers ATF_TC_CLEANUP(fchflags_failure, tc)
64768e520feSAlan Somers {
64868e520feSAlan Somers 	cleanup();
64968e520feSAlan Somers }
65068e520feSAlan Somers 
65168e520feSAlan Somers 
65268e520feSAlan Somers ATF_TC_WITH_CLEANUP(lchflags_success);
65368e520feSAlan Somers ATF_TC_HEAD(lchflags_success, tc)
65468e520feSAlan Somers {
65568e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
65668e520feSAlan Somers 					"lchflags(2) call");
65768e520feSAlan Somers }
65868e520feSAlan Somers 
65968e520feSAlan Somers ATF_TC_BODY(lchflags_success, tc)
66068e520feSAlan Somers {
66168e520feSAlan Somers 	/* Symbolic link needs to exist to call lchflags(2) */
66268e520feSAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
66368e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
66468e520feSAlan Somers 	ATF_REQUIRE_EQ(0, lchflags(path, UF_OFFLINE));
66568e520feSAlan Somers 	check_audit(fds, successreg, pipefd);
66668e520feSAlan Somers }
66768e520feSAlan Somers 
66868e520feSAlan Somers ATF_TC_CLEANUP(lchflags_success, tc)
66968e520feSAlan Somers {
67068e520feSAlan Somers 	cleanup();
67168e520feSAlan Somers }
67268e520feSAlan Somers 
67368e520feSAlan Somers 
67468e520feSAlan Somers ATF_TC_WITH_CLEANUP(lchflags_failure);
67568e520feSAlan Somers ATF_TC_HEAD(lchflags_failure, tc)
67668e520feSAlan Somers {
67768e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
67868e520feSAlan Somers 					"lchflags(2) call");
67968e520feSAlan Somers }
68068e520feSAlan Somers 
68168e520feSAlan Somers ATF_TC_BODY(lchflags_failure, tc)
68268e520feSAlan Somers {
68368e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
68468e520feSAlan Somers 	/* Failure reason: Symbolic link does not exist */
68568e520feSAlan Somers 	ATF_REQUIRE_EQ(-1, lchflags(errpath, UF_OFFLINE));
68668e520feSAlan Somers 	check_audit(fds, failurereg, pipefd);
68768e520feSAlan Somers }
68868e520feSAlan Somers 
68968e520feSAlan Somers ATF_TC_CLEANUP(lchflags_failure, tc)
69068e520feSAlan Somers {
69168e520feSAlan Somers 	cleanup();
69268e520feSAlan Somers }
69368e520feSAlan Somers 
69468e520feSAlan Somers 
695*55cd4523SAlan Somers ATF_TC_WITH_CLEANUP(chflagsat_success);
696*55cd4523SAlan Somers ATF_TC_HEAD(chflagsat_success, tc)
697*55cd4523SAlan Somers {
698*55cd4523SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
699*55cd4523SAlan Somers 					"chflagsat(2) call");
700*55cd4523SAlan Somers }
701*55cd4523SAlan Somers 
702*55cd4523SAlan Somers ATF_TC_BODY(chflagsat_success, tc)
703*55cd4523SAlan Somers {
704*55cd4523SAlan Somers 	/* BSM conversion requested for unknown event 43209 */
705*55cd4523SAlan Somers 	atf_tc_expect_fail("PR 228374: chflagsat(2) does not get audited in success mode");
706*55cd4523SAlan Somers 
707*55cd4523SAlan Somers 	/* File needs to exist to call chflagsat(2) */
708*55cd4523SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
709*55cd4523SAlan Somers 	FILE *pipefd = setup(fds, auclass);
710*55cd4523SAlan Somers 	ATF_REQUIRE_EQ(0, chflagsat(AT_FDCWD, path, SF_IMMUTABLE, 0));
711*55cd4523SAlan Somers 	check_audit(fds, successreg, pipefd);
712*55cd4523SAlan Somers 	close(filedesc);
713*55cd4523SAlan Somers }
714*55cd4523SAlan Somers 
715*55cd4523SAlan Somers ATF_TC_CLEANUP(chflagsat_success, tc)
716*55cd4523SAlan Somers {
717*55cd4523SAlan Somers 	cleanup();
718*55cd4523SAlan Somers }
719*55cd4523SAlan Somers 
720*55cd4523SAlan Somers 
721*55cd4523SAlan Somers ATF_TC_WITH_CLEANUP(chflagsat_failure);
722*55cd4523SAlan Somers ATF_TC_HEAD(chflagsat_failure, tc)
723*55cd4523SAlan Somers {
724*55cd4523SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
725*55cd4523SAlan Somers 					"chflagsat(2) call");
726*55cd4523SAlan Somers }
727*55cd4523SAlan Somers 
728*55cd4523SAlan Somers ATF_TC_BODY(chflagsat_failure, tc)
729*55cd4523SAlan Somers {
730*55cd4523SAlan Somers 	/* BSM conversion requested for unknown event 43209 */
731*55cd4523SAlan Somers 	atf_tc_expect_fail("PR 228374: chflagsat(2) does not get audited in failure mode");
732*55cd4523SAlan Somers 
733*55cd4523SAlan Somers 	FILE *pipefd = setup(fds, auclass);
734*55cd4523SAlan Somers 	/* Failure reason: file does not exist */
735*55cd4523SAlan Somers 	ATF_REQUIRE_EQ(-1, chflagsat(AT_FDCWD, errpath, SF_IMMUTABLE, 0));
736*55cd4523SAlan Somers 	check_audit(fds, failurereg, pipefd);
737*55cd4523SAlan Somers }
738*55cd4523SAlan Somers 
739*55cd4523SAlan Somers ATF_TC_CLEANUP(chflagsat_failure, tc)
740*55cd4523SAlan Somers {
741*55cd4523SAlan Somers 	cleanup();
742*55cd4523SAlan Somers }
743*55cd4523SAlan Somers 
744*55cd4523SAlan Somers 
745d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(utimes_success);
746d1fb351cSAlan Somers ATF_TC_HEAD(utimes_success, tc)
747d1fb351cSAlan Somers {
748d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
749d1fb351cSAlan Somers 					"utimes(2) call");
750d1fb351cSAlan Somers }
751d1fb351cSAlan Somers 
752d1fb351cSAlan Somers ATF_TC_BODY(utimes_success, tc)
753d1fb351cSAlan Somers {
754d1fb351cSAlan Somers 	/* File needs to exist to call utimes(2) */
755d1fb351cSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
756d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
757d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(0, utimes(path, NULL));
758d1fb351cSAlan Somers 	check_audit(fds, successreg, pipefd);
759d1fb351cSAlan Somers 	close(filedesc);
760d1fb351cSAlan Somers }
761d1fb351cSAlan Somers 
762d1fb351cSAlan Somers ATF_TC_CLEANUP(utimes_success, tc)
763d1fb351cSAlan Somers {
764d1fb351cSAlan Somers 	cleanup();
765d1fb351cSAlan Somers }
766d1fb351cSAlan Somers 
767d1fb351cSAlan Somers 
768d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(utimes_failure);
769d1fb351cSAlan Somers ATF_TC_HEAD(utimes_failure, tc)
770d1fb351cSAlan Somers {
771d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
772d1fb351cSAlan Somers 					"utimes(2) call");
773d1fb351cSAlan Somers }
774d1fb351cSAlan Somers 
775d1fb351cSAlan Somers ATF_TC_BODY(utimes_failure, tc)
776d1fb351cSAlan Somers {
777d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
778d1fb351cSAlan Somers 	/* Failure reason: file does not exist */
779d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(-1, utimes(errpath, NULL));
780d1fb351cSAlan Somers 	check_audit(fds, failurereg, pipefd);
781d1fb351cSAlan Somers }
782d1fb351cSAlan Somers 
783d1fb351cSAlan Somers ATF_TC_CLEANUP(utimes_failure, tc)
784d1fb351cSAlan Somers {
785d1fb351cSAlan Somers 	cleanup();
786d1fb351cSAlan Somers }
787d1fb351cSAlan Somers 
788d1fb351cSAlan Somers 
789d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(futimes_success);
790d1fb351cSAlan Somers ATF_TC_HEAD(futimes_success, tc)
791d1fb351cSAlan Somers {
792d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
793d1fb351cSAlan Somers 					"futimes(2) call");
794d1fb351cSAlan Somers }
795d1fb351cSAlan Somers 
796d1fb351cSAlan Somers ATF_TC_BODY(futimes_success, tc)
797d1fb351cSAlan Somers {
798d1fb351cSAlan Somers 	pid = getpid();
799d1fb351cSAlan Somers 	snprintf(extregex, sizeof(extregex), "futimes.*%d.*ret.*success", pid);
800d1fb351cSAlan Somers 
801d1fb351cSAlan Somers 	/* File needs to exist to call futimes(2) */
802d1fb351cSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
803d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
804d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(0, futimes(filedesc, NULL));
805d1fb351cSAlan Somers 	check_audit(fds, extregex, pipefd);
806d1fb351cSAlan Somers 	close(filedesc);
807d1fb351cSAlan Somers }
808d1fb351cSAlan Somers 
809d1fb351cSAlan Somers ATF_TC_CLEANUP(futimes_success, tc)
810d1fb351cSAlan Somers {
811d1fb351cSAlan Somers 	cleanup();
812d1fb351cSAlan Somers }
813d1fb351cSAlan Somers 
814d1fb351cSAlan Somers 
815d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(futimes_failure);
816d1fb351cSAlan Somers ATF_TC_HEAD(futimes_failure, tc)
817d1fb351cSAlan Somers {
818d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
819d1fb351cSAlan Somers 					"futimes(2) call");
820d1fb351cSAlan Somers }
821d1fb351cSAlan Somers 
822d1fb351cSAlan Somers ATF_TC_BODY(futimes_failure, tc)
823d1fb351cSAlan Somers {
824d1fb351cSAlan Somers 	const char *regex = "futimes.*return,failure : Bad file descriptor";
825d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
826d1fb351cSAlan Somers 	/* Failure reason: Invalid file descriptor */
827d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(-1, futimes(-1, NULL));
828d1fb351cSAlan Somers 	check_audit(fds, regex, pipefd);
829d1fb351cSAlan Somers }
830d1fb351cSAlan Somers 
831d1fb351cSAlan Somers ATF_TC_CLEANUP(futimes_failure, tc)
832d1fb351cSAlan Somers {
833d1fb351cSAlan Somers 	cleanup();
834d1fb351cSAlan Somers }
835d1fb351cSAlan Somers 
836d1fb351cSAlan Somers 
837d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(lutimes_success);
838d1fb351cSAlan Somers ATF_TC_HEAD(lutimes_success, tc)
839d1fb351cSAlan Somers {
840d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
841d1fb351cSAlan Somers 					"lutimes(2) call");
842d1fb351cSAlan Somers }
843d1fb351cSAlan Somers 
844d1fb351cSAlan Somers ATF_TC_BODY(lutimes_success, tc)
845d1fb351cSAlan Somers {
846d1fb351cSAlan Somers 	/* Symbolic link needs to exist to call lutimes(2) */
847d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
848d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
849d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(0, lutimes(path, NULL));
850d1fb351cSAlan Somers 	check_audit(fds, successreg, pipefd);
851d1fb351cSAlan Somers }
852d1fb351cSAlan Somers 
853d1fb351cSAlan Somers ATF_TC_CLEANUP(lutimes_success, tc)
854d1fb351cSAlan Somers {
855d1fb351cSAlan Somers 	cleanup();
856d1fb351cSAlan Somers }
857d1fb351cSAlan Somers 
858d1fb351cSAlan Somers 
859d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(lutimes_failure);
860d1fb351cSAlan Somers ATF_TC_HEAD(lutimes_failure, tc)
861d1fb351cSAlan Somers {
862d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
863d1fb351cSAlan Somers 					"lutimes(2) call");
864d1fb351cSAlan Somers }
865d1fb351cSAlan Somers 
866d1fb351cSAlan Somers ATF_TC_BODY(lutimes_failure, tc)
867d1fb351cSAlan Somers {
868d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
869d1fb351cSAlan Somers 	/* Failure reason: symbolic link does not exist */
870d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(-1, lutimes(errpath, NULL));
871d1fb351cSAlan Somers 	check_audit(fds, failurereg, pipefd);
872d1fb351cSAlan Somers }
873d1fb351cSAlan Somers 
874d1fb351cSAlan Somers ATF_TC_CLEANUP(lutimes_failure, tc)
875d1fb351cSAlan Somers {
876d1fb351cSAlan Somers 	cleanup();
877d1fb351cSAlan Somers }
878d1fb351cSAlan Somers 
879d1fb351cSAlan Somers 
880d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(futimesat_success);
881d1fb351cSAlan Somers ATF_TC_HEAD(futimesat_success, tc)
882d1fb351cSAlan Somers {
883d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
884d1fb351cSAlan Somers 					"futimesat(2) call");
885d1fb351cSAlan Somers }
886d1fb351cSAlan Somers 
887d1fb351cSAlan Somers ATF_TC_BODY(futimesat_success, tc)
888d1fb351cSAlan Somers {
889d1fb351cSAlan Somers 	/* File needs to exist to call futimesat(2) */
890d1fb351cSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
891d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
892d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(0, futimesat(AT_FDCWD, path, NULL));
893d1fb351cSAlan Somers 	check_audit(fds, successreg, pipefd);
894d1fb351cSAlan Somers 	close(filedesc);
895d1fb351cSAlan Somers }
896d1fb351cSAlan Somers 
897d1fb351cSAlan Somers ATF_TC_CLEANUP(futimesat_success, tc)
898d1fb351cSAlan Somers {
899d1fb351cSAlan Somers 	cleanup();
900d1fb351cSAlan Somers }
901d1fb351cSAlan Somers 
902d1fb351cSAlan Somers 
903d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(futimesat_failure);
904d1fb351cSAlan Somers ATF_TC_HEAD(futimesat_failure, tc)
905d1fb351cSAlan Somers {
906d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
907d1fb351cSAlan Somers 					"futimesat(2) call");
908d1fb351cSAlan Somers }
909d1fb351cSAlan Somers 
910d1fb351cSAlan Somers ATF_TC_BODY(futimesat_failure, tc)
911d1fb351cSAlan Somers {
912d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
913d1fb351cSAlan Somers 	/* Failure reason: file does not exist */
914d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(-1, futimesat(AT_FDCWD, errpath, NULL));
915d1fb351cSAlan Somers 	check_audit(fds, failurereg, pipefd);
916d1fb351cSAlan Somers }
917d1fb351cSAlan Somers 
918d1fb351cSAlan Somers ATF_TC_CLEANUP(futimesat_failure, tc)
919d1fb351cSAlan Somers {
920d1fb351cSAlan Somers 	cleanup();
921d1fb351cSAlan Somers }
922d1fb351cSAlan Somers 
923d1fb351cSAlan Somers 
924d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(mprotect_success);
925d1fb351cSAlan Somers ATF_TC_HEAD(mprotect_success, tc)
926d1fb351cSAlan Somers {
927d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
928d1fb351cSAlan Somers 					"mprotect(2) call");
929d1fb351cSAlan Somers }
930d1fb351cSAlan Somers 
931d1fb351cSAlan Somers ATF_TC_BODY(mprotect_success, tc)
932d1fb351cSAlan Somers {
933d1fb351cSAlan Somers 	pid = getpid();
934d1fb351cSAlan Somers 	snprintf(extregex, sizeof(extregex), "mprotect.*%d.*ret.*success", pid);
935d1fb351cSAlan Somers 
936d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
937d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(0, mprotect(NULL, 0, PROT_NONE));
938d1fb351cSAlan Somers 	check_audit(fds, extregex, pipefd);
939d1fb351cSAlan Somers }
940d1fb351cSAlan Somers 
941d1fb351cSAlan Somers ATF_TC_CLEANUP(mprotect_success, tc)
942d1fb351cSAlan Somers {
943d1fb351cSAlan Somers 	cleanup();
944d1fb351cSAlan Somers }
945d1fb351cSAlan Somers 
946d1fb351cSAlan Somers 
947d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(mprotect_failure);
948d1fb351cSAlan Somers ATF_TC_HEAD(mprotect_failure, tc)
949d1fb351cSAlan Somers {
950d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
951d1fb351cSAlan Somers 					"mprotect(2) call");
952d1fb351cSAlan Somers }
953d1fb351cSAlan Somers 
954d1fb351cSAlan Somers ATF_TC_BODY(mprotect_failure, tc)
955d1fb351cSAlan Somers {
956d1fb351cSAlan Somers 	const char *regex = "mprotect.*return,failure : Invalid argument";
957d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
958d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(-1, mprotect((void *)SIZE_MAX, -1, PROT_NONE));
959d1fb351cSAlan Somers 	check_audit(fds, regex, pipefd);
960d1fb351cSAlan Somers }
961d1fb351cSAlan Somers 
962d1fb351cSAlan Somers ATF_TC_CLEANUP(mprotect_failure, tc)
963d1fb351cSAlan Somers {
964d1fb351cSAlan Somers 	cleanup();
965d1fb351cSAlan Somers }
966d1fb351cSAlan Somers 
967d1fb351cSAlan Somers /*
968d1fb351cSAlan Somers  * undelete(2) only works on whiteout files in union file system. Hence, no
969d1fb351cSAlan Somers  * test case for successful invocation.
970d1fb351cSAlan Somers  */
971d1fb351cSAlan Somers 
972d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(undelete_failure);
973d1fb351cSAlan Somers ATF_TC_HEAD(undelete_failure, tc)
974d1fb351cSAlan Somers {
975d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
976d1fb351cSAlan Somers 					"undelete(2) call");
977d1fb351cSAlan Somers }
978d1fb351cSAlan Somers 
979d1fb351cSAlan Somers ATF_TC_BODY(undelete_failure, tc)
980d1fb351cSAlan Somers {
981d1fb351cSAlan Somers 	pid = getpid();
982d1fb351cSAlan Somers 	snprintf(extregex, sizeof(extregex), "undelete.*%d.*ret.*failure", pid);
983d1fb351cSAlan Somers 
984d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
985d1fb351cSAlan Somers 	/* Failure reason: File does not exist */
986d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(-1, undelete(errpath));
987d1fb351cSAlan Somers 	check_audit(fds, extregex, pipefd);
988d1fb351cSAlan Somers }
989d1fb351cSAlan Somers 
990d1fb351cSAlan Somers ATF_TC_CLEANUP(undelete_failure, tc)
991d1fb351cSAlan Somers {
992d1fb351cSAlan Somers 	cleanup();
993d1fb351cSAlan Somers }
994d1fb351cSAlan Somers 
995d1fb351cSAlan Somers 
996844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_set_file_success);
997844fc5ebSAlan Somers ATF_TC_HEAD(extattr_set_file_success, tc)
998844fc5ebSAlan Somers {
999844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1000844fc5ebSAlan Somers 					"extattr_set_file(2) call");
1001844fc5ebSAlan Somers }
1002844fc5ebSAlan Somers 
1003844fc5ebSAlan Somers ATF_TC_BODY(extattr_set_file_success, tc)
1004844fc5ebSAlan Somers {
1005844fc5ebSAlan Somers 	/* File needs to exist to call extattr_set_file(2) */
1006844fc5ebSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1007844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1008844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1009844fc5ebSAlan Somers 		"extattr_set_file.*%s.*%s.*return,success", path, name);
1010844fc5ebSAlan Somers 
1011844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1012844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(sizeof(buff), extattr_set_file(path,
1013844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1014844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1015844fc5ebSAlan Somers 	close(filedesc);
1016844fc5ebSAlan Somers }
1017844fc5ebSAlan Somers 
1018844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_set_file_success, tc)
1019844fc5ebSAlan Somers {
1020844fc5ebSAlan Somers 	cleanup();
1021844fc5ebSAlan Somers }
1022844fc5ebSAlan Somers 
1023844fc5ebSAlan Somers 
1024844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_set_file_failure);
1025844fc5ebSAlan Somers ATF_TC_HEAD(extattr_set_file_failure, tc)
1026844fc5ebSAlan Somers {
1027844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1028844fc5ebSAlan Somers 					"extattr_set_file(2) call");
1029844fc5ebSAlan Somers }
1030844fc5ebSAlan Somers 
1031844fc5ebSAlan Somers ATF_TC_BODY(extattr_set_file_failure, tc)
1032844fc5ebSAlan Somers {
1033844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1034844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1035844fc5ebSAlan Somers 		"extattr_set_file.*%s.*%s.*failure", path, name);
1036844fc5ebSAlan Somers 
1037844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1038844fc5ebSAlan Somers 	/* Failure reason: file does not exist */
1039844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(-1, extattr_set_file(path,
1040844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name, NULL, 0));
1041844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1042844fc5ebSAlan Somers }
1043844fc5ebSAlan Somers 
1044844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_set_file_failure, tc)
1045844fc5ebSAlan Somers {
1046844fc5ebSAlan Somers 	cleanup();
1047844fc5ebSAlan Somers }
1048844fc5ebSAlan Somers 
1049844fc5ebSAlan Somers 
1050844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_set_fd_success);
1051844fc5ebSAlan Somers ATF_TC_HEAD(extattr_set_fd_success, tc)
1052844fc5ebSAlan Somers {
1053844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1054844fc5ebSAlan Somers 					"extattr_set_fd(2) call");
1055844fc5ebSAlan Somers }
1056844fc5ebSAlan Somers 
1057844fc5ebSAlan Somers ATF_TC_BODY(extattr_set_fd_success, tc)
1058844fc5ebSAlan Somers {
1059844fc5ebSAlan Somers 	/* File needs to exist to call extattr_set_fd(2) */
1060844fc5ebSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1061844fc5ebSAlan Somers 
1062844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1063844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1064844fc5ebSAlan Somers 		"extattr_set_fd.*%s.*return,success", name);
1065844fc5ebSAlan Somers 
1066844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1067844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(sizeof(buff), extattr_set_fd(filedesc,
1068844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1069844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1070844fc5ebSAlan Somers 	close(filedesc);
1071844fc5ebSAlan Somers }
1072844fc5ebSAlan Somers 
1073844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_set_fd_success, tc)
1074844fc5ebSAlan Somers {
1075844fc5ebSAlan Somers 	cleanup();
1076844fc5ebSAlan Somers }
1077844fc5ebSAlan Somers 
1078844fc5ebSAlan Somers 
1079844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_set_fd_failure);
1080844fc5ebSAlan Somers ATF_TC_HEAD(extattr_set_fd_failure, tc)
1081844fc5ebSAlan Somers {
1082844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1083844fc5ebSAlan Somers 					"extattr_set_fd(2) call");
1084844fc5ebSAlan Somers }
1085844fc5ebSAlan Somers 
1086844fc5ebSAlan Somers ATF_TC_BODY(extattr_set_fd_failure, tc)
1087844fc5ebSAlan Somers {
1088844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1089844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1090844fc5ebSAlan Somers 	"extattr_set_fd.*%s.*return,failure : Bad file descriptor", name);
1091844fc5ebSAlan Somers 
1092844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1093844fc5ebSAlan Somers 	/* Failure reason: Invalid file descriptor */
1094844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(-1, extattr_set_fd(-1,
1095844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name, NULL, 0));
1096844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1097844fc5ebSAlan Somers }
1098844fc5ebSAlan Somers 
1099844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_set_fd_failure, tc)
1100844fc5ebSAlan Somers {
1101844fc5ebSAlan Somers 	cleanup();
1102844fc5ebSAlan Somers }
1103844fc5ebSAlan Somers 
1104844fc5ebSAlan Somers 
1105844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_set_link_success);
1106844fc5ebSAlan Somers ATF_TC_HEAD(extattr_set_link_success, tc)
1107844fc5ebSAlan Somers {
1108844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1109844fc5ebSAlan Somers 					"extattr_set_link(2) call");
1110844fc5ebSAlan Somers }
1111844fc5ebSAlan Somers 
1112844fc5ebSAlan Somers ATF_TC_BODY(extattr_set_link_success, tc)
1113844fc5ebSAlan Somers {
1114844fc5ebSAlan Somers 	/* Symbolic link needs to exist to call extattr_set_link(2) */
1115844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
1116844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1117844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1118844fc5ebSAlan Somers 		"extattr_set_link.*%s.*%s.*return,success", path, name);
1119844fc5ebSAlan Somers 
1120844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1121844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(sizeof(buff), extattr_set_link(path,
1122844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1123844fc5ebSAlan Somers 
1124844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1125844fc5ebSAlan Somers }
1126844fc5ebSAlan Somers 
1127844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_set_link_success, tc)
1128844fc5ebSAlan Somers {
1129844fc5ebSAlan Somers 	cleanup();
1130844fc5ebSAlan Somers }
1131844fc5ebSAlan Somers 
1132844fc5ebSAlan Somers 
1133844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_set_link_failure);
1134844fc5ebSAlan Somers ATF_TC_HEAD(extattr_set_link_failure, tc)
1135844fc5ebSAlan Somers {
1136844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1137844fc5ebSAlan Somers 					"extattr_set_link(2) call");
1138844fc5ebSAlan Somers }
1139844fc5ebSAlan Somers 
1140844fc5ebSAlan Somers ATF_TC_BODY(extattr_set_link_failure, tc)
1141844fc5ebSAlan Somers {
1142844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1143844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1144844fc5ebSAlan Somers 		"extattr_set_link.*%s.*%s.*failure", path, name);
1145844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1146844fc5ebSAlan Somers 	/* Failure reason: symbolic link does not exist */
1147844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(-1, extattr_set_link(path,
1148844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name, NULL, 0));
1149844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1150844fc5ebSAlan Somers }
1151844fc5ebSAlan Somers 
1152844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_set_link_failure, tc)
1153844fc5ebSAlan Somers {
1154844fc5ebSAlan Somers 	cleanup();
1155844fc5ebSAlan Somers }
1156844fc5ebSAlan Somers 
1157844fc5ebSAlan Somers 
1158844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_delete_file_success);
1159844fc5ebSAlan Somers ATF_TC_HEAD(extattr_delete_file_success, tc)
1160844fc5ebSAlan Somers {
1161844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1162844fc5ebSAlan Somers 					"extattr_delete_file(2) call");
1163844fc5ebSAlan Somers }
1164844fc5ebSAlan Somers 
1165844fc5ebSAlan Somers ATF_TC_BODY(extattr_delete_file_success, tc)
1166844fc5ebSAlan Somers {
1167844fc5ebSAlan Somers 	/* File needs to exist to call extattr_delete_file(2) */
1168844fc5ebSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1169844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(sizeof(buff), extattr_set_file(path,
1170844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1171844fc5ebSAlan Somers 
1172844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1173844fc5ebSAlan Somers 	ATF_REQUIRE((retval = extattr_delete_file(path,
1174844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name)) != -1);
1175844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1176844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1177844fc5ebSAlan Somers 	"extattr_delete_file.*%s.*return,success,%d", path, retval);
1178844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1179844fc5ebSAlan Somers 	close(filedesc);
1180844fc5ebSAlan Somers }
1181844fc5ebSAlan Somers 
1182844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_delete_file_success, tc)
1183844fc5ebSAlan Somers {
1184844fc5ebSAlan Somers 	cleanup();
1185844fc5ebSAlan Somers }
1186844fc5ebSAlan Somers 
1187844fc5ebSAlan Somers 
1188844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_delete_file_failure);
1189844fc5ebSAlan Somers ATF_TC_HEAD(extattr_delete_file_failure, tc)
1190844fc5ebSAlan Somers {
1191844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1192844fc5ebSAlan Somers 					"extattr_delete_file(2) call");
1193844fc5ebSAlan Somers }
1194844fc5ebSAlan Somers 
1195844fc5ebSAlan Somers ATF_TC_BODY(extattr_delete_file_failure, tc)
1196844fc5ebSAlan Somers {
1197844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1198844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1199844fc5ebSAlan Somers 		"extattr_delete_file.*%s.*return,failure", path);
1200844fc5ebSAlan Somers 
1201844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1202844fc5ebSAlan Somers 	/* Failure reason: file does not exist */
1203844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(-1, extattr_delete_file(path,
1204844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name));
1205844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1206844fc5ebSAlan Somers }
1207844fc5ebSAlan Somers 
1208844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_delete_file_failure, tc)
1209844fc5ebSAlan Somers {
1210844fc5ebSAlan Somers 	cleanup();
1211844fc5ebSAlan Somers }
1212844fc5ebSAlan Somers 
1213844fc5ebSAlan Somers 
1214844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_delete_fd_success);
1215844fc5ebSAlan Somers ATF_TC_HEAD(extattr_delete_fd_success, tc)
1216844fc5ebSAlan Somers {
1217844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1218844fc5ebSAlan Somers 					"extattr_delete_fd(2) call");
1219844fc5ebSAlan Somers }
1220844fc5ebSAlan Somers 
1221844fc5ebSAlan Somers ATF_TC_BODY(extattr_delete_fd_success, tc)
1222844fc5ebSAlan Somers {
1223844fc5ebSAlan Somers 	/* File needs to exist to call extattr_delete_fd(2) */
1224844fc5ebSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1225844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(sizeof(buff), extattr_set_file(path,
1226844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1227844fc5ebSAlan Somers 
1228844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1229844fc5ebSAlan Somers 	ATF_REQUIRE((retval = extattr_delete_fd(filedesc,
1230844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name)) != -1);
1231844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1232844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1233844fc5ebSAlan Somers 		"extattr_delete_fd.*return,success,%d", retval);
1234844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1235844fc5ebSAlan Somers 	close(filedesc);
1236844fc5ebSAlan Somers }
1237844fc5ebSAlan Somers 
1238844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_delete_fd_success, tc)
1239844fc5ebSAlan Somers {
1240844fc5ebSAlan Somers 	cleanup();
1241844fc5ebSAlan Somers }
1242844fc5ebSAlan Somers 
1243844fc5ebSAlan Somers 
1244844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_delete_fd_failure);
1245844fc5ebSAlan Somers ATF_TC_HEAD(extattr_delete_fd_failure, tc)
1246844fc5ebSAlan Somers {
1247844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1248844fc5ebSAlan Somers 					"extattr_delete_fd(2) call");
1249844fc5ebSAlan Somers }
1250844fc5ebSAlan Somers 
1251844fc5ebSAlan Somers ATF_TC_BODY(extattr_delete_fd_failure, tc)
1252844fc5ebSAlan Somers {
1253844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1254844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1255844fc5ebSAlan Somers 		"extattr_delete_fd.*return,failure : Bad file descriptor");
1256844fc5ebSAlan Somers 
1257844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1258844fc5ebSAlan Somers 	/* Failure reason: Invalid file descriptor */
1259844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(-1, extattr_delete_fd(-1, EXTATTR_NAMESPACE_USER, name));
1260844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1261844fc5ebSAlan Somers }
1262844fc5ebSAlan Somers 
1263844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_delete_fd_failure, tc)
1264844fc5ebSAlan Somers {
1265844fc5ebSAlan Somers 	cleanup();
1266844fc5ebSAlan Somers }
1267844fc5ebSAlan Somers 
1268844fc5ebSAlan Somers 
1269844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_delete_link_success);
1270844fc5ebSAlan Somers ATF_TC_HEAD(extattr_delete_link_success, tc)
1271844fc5ebSAlan Somers {
1272844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1273844fc5ebSAlan Somers 					"extattr_delete_link(2) call");
1274844fc5ebSAlan Somers }
1275844fc5ebSAlan Somers 
1276844fc5ebSAlan Somers ATF_TC_BODY(extattr_delete_link_success, tc)
1277844fc5ebSAlan Somers {
1278844fc5ebSAlan Somers 	/* Symbolic link needs to exist to call extattr_delete_link(2) */
1279844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
1280844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(sizeof(buff), extattr_set_link(path,
1281844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1282844fc5ebSAlan Somers 
1283844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1284844fc5ebSAlan Somers 	ATF_REQUIRE((retval = extattr_delete_link(path,
1285844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name)) != -1);
1286844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1287844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1288844fc5ebSAlan Somers 	"extattr_delete_link.*%s.*return,success,%d", path, retval);
1289844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1290844fc5ebSAlan Somers }
1291844fc5ebSAlan Somers 
1292844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_delete_link_success, tc)
1293844fc5ebSAlan Somers {
1294844fc5ebSAlan Somers 	cleanup();
1295844fc5ebSAlan Somers }
1296844fc5ebSAlan Somers 
1297844fc5ebSAlan Somers 
1298844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_delete_link_failure);
1299844fc5ebSAlan Somers ATF_TC_HEAD(extattr_delete_link_failure, tc)
1300844fc5ebSAlan Somers {
1301844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1302844fc5ebSAlan Somers 					"extattr_delete_link(2) call");
1303844fc5ebSAlan Somers }
1304844fc5ebSAlan Somers 
1305844fc5ebSAlan Somers ATF_TC_BODY(extattr_delete_link_failure, tc)
1306844fc5ebSAlan Somers {
1307844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1308844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1309844fc5ebSAlan Somers 		"extattr_delete_link.*%s.*failure", path);
1310844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1311844fc5ebSAlan Somers 	/* Failure reason: symbolic link does not exist */
1312844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(-1, extattr_delete_link(path,
1313844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name));
1314844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1315844fc5ebSAlan Somers }
1316844fc5ebSAlan Somers 
1317844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_delete_link_failure, tc)
1318844fc5ebSAlan Somers {
1319844fc5ebSAlan Somers 	cleanup();
1320844fc5ebSAlan Somers }
1321844fc5ebSAlan Somers 
1322844fc5ebSAlan Somers 
13236d203d2dSAlan Somers ATF_TP_ADD_TCS(tp)
13246d203d2dSAlan Somers {
13256d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, flock_success);
13266d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, flock_failure);
13276d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fcntl_success);
13286d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fcntl_failure);
13296d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fsync_success);
13306d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fsync_failure);
13316d203d2dSAlan Somers 
133228845213SAlan Somers 	ATF_TP_ADD_TC(tp, chmod_success);
133328845213SAlan Somers 	ATF_TP_ADD_TC(tp, chmod_failure);
133428845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmod_success);
133528845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmod_failure);
133628845213SAlan Somers 	ATF_TP_ADD_TC(tp, lchmod_success);
133728845213SAlan Somers 	ATF_TP_ADD_TC(tp, lchmod_failure);
133828845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmodat_success);
133928845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmodat_failure);
134028845213SAlan Somers 
13415c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, chown_success);
13425c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, chown_failure);
13435c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchown_success);
13445c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchown_failure);
13455c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, lchown_success);
13465c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, lchown_failure);
13475c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchownat_success);
13485c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchownat_failure);
13495c9a4738SAlan Somers 
135068e520feSAlan Somers 	ATF_TP_ADD_TC(tp, chflags_success);
135168e520feSAlan Somers 	ATF_TP_ADD_TC(tp, chflags_failure);
135268e520feSAlan Somers 	ATF_TP_ADD_TC(tp, fchflags_success);
135368e520feSAlan Somers 	ATF_TP_ADD_TC(tp, fchflags_failure);
135468e520feSAlan Somers 	ATF_TP_ADD_TC(tp, lchflags_success);
135568e520feSAlan Somers 	ATF_TP_ADD_TC(tp, lchflags_failure);
1356*55cd4523SAlan Somers 	ATF_TP_ADD_TC(tp, chflagsat_success);
1357*55cd4523SAlan Somers 	ATF_TP_ADD_TC(tp, chflagsat_failure);
135868e520feSAlan Somers 
1359d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, utimes_success);
1360d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, utimes_failure);
1361d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, futimes_success);
1362d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, futimes_failure);
1363d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, lutimes_success);
1364d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, lutimes_failure);
1365d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, futimesat_success);
1366d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, futimesat_failure);
1367d1fb351cSAlan Somers 
1368d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, mprotect_success);
1369d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, mprotect_failure);
1370d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, undelete_failure);
1371d1fb351cSAlan Somers 
1372844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_set_file_success);
1373844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_set_file_failure);
1374844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_set_fd_success);
1375844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_set_fd_failure);
1376844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_set_link_success);
1377844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_set_link_failure);
1378844fc5ebSAlan Somers 
1379844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_delete_file_success);
1380844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_delete_file_failure);
1381844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_delete_fd_success);
1382844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_delete_fd_failure);
1383844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_delete_link_success);
1384844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_delete_link_failure);
1385844fc5ebSAlan Somers 
13866d203d2dSAlan Somers 	return (atf_no_error());
13876d203d2dSAlan Somers }
1388