xref: /freebsd/tests/sys/audit/file-attribute-modify.c (revision 40407d3998d1a12cbe929721f4dbe72b4be478a6)
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>
36*40407d39SAlex Richardson #include <errno.h>
376d203d2dSAlan Somers #include <fcntl.h>
38d1fb351cSAlan Somers #include <stdint.h>
396d203d2dSAlan Somers #include <unistd.h>
406d203d2dSAlan Somers 
416d203d2dSAlan Somers #include "utils.h"
426d203d2dSAlan Somers 
436d203d2dSAlan Somers static pid_t pid;
445c9a4738SAlan Somers static uid_t uid = -1;
455c9a4738SAlan Somers static gid_t gid = -1;
46844fc5ebSAlan Somers static int filedesc, retval;
476d203d2dSAlan Somers static struct pollfd fds[1];
486d203d2dSAlan Somers static mode_t mode = 0777;
496d203d2dSAlan Somers static char extregex[80];
505641c23fSAlan Somers static char buff[] = "ezio";
516d203d2dSAlan Somers static const char *auclass = "fm";
52844fc5ebSAlan Somers static const char *name = "authorname";
536d203d2dSAlan Somers static const char *path = "fileforaudit";
5428845213SAlan Somers static const char *errpath = "adirhasnoname/fileforaudit";
5528845213SAlan Somers static const char *successreg = "fileforaudit.*return,success";
5628845213SAlan Somers static const char *failurereg = "fileforaudit.*return,failure";
576d203d2dSAlan Somers 
586d203d2dSAlan Somers 
596d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(flock_success);
606d203d2dSAlan Somers ATF_TC_HEAD(flock_success, tc)
616d203d2dSAlan Somers {
626d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
636d203d2dSAlan Somers 					"flock(2) call");
646d203d2dSAlan Somers }
656d203d2dSAlan Somers 
666d203d2dSAlan Somers ATF_TC_BODY(flock_success, tc)
676d203d2dSAlan Somers {
686d203d2dSAlan Somers 	pid = getpid();
696d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex), "flock.*%d.*return,success", pid);
706d203d2dSAlan Somers 
716d203d2dSAlan Somers 	/* File needs to exist to call flock(2) */
726d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
736d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
746d203d2dSAlan Somers 	ATF_REQUIRE_EQ(0, flock(filedesc, LOCK_SH));
756d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
766d203d2dSAlan Somers 	close(filedesc);
776d203d2dSAlan Somers }
786d203d2dSAlan Somers 
796d203d2dSAlan Somers ATF_TC_CLEANUP(flock_success, tc)
806d203d2dSAlan Somers {
816d203d2dSAlan Somers 	cleanup();
826d203d2dSAlan Somers }
836d203d2dSAlan Somers 
846d203d2dSAlan Somers 
856d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(flock_failure);
866d203d2dSAlan Somers ATF_TC_HEAD(flock_failure, tc)
876d203d2dSAlan Somers {
886d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
896d203d2dSAlan Somers 					"flock(2) call");
906d203d2dSAlan Somers }
916d203d2dSAlan Somers 
926d203d2dSAlan Somers ATF_TC_BODY(flock_failure, tc)
936d203d2dSAlan Somers {
946d203d2dSAlan Somers 	const char *regex = "flock.*return,failure : Bad file descriptor";
956d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
96*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(EBADF, flock(-1, LOCK_SH) == -1);
976d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
986d203d2dSAlan Somers }
996d203d2dSAlan Somers 
1006d203d2dSAlan Somers ATF_TC_CLEANUP(flock_failure, tc)
1016d203d2dSAlan Somers {
1026d203d2dSAlan Somers 	cleanup();
1036d203d2dSAlan Somers }
1046d203d2dSAlan Somers 
1056d203d2dSAlan Somers 
1066d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fcntl_success);
1076d203d2dSAlan Somers ATF_TC_HEAD(fcntl_success, tc)
1086d203d2dSAlan Somers {
1096d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1106d203d2dSAlan Somers 					"fcntl(2) call");
1116d203d2dSAlan Somers }
1126d203d2dSAlan Somers 
1136d203d2dSAlan Somers ATF_TC_BODY(fcntl_success, tc)
1146d203d2dSAlan Somers {
1156d203d2dSAlan Somers 	int flagstatus;
1166d203d2dSAlan Somers 	/* File needs to exist to call fcntl(2) */
1176d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1186d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1196d203d2dSAlan Somers 
1206d203d2dSAlan Somers 	/* Retrieve the status flags of 'filedesc' and store it in flagstatus */
1216d203d2dSAlan Somers 	ATF_REQUIRE((flagstatus = fcntl(filedesc, F_GETFL, 0)) != -1);
1226d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex),
1236d203d2dSAlan Somers 			"fcntl.*return,success,%d", flagstatus);
1246d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
1256d203d2dSAlan Somers 	close(filedesc);
1266d203d2dSAlan Somers }
1276d203d2dSAlan Somers 
1286d203d2dSAlan Somers ATF_TC_CLEANUP(fcntl_success, tc)
1296d203d2dSAlan Somers {
1306d203d2dSAlan Somers 	cleanup();
1316d203d2dSAlan Somers }
1326d203d2dSAlan Somers 
1336d203d2dSAlan Somers 
1346d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fcntl_failure);
1356d203d2dSAlan Somers ATF_TC_HEAD(fcntl_failure, tc)
1366d203d2dSAlan Somers {
1376d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1386d203d2dSAlan Somers 					"fcntl(2) call");
1396d203d2dSAlan Somers }
1406d203d2dSAlan Somers 
1416d203d2dSAlan Somers ATF_TC_BODY(fcntl_failure, tc)
1426d203d2dSAlan Somers {
1436d203d2dSAlan Somers 	const char *regex = "fcntl.*return,failure : Bad file descriptor";
1446d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
145*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(EBADF, fcntl(-1, F_GETFL, 0) == -1);
1466d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
1476d203d2dSAlan Somers }
1486d203d2dSAlan Somers 
1496d203d2dSAlan Somers ATF_TC_CLEANUP(fcntl_failure, tc)
1506d203d2dSAlan Somers {
1516d203d2dSAlan Somers 	cleanup();
1526d203d2dSAlan Somers }
1536d203d2dSAlan Somers 
1546d203d2dSAlan Somers 
1556d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fsync_success);
1566d203d2dSAlan Somers ATF_TC_HEAD(fsync_success, tc)
1576d203d2dSAlan Somers {
1586d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1596d203d2dSAlan Somers 					"fsync(2) call");
1606d203d2dSAlan Somers }
1616d203d2dSAlan Somers 
1626d203d2dSAlan Somers ATF_TC_BODY(fsync_success, tc)
1636d203d2dSAlan Somers {
1646d203d2dSAlan Somers 	pid = getpid();
1656d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex), "fsync.*%d.*return,success", pid);
1666d203d2dSAlan Somers 
1676d203d2dSAlan Somers 	/* File needs to exist to call fsync(2) */
1686d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1696d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1706d203d2dSAlan Somers 	ATF_REQUIRE_EQ(0, fsync(filedesc));
1716d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
1726d203d2dSAlan Somers 	close(filedesc);
1736d203d2dSAlan Somers }
1746d203d2dSAlan Somers 
1756d203d2dSAlan Somers ATF_TC_CLEANUP(fsync_success, tc)
1766d203d2dSAlan Somers {
1776d203d2dSAlan Somers 	cleanup();
1786d203d2dSAlan Somers }
1796d203d2dSAlan Somers 
1806d203d2dSAlan Somers 
1816d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fsync_failure);
1826d203d2dSAlan Somers ATF_TC_HEAD(fsync_failure, tc)
1836d203d2dSAlan Somers {
1846d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1856d203d2dSAlan Somers 					"fsync(2) call");
1866d203d2dSAlan Somers }
1876d203d2dSAlan Somers 
1886d203d2dSAlan Somers ATF_TC_BODY(fsync_failure, tc)
1896d203d2dSAlan Somers {
1906d203d2dSAlan Somers 	const char *regex = "fsync.*return,failure : Bad file descriptor";
1916d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1926d203d2dSAlan Somers 	/* Failure reason: Invalid file descriptor */
193*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(EBADF, fsync(-1) == -1);
1946d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
1956d203d2dSAlan Somers }
1966d203d2dSAlan Somers 
1976d203d2dSAlan Somers ATF_TC_CLEANUP(fsync_failure, tc)
1986d203d2dSAlan Somers {
1996d203d2dSAlan Somers 	cleanup();
2006d203d2dSAlan Somers }
2016d203d2dSAlan Somers 
2026d203d2dSAlan Somers 
20328845213SAlan Somers ATF_TC_WITH_CLEANUP(chmod_success);
20428845213SAlan Somers ATF_TC_HEAD(chmod_success, tc)
20528845213SAlan Somers {
20628845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
20728845213SAlan Somers 					"chmod(2) call");
20828845213SAlan Somers }
20928845213SAlan Somers 
21028845213SAlan Somers ATF_TC_BODY(chmod_success, tc)
21128845213SAlan Somers {
21228845213SAlan Somers 	/* File needs to exist to call chmod(2) */
21328845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
21428845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
21528845213SAlan Somers 	ATF_REQUIRE_EQ(0, chmod(path, mode));
21628845213SAlan Somers 	check_audit(fds, successreg, pipefd);
21728845213SAlan Somers 	close(filedesc);
21828845213SAlan Somers }
21928845213SAlan Somers 
22028845213SAlan Somers ATF_TC_CLEANUP(chmod_success, tc)
22128845213SAlan Somers {
22228845213SAlan Somers 	cleanup();
22328845213SAlan Somers }
22428845213SAlan Somers 
22528845213SAlan Somers 
22628845213SAlan Somers ATF_TC_WITH_CLEANUP(chmod_failure);
22728845213SAlan Somers ATF_TC_HEAD(chmod_failure, tc)
22828845213SAlan Somers {
22928845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
23028845213SAlan Somers 					"chmod(2) call");
23128845213SAlan Somers }
23228845213SAlan Somers 
23328845213SAlan Somers ATF_TC_BODY(chmod_failure, tc)
23428845213SAlan Somers {
23528845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
23628845213SAlan Somers 	/* Failure reason: file does not exist */
237*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT, chmod(errpath, mode) == -1);
23828845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
23928845213SAlan Somers }
24028845213SAlan Somers 
24128845213SAlan Somers ATF_TC_CLEANUP(chmod_failure, tc)
24228845213SAlan Somers {
24328845213SAlan Somers 	cleanup();
24428845213SAlan Somers }
24528845213SAlan Somers 
24628845213SAlan Somers 
24728845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmod_success);
24828845213SAlan Somers ATF_TC_HEAD(fchmod_success, tc)
24928845213SAlan Somers {
25028845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
25128845213SAlan Somers 					"fchmod(2) call");
25228845213SAlan Somers }
25328845213SAlan Somers 
25428845213SAlan Somers ATF_TC_BODY(fchmod_success, tc)
25528845213SAlan Somers {
25628845213SAlan Somers 	pid = getpid();
25728845213SAlan Somers 	snprintf(extregex, sizeof(extregex), "fchmod.*%d.*return,success", pid);
25828845213SAlan Somers 
25928845213SAlan Somers 	/* File needs to exist to call fchmod(2) */
26028845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
26128845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
26228845213SAlan Somers 	ATF_REQUIRE_EQ(0, fchmod(filedesc, mode));
26328845213SAlan Somers 	check_audit(fds, extregex, pipefd);
26428845213SAlan Somers 	close(filedesc);
26528845213SAlan Somers }
26628845213SAlan Somers 
26728845213SAlan Somers ATF_TC_CLEANUP(fchmod_success, tc)
26828845213SAlan Somers {
26928845213SAlan Somers 	cleanup();
27028845213SAlan Somers }
27128845213SAlan Somers 
27228845213SAlan Somers 
27328845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmod_failure);
27428845213SAlan Somers ATF_TC_HEAD(fchmod_failure, tc)
27528845213SAlan Somers {
27628845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
27728845213SAlan Somers 					"fchmod(2) call");
27828845213SAlan Somers }
27928845213SAlan Somers 
28028845213SAlan Somers ATF_TC_BODY(fchmod_failure, tc)
28128845213SAlan Somers {
28228845213SAlan Somers 	const char *regex = "fchmod.*return,failure : Bad file descriptor";
28328845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
28428845213SAlan Somers 	/* Failure reason: Invalid file descriptor */
285*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(EBADF, fchmod(-1, mode) == -1);
28628845213SAlan Somers 	check_audit(fds, regex, pipefd);
28728845213SAlan Somers }
28828845213SAlan Somers 
28928845213SAlan Somers ATF_TC_CLEANUP(fchmod_failure, tc)
29028845213SAlan Somers {
29128845213SAlan Somers 	cleanup();
29228845213SAlan Somers }
29328845213SAlan Somers 
29428845213SAlan Somers 
29528845213SAlan Somers ATF_TC_WITH_CLEANUP(lchmod_success);
29628845213SAlan Somers ATF_TC_HEAD(lchmod_success, tc)
29728845213SAlan Somers {
29828845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
29928845213SAlan Somers 					"lchmod(2) call");
30028845213SAlan Somers }
30128845213SAlan Somers 
30228845213SAlan Somers ATF_TC_BODY(lchmod_success, tc)
30328845213SAlan Somers {
30428845213SAlan Somers 	/* Symbolic link needs to exist to call lchmod(2) */
30528845213SAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
30628845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
30728845213SAlan Somers 	ATF_REQUIRE_EQ(0, lchmod(path, mode));
30828845213SAlan Somers 	check_audit(fds, successreg, pipefd);
30928845213SAlan Somers }
31028845213SAlan Somers 
31128845213SAlan Somers ATF_TC_CLEANUP(lchmod_success, tc)
31228845213SAlan Somers {
31328845213SAlan Somers 	cleanup();
31428845213SAlan Somers }
31528845213SAlan Somers 
31628845213SAlan Somers 
31728845213SAlan Somers ATF_TC_WITH_CLEANUP(lchmod_failure);
31828845213SAlan Somers ATF_TC_HEAD(lchmod_failure, tc)
31928845213SAlan Somers {
32028845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
32128845213SAlan Somers 					"lchmod(2) call");
32228845213SAlan Somers }
32328845213SAlan Somers 
32428845213SAlan Somers ATF_TC_BODY(lchmod_failure, tc)
32528845213SAlan Somers {
32628845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
32728845213SAlan Somers 	/* Failure reason: file does not exist */
328*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT, lchmod(errpath, mode) == -1);
32928845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
33028845213SAlan Somers }
33128845213SAlan Somers 
33228845213SAlan Somers ATF_TC_CLEANUP(lchmod_failure, tc)
33328845213SAlan Somers {
33428845213SAlan Somers 	cleanup();
33528845213SAlan Somers }
33628845213SAlan Somers 
33728845213SAlan Somers 
33828845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmodat_success);
33928845213SAlan Somers ATF_TC_HEAD(fchmodat_success, tc)
34028845213SAlan Somers {
34128845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
34228845213SAlan Somers 					"fchmodat(2) call");
34328845213SAlan Somers }
34428845213SAlan Somers 
34528845213SAlan Somers ATF_TC_BODY(fchmodat_success, tc)
34628845213SAlan Somers {
34728845213SAlan Somers 	/* File needs to exist to call fchmodat(2) */
34828845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
34928845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
35028845213SAlan Somers 	ATF_REQUIRE_EQ(0, fchmodat(AT_FDCWD, path, mode, 0));
35128845213SAlan Somers 	check_audit(fds, successreg, pipefd);
35228845213SAlan Somers 	close(filedesc);
35328845213SAlan Somers }
35428845213SAlan Somers 
35528845213SAlan Somers ATF_TC_CLEANUP(fchmodat_success, tc)
35628845213SAlan Somers {
35728845213SAlan Somers 	cleanup();
35828845213SAlan Somers }
35928845213SAlan Somers 
36028845213SAlan Somers 
36128845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmodat_failure);
36228845213SAlan Somers ATF_TC_HEAD(fchmodat_failure, tc)
36328845213SAlan Somers {
36428845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
36528845213SAlan Somers 					"fchmodat(2) call");
36628845213SAlan Somers }
36728845213SAlan Somers 
36828845213SAlan Somers ATF_TC_BODY(fchmodat_failure, tc)
36928845213SAlan Somers {
37028845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
37128845213SAlan Somers 	/* Failure reason: file does not exist */
372*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT, fchmodat(AT_FDCWD, errpath, mode, 0) == -1);
37328845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
37428845213SAlan Somers }
37528845213SAlan Somers 
37628845213SAlan Somers ATF_TC_CLEANUP(fchmodat_failure, tc)
37728845213SAlan Somers {
37828845213SAlan Somers 	cleanup();
37928845213SAlan Somers }
38028845213SAlan Somers 
38128845213SAlan Somers 
3825c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(chown_success);
3835c9a4738SAlan Somers ATF_TC_HEAD(chown_success, tc)
3845c9a4738SAlan Somers {
3855c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
3865c9a4738SAlan Somers 					"chown(2) call");
3875c9a4738SAlan Somers }
3885c9a4738SAlan Somers 
3895c9a4738SAlan Somers ATF_TC_BODY(chown_success, tc)
3905c9a4738SAlan Somers {
3915c9a4738SAlan Somers 	/* File needs to exist to call chown(2) */
3925c9a4738SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
3935c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
3945c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, chown(path, uid, gid));
3955c9a4738SAlan Somers 	check_audit(fds, successreg, pipefd);
3965c9a4738SAlan Somers 	close(filedesc);
3975c9a4738SAlan Somers }
3985c9a4738SAlan Somers 
3995c9a4738SAlan Somers ATF_TC_CLEANUP(chown_success, tc)
4005c9a4738SAlan Somers {
4015c9a4738SAlan Somers 	cleanup();
4025c9a4738SAlan Somers }
4035c9a4738SAlan Somers 
4045c9a4738SAlan Somers 
4055c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(chown_failure);
4065c9a4738SAlan Somers ATF_TC_HEAD(chown_failure, tc)
4075c9a4738SAlan Somers {
4085c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
4095c9a4738SAlan Somers 					"chown(2) call");
4105c9a4738SAlan Somers }
4115c9a4738SAlan Somers 
4125c9a4738SAlan Somers ATF_TC_BODY(chown_failure, tc)
4135c9a4738SAlan Somers {
4145c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
4155c9a4738SAlan Somers 	/* Failure reason: file does not exist */
416*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT, chown(errpath, uid, gid) == -1);
4175c9a4738SAlan Somers 	check_audit(fds, failurereg, pipefd);
4185c9a4738SAlan Somers }
4195c9a4738SAlan Somers 
4205c9a4738SAlan Somers ATF_TC_CLEANUP(chown_failure, tc)
4215c9a4738SAlan Somers {
4225c9a4738SAlan Somers 	cleanup();
4235c9a4738SAlan Somers }
4245c9a4738SAlan Somers 
4255c9a4738SAlan Somers 
4265c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchown_success);
4275c9a4738SAlan Somers ATF_TC_HEAD(fchown_success, tc)
4285c9a4738SAlan Somers {
4295c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
4305c9a4738SAlan Somers 					"fchown(2) call");
4315c9a4738SAlan Somers }
4325c9a4738SAlan Somers 
4335c9a4738SAlan Somers ATF_TC_BODY(fchown_success, tc)
4345c9a4738SAlan Somers {
4355c9a4738SAlan Somers 	pid = getpid();
4365c9a4738SAlan Somers 	snprintf(extregex, sizeof(extregex), "fchown.*%d.*return,success", pid);
4375c9a4738SAlan Somers 
4385c9a4738SAlan Somers 	/* File needs to exist to call fchown(2) */
4395c9a4738SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
4405c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
4415c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, fchown(filedesc, uid, gid));
4425c9a4738SAlan Somers 	check_audit(fds, extregex, pipefd);
4435c9a4738SAlan Somers 	close(filedesc);
4445c9a4738SAlan Somers }
4455c9a4738SAlan Somers 
4465c9a4738SAlan Somers ATF_TC_CLEANUP(fchown_success, tc)
4475c9a4738SAlan Somers {
4485c9a4738SAlan Somers 	cleanup();
4495c9a4738SAlan Somers }
4505c9a4738SAlan Somers 
4515c9a4738SAlan Somers 
4525c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchown_failure);
4535c9a4738SAlan Somers ATF_TC_HEAD(fchown_failure, tc)
4545c9a4738SAlan Somers {
4555c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
4565c9a4738SAlan Somers 					"fchown(2) call");
4575c9a4738SAlan Somers }
4585c9a4738SAlan Somers 
4595c9a4738SAlan Somers ATF_TC_BODY(fchown_failure, tc)
4605c9a4738SAlan Somers {
4615c9a4738SAlan Somers 	const char *regex = "fchown.*return,failure : Bad file descriptor";
4625c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
4635c9a4738SAlan Somers 	/* Failure reason: Invalid file descriptor */
464*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(EBADF, fchown(-1, uid, gid) == -1);
4655c9a4738SAlan Somers 	check_audit(fds, regex, pipefd);
4665c9a4738SAlan Somers }
4675c9a4738SAlan Somers 
4685c9a4738SAlan Somers ATF_TC_CLEANUP(fchown_failure, tc)
4695c9a4738SAlan Somers {
4705c9a4738SAlan Somers 	cleanup();
4715c9a4738SAlan Somers }
4725c9a4738SAlan Somers 
4735c9a4738SAlan Somers 
4745c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(lchown_success);
4755c9a4738SAlan Somers ATF_TC_HEAD(lchown_success, tc)
4765c9a4738SAlan Somers {
4775c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
4785c9a4738SAlan Somers 					"lchown(2) call");
4795c9a4738SAlan Somers }
4805c9a4738SAlan Somers 
4815c9a4738SAlan Somers ATF_TC_BODY(lchown_success, tc)
4825c9a4738SAlan Somers {
4835c9a4738SAlan Somers 	/* Symbolic link needs to exist to call lchown(2) */
4845c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
4855c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
4865c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, lchown(path, uid, gid));
4875c9a4738SAlan Somers 	check_audit(fds, successreg, pipefd);
4885c9a4738SAlan Somers }
4895c9a4738SAlan Somers 
4905c9a4738SAlan Somers ATF_TC_CLEANUP(lchown_success, tc)
4915c9a4738SAlan Somers {
4925c9a4738SAlan Somers 	cleanup();
4935c9a4738SAlan Somers }
4945c9a4738SAlan Somers 
4955c9a4738SAlan Somers 
4965c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(lchown_failure);
4975c9a4738SAlan Somers ATF_TC_HEAD(lchown_failure, tc)
4985c9a4738SAlan Somers {
4995c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
5005c9a4738SAlan Somers 					"lchown(2) call");
5015c9a4738SAlan Somers }
5025c9a4738SAlan Somers 
5035c9a4738SAlan Somers ATF_TC_BODY(lchown_failure, tc)
5045c9a4738SAlan Somers {
5055c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
5065c9a4738SAlan Somers 	/* Failure reason: Symbolic link does not exist */
507*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT, lchown(errpath, uid, gid) == -1);
5085c9a4738SAlan Somers 	check_audit(fds, failurereg, pipefd);
5095c9a4738SAlan Somers }
5105c9a4738SAlan Somers 
5115c9a4738SAlan Somers ATF_TC_CLEANUP(lchown_failure, tc)
5125c9a4738SAlan Somers {
5135c9a4738SAlan Somers 	cleanup();
5145c9a4738SAlan Somers }
5155c9a4738SAlan Somers 
5165c9a4738SAlan Somers 
5175c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchownat_success);
5185c9a4738SAlan Somers ATF_TC_HEAD(fchownat_success, tc)
5195c9a4738SAlan Somers {
5205c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
5215c9a4738SAlan Somers 					"fchownat(2) call");
5225c9a4738SAlan Somers }
5235c9a4738SAlan Somers 
5245c9a4738SAlan Somers ATF_TC_BODY(fchownat_success, tc)
5255c9a4738SAlan Somers {
5265c9a4738SAlan Somers 	/* File needs to exist to call fchownat(2) */
5275c9a4738SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
5285c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
5295c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, fchownat(AT_FDCWD, path, uid, gid, 0));
5305c9a4738SAlan Somers 	check_audit(fds, successreg, pipefd);
5315c9a4738SAlan Somers 	close(filedesc);
5325c9a4738SAlan Somers }
5335c9a4738SAlan Somers 
5345c9a4738SAlan Somers ATF_TC_CLEANUP(fchownat_success, tc)
5355c9a4738SAlan Somers {
5365c9a4738SAlan Somers 	cleanup();
5375c9a4738SAlan Somers }
5385c9a4738SAlan Somers 
5395c9a4738SAlan Somers 
5405c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchownat_failure);
5415c9a4738SAlan Somers ATF_TC_HEAD(fchownat_failure, tc)
5425c9a4738SAlan Somers {
5435c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
5445c9a4738SAlan Somers 					"fchownat(2) call");
5455c9a4738SAlan Somers }
5465c9a4738SAlan Somers 
5475c9a4738SAlan Somers ATF_TC_BODY(fchownat_failure, tc)
5485c9a4738SAlan Somers {
5495c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
5505c9a4738SAlan Somers 	/* Failure reason: file does not exist */
551*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT,
552*40407d39SAlex Richardson 	    fchownat(AT_FDCWD, errpath, uid, gid, 0) == -1);
5535c9a4738SAlan Somers 	check_audit(fds, failurereg, pipefd);
5545c9a4738SAlan Somers }
5555c9a4738SAlan Somers 
5565c9a4738SAlan Somers ATF_TC_CLEANUP(fchownat_failure, tc)
5575c9a4738SAlan Somers {
5585c9a4738SAlan Somers 	cleanup();
5595c9a4738SAlan Somers }
5605c9a4738SAlan Somers 
5615c9a4738SAlan Somers 
56268e520feSAlan Somers ATF_TC_WITH_CLEANUP(chflags_success);
56368e520feSAlan Somers ATF_TC_HEAD(chflags_success, tc)
56468e520feSAlan Somers {
56568e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
56668e520feSAlan Somers 					"chflags(2) call");
56768e520feSAlan Somers }
56868e520feSAlan Somers 
56968e520feSAlan Somers ATF_TC_BODY(chflags_success, tc)
57068e520feSAlan Somers {
57168e520feSAlan Somers 	/* File needs to exist to call chflags(2) */
57268e520feSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
57368e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
57468e520feSAlan Somers 	ATF_REQUIRE_EQ(0, chflags(path, UF_OFFLINE));
57568e520feSAlan Somers 	check_audit(fds, successreg, pipefd);
57668e520feSAlan Somers 	close(filedesc);
57768e520feSAlan Somers }
57868e520feSAlan Somers 
57968e520feSAlan Somers ATF_TC_CLEANUP(chflags_success, tc)
58068e520feSAlan Somers {
58168e520feSAlan Somers 	cleanup();
58268e520feSAlan Somers }
58368e520feSAlan Somers 
58468e520feSAlan Somers 
58568e520feSAlan Somers ATF_TC_WITH_CLEANUP(chflags_failure);
58668e520feSAlan Somers ATF_TC_HEAD(chflags_failure, tc)
58768e520feSAlan Somers {
58868e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
58968e520feSAlan Somers 					"chflags(2) call");
59068e520feSAlan Somers }
59168e520feSAlan Somers 
59268e520feSAlan Somers ATF_TC_BODY(chflags_failure, tc)
59368e520feSAlan Somers {
59468e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
59568e520feSAlan Somers 	/* Failure reason: file does not exist */
596*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT, chflags(errpath, UF_OFFLINE) == -1);
59768e520feSAlan Somers 	check_audit(fds, failurereg, pipefd);
59868e520feSAlan Somers }
59968e520feSAlan Somers 
60068e520feSAlan Somers ATF_TC_CLEANUP(chflags_failure, tc)
60168e520feSAlan Somers {
60268e520feSAlan Somers 	cleanup();
60368e520feSAlan Somers }
60468e520feSAlan Somers 
60568e520feSAlan Somers 
60668e520feSAlan Somers ATF_TC_WITH_CLEANUP(fchflags_success);
60768e520feSAlan Somers ATF_TC_HEAD(fchflags_success, tc)
60868e520feSAlan Somers {
60968e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
61068e520feSAlan Somers 					"fchflags(2) call");
61168e520feSAlan Somers }
61268e520feSAlan Somers 
61368e520feSAlan Somers ATF_TC_BODY(fchflags_success, tc)
61468e520feSAlan Somers {
61568e520feSAlan Somers 	pid = getpid();
61668e520feSAlan Somers 	snprintf(extregex, sizeof(extregex), "fchflags.*%d.*ret.*success", pid);
61768e520feSAlan Somers 	/* File needs to exist to call fchflags(2) */
61868e520feSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
61968e520feSAlan Somers 
62068e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
62168e520feSAlan Somers 	ATF_REQUIRE_EQ(0, fchflags(filedesc, UF_OFFLINE));
62268e520feSAlan Somers 	check_audit(fds, extregex, pipefd);
62368e520feSAlan Somers 	close(filedesc);
62468e520feSAlan Somers }
62568e520feSAlan Somers 
62668e520feSAlan Somers ATF_TC_CLEANUP(fchflags_success, tc)
62768e520feSAlan Somers {
62868e520feSAlan Somers 	cleanup();
62968e520feSAlan Somers }
63068e520feSAlan Somers 
63168e520feSAlan Somers 
63268e520feSAlan Somers ATF_TC_WITH_CLEANUP(fchflags_failure);
63368e520feSAlan Somers ATF_TC_HEAD(fchflags_failure, tc)
63468e520feSAlan Somers {
63568e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
63668e520feSAlan Somers 					"fchflags(2) call");
63768e520feSAlan Somers }
63868e520feSAlan Somers 
63968e520feSAlan Somers ATF_TC_BODY(fchflags_failure, tc)
64068e520feSAlan Somers {
64168e520feSAlan Somers 	const char *regex = "fchflags.*return,failure : Bad file descriptor";
64268e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
64368e520feSAlan Somers 	/* Failure reason: Invalid file descriptor */
644*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(EBADF, fchflags(-1, UF_OFFLINE) == -1);
64568e520feSAlan Somers 	check_audit(fds, regex, pipefd);
64668e520feSAlan Somers }
64768e520feSAlan Somers 
64868e520feSAlan Somers ATF_TC_CLEANUP(fchflags_failure, tc)
64968e520feSAlan Somers {
65068e520feSAlan Somers 	cleanup();
65168e520feSAlan Somers }
65268e520feSAlan Somers 
65368e520feSAlan Somers 
65468e520feSAlan Somers ATF_TC_WITH_CLEANUP(lchflags_success);
65568e520feSAlan Somers ATF_TC_HEAD(lchflags_success, tc)
65668e520feSAlan Somers {
65768e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
65868e520feSAlan Somers 					"lchflags(2) call");
65968e520feSAlan Somers }
66068e520feSAlan Somers 
66168e520feSAlan Somers ATF_TC_BODY(lchflags_success, tc)
66268e520feSAlan Somers {
66368e520feSAlan Somers 	/* Symbolic link needs to exist to call lchflags(2) */
66468e520feSAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
66568e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
66668e520feSAlan Somers 	ATF_REQUIRE_EQ(0, lchflags(path, UF_OFFLINE));
66768e520feSAlan Somers 	check_audit(fds, successreg, pipefd);
66868e520feSAlan Somers }
66968e520feSAlan Somers 
67068e520feSAlan Somers ATF_TC_CLEANUP(lchflags_success, tc)
67168e520feSAlan Somers {
67268e520feSAlan Somers 	cleanup();
67368e520feSAlan Somers }
67468e520feSAlan Somers 
67568e520feSAlan Somers 
67668e520feSAlan Somers ATF_TC_WITH_CLEANUP(lchflags_failure);
67768e520feSAlan Somers ATF_TC_HEAD(lchflags_failure, tc)
67868e520feSAlan Somers {
67968e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
68068e520feSAlan Somers 					"lchflags(2) call");
68168e520feSAlan Somers }
68268e520feSAlan Somers 
68368e520feSAlan Somers ATF_TC_BODY(lchflags_failure, tc)
68468e520feSAlan Somers {
68568e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
68668e520feSAlan Somers 	/* Failure reason: Symbolic link does not exist */
687*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT, lchflags(errpath, UF_OFFLINE) == -1);
68868e520feSAlan Somers 	check_audit(fds, failurereg, pipefd);
68968e520feSAlan Somers }
69068e520feSAlan Somers 
69168e520feSAlan Somers ATF_TC_CLEANUP(lchflags_failure, tc)
69268e520feSAlan Somers {
69368e520feSAlan Somers 	cleanup();
69468e520feSAlan Somers }
69568e520feSAlan Somers 
69668e520feSAlan Somers 
69755cd4523SAlan Somers ATF_TC_WITH_CLEANUP(chflagsat_success);
69855cd4523SAlan Somers ATF_TC_HEAD(chflagsat_success, tc)
69955cd4523SAlan Somers {
70055cd4523SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
70155cd4523SAlan Somers 					"chflagsat(2) call");
70255cd4523SAlan Somers }
70355cd4523SAlan Somers 
70455cd4523SAlan Somers ATF_TC_BODY(chflagsat_success, tc)
70555cd4523SAlan Somers {
70655cd4523SAlan Somers 	/* File needs to exist to call chflagsat(2) */
70755cd4523SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
70855cd4523SAlan Somers 	FILE *pipefd = setup(fds, auclass);
709cdb9318eSEnji Cooper 	ATF_REQUIRE_EQ(0, chflagsat(AT_FDCWD, path, UF_OFFLINE, 0));
71055cd4523SAlan Somers 	check_audit(fds, successreg, pipefd);
71155cd4523SAlan Somers 	close(filedesc);
71255cd4523SAlan Somers }
71355cd4523SAlan Somers 
71455cd4523SAlan Somers ATF_TC_CLEANUP(chflagsat_success, tc)
71555cd4523SAlan Somers {
71655cd4523SAlan Somers 	cleanup();
71755cd4523SAlan Somers }
71855cd4523SAlan Somers 
71955cd4523SAlan Somers 
72055cd4523SAlan Somers ATF_TC_WITH_CLEANUP(chflagsat_failure);
72155cd4523SAlan Somers ATF_TC_HEAD(chflagsat_failure, tc)
72255cd4523SAlan Somers {
72355cd4523SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
72455cd4523SAlan Somers 					"chflagsat(2) call");
72555cd4523SAlan Somers }
72655cd4523SAlan Somers 
72755cd4523SAlan Somers ATF_TC_BODY(chflagsat_failure, tc)
72855cd4523SAlan Somers {
72955cd4523SAlan Somers 	FILE *pipefd = setup(fds, auclass);
73055cd4523SAlan Somers 	/* Failure reason: file does not exist */
731*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT,
732*40407d39SAlex Richardson 	    chflagsat(AT_FDCWD, errpath, UF_OFFLINE, 0) == -1);
73355cd4523SAlan Somers 	check_audit(fds, failurereg, pipefd);
73455cd4523SAlan Somers }
73555cd4523SAlan Somers 
73655cd4523SAlan Somers ATF_TC_CLEANUP(chflagsat_failure, tc)
73755cd4523SAlan Somers {
73855cd4523SAlan Somers 	cleanup();
73955cd4523SAlan Somers }
74055cd4523SAlan Somers 
74155cd4523SAlan Somers 
742d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(utimes_success);
743d1fb351cSAlan Somers ATF_TC_HEAD(utimes_success, tc)
744d1fb351cSAlan Somers {
745d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
746d1fb351cSAlan Somers 					"utimes(2) call");
747d1fb351cSAlan Somers }
748d1fb351cSAlan Somers 
749d1fb351cSAlan Somers ATF_TC_BODY(utimes_success, tc)
750d1fb351cSAlan Somers {
751d1fb351cSAlan Somers 	/* File needs to exist to call utimes(2) */
752d1fb351cSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
753d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
754d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(0, utimes(path, NULL));
755d1fb351cSAlan Somers 	check_audit(fds, successreg, pipefd);
756d1fb351cSAlan Somers 	close(filedesc);
757d1fb351cSAlan Somers }
758d1fb351cSAlan Somers 
759d1fb351cSAlan Somers ATF_TC_CLEANUP(utimes_success, tc)
760d1fb351cSAlan Somers {
761d1fb351cSAlan Somers 	cleanup();
762d1fb351cSAlan Somers }
763d1fb351cSAlan Somers 
764d1fb351cSAlan Somers 
765d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(utimes_failure);
766d1fb351cSAlan Somers ATF_TC_HEAD(utimes_failure, tc)
767d1fb351cSAlan Somers {
768d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
769d1fb351cSAlan Somers 					"utimes(2) call");
770d1fb351cSAlan Somers }
771d1fb351cSAlan Somers 
772d1fb351cSAlan Somers ATF_TC_BODY(utimes_failure, tc)
773d1fb351cSAlan Somers {
774d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
775d1fb351cSAlan Somers 	/* Failure reason: file does not exist */
776*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT, utimes(errpath, NULL) == -1);
777d1fb351cSAlan Somers 	check_audit(fds, failurereg, pipefd);
778d1fb351cSAlan Somers }
779d1fb351cSAlan Somers 
780d1fb351cSAlan Somers ATF_TC_CLEANUP(utimes_failure, tc)
781d1fb351cSAlan Somers {
782d1fb351cSAlan Somers 	cleanup();
783d1fb351cSAlan Somers }
784d1fb351cSAlan Somers 
785d1fb351cSAlan Somers 
786d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(futimes_success);
787d1fb351cSAlan Somers ATF_TC_HEAD(futimes_success, tc)
788d1fb351cSAlan Somers {
789d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
790d1fb351cSAlan Somers 					"futimes(2) call");
791d1fb351cSAlan Somers }
792d1fb351cSAlan Somers 
793d1fb351cSAlan Somers ATF_TC_BODY(futimes_success, tc)
794d1fb351cSAlan Somers {
795d1fb351cSAlan Somers 	pid = getpid();
796d1fb351cSAlan Somers 	snprintf(extregex, sizeof(extregex), "futimes.*%d.*ret.*success", pid);
797d1fb351cSAlan Somers 
798d1fb351cSAlan Somers 	/* File needs to exist to call futimes(2) */
799d1fb351cSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
800d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
801d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(0, futimes(filedesc, NULL));
802d1fb351cSAlan Somers 	check_audit(fds, extregex, pipefd);
803d1fb351cSAlan Somers 	close(filedesc);
804d1fb351cSAlan Somers }
805d1fb351cSAlan Somers 
806d1fb351cSAlan Somers ATF_TC_CLEANUP(futimes_success, tc)
807d1fb351cSAlan Somers {
808d1fb351cSAlan Somers 	cleanup();
809d1fb351cSAlan Somers }
810d1fb351cSAlan Somers 
811d1fb351cSAlan Somers 
812d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(futimes_failure);
813d1fb351cSAlan Somers ATF_TC_HEAD(futimes_failure, tc)
814d1fb351cSAlan Somers {
815d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
816d1fb351cSAlan Somers 					"futimes(2) call");
817d1fb351cSAlan Somers }
818d1fb351cSAlan Somers 
819d1fb351cSAlan Somers ATF_TC_BODY(futimes_failure, tc)
820d1fb351cSAlan Somers {
821d1fb351cSAlan Somers 	const char *regex = "futimes.*return,failure : Bad file descriptor";
822d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
823d1fb351cSAlan Somers 	/* Failure reason: Invalid file descriptor */
824*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(EBADF, futimes(-1, NULL) == -1);
825d1fb351cSAlan Somers 	check_audit(fds, regex, pipefd);
826d1fb351cSAlan Somers }
827d1fb351cSAlan Somers 
828d1fb351cSAlan Somers ATF_TC_CLEANUP(futimes_failure, tc)
829d1fb351cSAlan Somers {
830d1fb351cSAlan Somers 	cleanup();
831d1fb351cSAlan Somers }
832d1fb351cSAlan Somers 
833d1fb351cSAlan Somers 
834d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(lutimes_success);
835d1fb351cSAlan Somers ATF_TC_HEAD(lutimes_success, tc)
836d1fb351cSAlan Somers {
837d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
838d1fb351cSAlan Somers 					"lutimes(2) call");
839d1fb351cSAlan Somers }
840d1fb351cSAlan Somers 
841d1fb351cSAlan Somers ATF_TC_BODY(lutimes_success, tc)
842d1fb351cSAlan Somers {
843d1fb351cSAlan Somers 	/* Symbolic link needs to exist to call lutimes(2) */
844d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
845d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
846d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(0, lutimes(path, NULL));
847d1fb351cSAlan Somers 	check_audit(fds, successreg, pipefd);
848d1fb351cSAlan Somers }
849d1fb351cSAlan Somers 
850d1fb351cSAlan Somers ATF_TC_CLEANUP(lutimes_success, tc)
851d1fb351cSAlan Somers {
852d1fb351cSAlan Somers 	cleanup();
853d1fb351cSAlan Somers }
854d1fb351cSAlan Somers 
855d1fb351cSAlan Somers 
856d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(lutimes_failure);
857d1fb351cSAlan Somers ATF_TC_HEAD(lutimes_failure, tc)
858d1fb351cSAlan Somers {
859d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
860d1fb351cSAlan Somers 					"lutimes(2) call");
861d1fb351cSAlan Somers }
862d1fb351cSAlan Somers 
863d1fb351cSAlan Somers ATF_TC_BODY(lutimes_failure, tc)
864d1fb351cSAlan Somers {
865d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
866d1fb351cSAlan Somers 	/* Failure reason: symbolic link does not exist */
867*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT, lutimes(errpath, NULL) == -1);
868d1fb351cSAlan Somers 	check_audit(fds, failurereg, pipefd);
869d1fb351cSAlan Somers }
870d1fb351cSAlan Somers 
871d1fb351cSAlan Somers ATF_TC_CLEANUP(lutimes_failure, tc)
872d1fb351cSAlan Somers {
873d1fb351cSAlan Somers 	cleanup();
874d1fb351cSAlan Somers }
875d1fb351cSAlan Somers 
876d1fb351cSAlan Somers 
877d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(futimesat_success);
878d1fb351cSAlan Somers ATF_TC_HEAD(futimesat_success, tc)
879d1fb351cSAlan Somers {
880d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
881d1fb351cSAlan Somers 					"futimesat(2) call");
882d1fb351cSAlan Somers }
883d1fb351cSAlan Somers 
884d1fb351cSAlan Somers ATF_TC_BODY(futimesat_success, tc)
885d1fb351cSAlan Somers {
886d1fb351cSAlan Somers 	/* File needs to exist to call futimesat(2) */
887d1fb351cSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
888d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
889d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(0, futimesat(AT_FDCWD, path, NULL));
890d1fb351cSAlan Somers 	check_audit(fds, successreg, pipefd);
891d1fb351cSAlan Somers 	close(filedesc);
892d1fb351cSAlan Somers }
893d1fb351cSAlan Somers 
894d1fb351cSAlan Somers ATF_TC_CLEANUP(futimesat_success, tc)
895d1fb351cSAlan Somers {
896d1fb351cSAlan Somers 	cleanup();
897d1fb351cSAlan Somers }
898d1fb351cSAlan Somers 
899d1fb351cSAlan Somers 
900d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(futimesat_failure);
901d1fb351cSAlan Somers ATF_TC_HEAD(futimesat_failure, tc)
902d1fb351cSAlan Somers {
903d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
904d1fb351cSAlan Somers 					"futimesat(2) call");
905d1fb351cSAlan Somers }
906d1fb351cSAlan Somers 
907d1fb351cSAlan Somers ATF_TC_BODY(futimesat_failure, tc)
908d1fb351cSAlan Somers {
909d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
910d1fb351cSAlan Somers 	/* Failure reason: file does not exist */
911*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT, futimesat(AT_FDCWD, errpath, NULL) == -1);
912d1fb351cSAlan Somers 	check_audit(fds, failurereg, pipefd);
913d1fb351cSAlan Somers }
914d1fb351cSAlan Somers 
915d1fb351cSAlan Somers ATF_TC_CLEANUP(futimesat_failure, tc)
916d1fb351cSAlan Somers {
917d1fb351cSAlan Somers 	cleanup();
918d1fb351cSAlan Somers }
919d1fb351cSAlan Somers 
920d1fb351cSAlan Somers 
921d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(mprotect_success);
922d1fb351cSAlan Somers ATF_TC_HEAD(mprotect_success, tc)
923d1fb351cSAlan Somers {
924d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
925d1fb351cSAlan Somers 					"mprotect(2) call");
926d1fb351cSAlan Somers }
927d1fb351cSAlan Somers 
928d1fb351cSAlan Somers ATF_TC_BODY(mprotect_success, tc)
929d1fb351cSAlan Somers {
930d1fb351cSAlan Somers 	pid = getpid();
931d1fb351cSAlan Somers 	snprintf(extregex, sizeof(extregex), "mprotect.*%d.*ret.*success", pid);
932d1fb351cSAlan Somers 
933d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
934d1fb351cSAlan Somers 	ATF_REQUIRE_EQ(0, mprotect(NULL, 0, PROT_NONE));
935d1fb351cSAlan Somers 	check_audit(fds, extregex, pipefd);
936d1fb351cSAlan Somers }
937d1fb351cSAlan Somers 
938d1fb351cSAlan Somers ATF_TC_CLEANUP(mprotect_success, tc)
939d1fb351cSAlan Somers {
940d1fb351cSAlan Somers 	cleanup();
941d1fb351cSAlan Somers }
942d1fb351cSAlan Somers 
943d1fb351cSAlan Somers 
944d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(mprotect_failure);
945d1fb351cSAlan Somers ATF_TC_HEAD(mprotect_failure, tc)
946d1fb351cSAlan Somers {
947d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
948d1fb351cSAlan Somers 					"mprotect(2) call");
949d1fb351cSAlan Somers }
950d1fb351cSAlan Somers 
951d1fb351cSAlan Somers ATF_TC_BODY(mprotect_failure, tc)
952d1fb351cSAlan Somers {
953d1fb351cSAlan Somers 	const char *regex = "mprotect.*return,failure : Invalid argument";
954d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
955*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(EINVAL,
956*40407d39SAlex Richardson 	    mprotect((void *)SIZE_MAX, -1, PROT_NONE) == -1);
957d1fb351cSAlan Somers 	check_audit(fds, regex, pipefd);
958d1fb351cSAlan Somers }
959d1fb351cSAlan Somers 
960d1fb351cSAlan Somers ATF_TC_CLEANUP(mprotect_failure, tc)
961d1fb351cSAlan Somers {
962d1fb351cSAlan Somers 	cleanup();
963d1fb351cSAlan Somers }
964d1fb351cSAlan Somers 
965d1fb351cSAlan Somers /*
966d1fb351cSAlan Somers  * undelete(2) only works on whiteout files in union file system. Hence, no
967d1fb351cSAlan Somers  * test case for successful invocation.
968d1fb351cSAlan Somers  */
969d1fb351cSAlan Somers 
970d1fb351cSAlan Somers ATF_TC_WITH_CLEANUP(undelete_failure);
971d1fb351cSAlan Somers ATF_TC_HEAD(undelete_failure, tc)
972d1fb351cSAlan Somers {
973d1fb351cSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
974d1fb351cSAlan Somers 					"undelete(2) call");
975d1fb351cSAlan Somers }
976d1fb351cSAlan Somers 
977d1fb351cSAlan Somers ATF_TC_BODY(undelete_failure, tc)
978d1fb351cSAlan Somers {
979d1fb351cSAlan Somers 	pid = getpid();
980d1fb351cSAlan Somers 	snprintf(extregex, sizeof(extregex), "undelete.*%d.*ret.*failure", pid);
981d1fb351cSAlan Somers 
982d1fb351cSAlan Somers 	FILE *pipefd = setup(fds, auclass);
983d1fb351cSAlan Somers 	/* Failure reason: File does not exist */
984*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT, undelete(errpath) == -1);
985d1fb351cSAlan Somers 	check_audit(fds, extregex, pipefd);
986d1fb351cSAlan Somers }
987d1fb351cSAlan Somers 
988d1fb351cSAlan Somers ATF_TC_CLEANUP(undelete_failure, tc)
989d1fb351cSAlan Somers {
990d1fb351cSAlan Somers 	cleanup();
991d1fb351cSAlan Somers }
992d1fb351cSAlan Somers 
993d1fb351cSAlan Somers 
994844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_set_file_success);
995844fc5ebSAlan Somers ATF_TC_HEAD(extattr_set_file_success, tc)
996844fc5ebSAlan Somers {
997844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
998844fc5ebSAlan Somers 					"extattr_set_file(2) call");
999844fc5ebSAlan Somers }
1000844fc5ebSAlan Somers 
1001844fc5ebSAlan Somers ATF_TC_BODY(extattr_set_file_success, tc)
1002844fc5ebSAlan Somers {
1003844fc5ebSAlan Somers 	/* File needs to exist to call extattr_set_file(2) */
1004844fc5ebSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1005*40407d39SAlex Richardson 	skip_if_extattr_not_supported(path);
1006*40407d39SAlex Richardson 
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);
1012*40407d39SAlex Richardson 	REQUIRE_EXTATTR_RESULT(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 */
1039*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT,
1040*40407d39SAlex Richardson 	    extattr_set_file(path, EXTATTR_NAMESPACE_USER, name, NULL, 0) ==
1041*40407d39SAlex Richardson 		-1);
1042844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1043844fc5ebSAlan Somers }
1044844fc5ebSAlan Somers 
1045844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_set_file_failure, tc)
1046844fc5ebSAlan Somers {
1047844fc5ebSAlan Somers 	cleanup();
1048844fc5ebSAlan Somers }
1049844fc5ebSAlan Somers 
1050844fc5ebSAlan Somers 
1051844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_set_fd_success);
1052844fc5ebSAlan Somers ATF_TC_HEAD(extattr_set_fd_success, tc)
1053844fc5ebSAlan Somers {
1054844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1055844fc5ebSAlan Somers 					"extattr_set_fd(2) call");
1056844fc5ebSAlan Somers }
1057844fc5ebSAlan Somers 
1058844fc5ebSAlan Somers ATF_TC_BODY(extattr_set_fd_success, tc)
1059844fc5ebSAlan Somers {
1060844fc5ebSAlan Somers 	/* File needs to exist to call extattr_set_fd(2) */
1061844fc5ebSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1062*40407d39SAlex Richardson 	skip_if_extattr_not_supported(path);
1063844fc5ebSAlan Somers 
1064844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1065844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1066844fc5ebSAlan Somers 		"extattr_set_fd.*%s.*return,success", name);
1067844fc5ebSAlan Somers 
1068844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1069*40407d39SAlex Richardson 	REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_fd(filedesc,
1070844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1071844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1072844fc5ebSAlan Somers 	close(filedesc);
1073844fc5ebSAlan Somers }
1074844fc5ebSAlan Somers 
1075844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_set_fd_success, tc)
1076844fc5ebSAlan Somers {
1077844fc5ebSAlan Somers 	cleanup();
1078844fc5ebSAlan Somers }
1079844fc5ebSAlan Somers 
1080844fc5ebSAlan Somers 
1081844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_set_fd_failure);
1082844fc5ebSAlan Somers ATF_TC_HEAD(extattr_set_fd_failure, tc)
1083844fc5ebSAlan Somers {
1084844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1085844fc5ebSAlan Somers 					"extattr_set_fd(2) call");
1086844fc5ebSAlan Somers }
1087844fc5ebSAlan Somers 
1088844fc5ebSAlan Somers ATF_TC_BODY(extattr_set_fd_failure, tc)
1089844fc5ebSAlan Somers {
1090844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1091844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1092844fc5ebSAlan Somers 	"extattr_set_fd.*%s.*return,failure : Bad file descriptor", name);
1093844fc5ebSAlan Somers 
1094844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1095844fc5ebSAlan Somers 	/* Failure reason: Invalid file descriptor */
1096*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(EBADF,
1097*40407d39SAlex Richardson 	    extattr_set_fd(-1, EXTATTR_NAMESPACE_USER, name, NULL, 0) == -1);
1098844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1099844fc5ebSAlan Somers }
1100844fc5ebSAlan Somers 
1101844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_set_fd_failure, tc)
1102844fc5ebSAlan Somers {
1103844fc5ebSAlan Somers 	cleanup();
1104844fc5ebSAlan Somers }
1105844fc5ebSAlan Somers 
1106844fc5ebSAlan Somers 
1107844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_set_link_success);
1108844fc5ebSAlan Somers ATF_TC_HEAD(extattr_set_link_success, tc)
1109844fc5ebSAlan Somers {
1110844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1111844fc5ebSAlan Somers 					"extattr_set_link(2) call");
1112844fc5ebSAlan Somers }
1113844fc5ebSAlan Somers 
1114844fc5ebSAlan Somers ATF_TC_BODY(extattr_set_link_success, tc)
1115844fc5ebSAlan Somers {
1116844fc5ebSAlan Somers 	/* Symbolic link needs to exist to call extattr_set_link(2) */
1117844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
1118*40407d39SAlex Richardson 	skip_if_extattr_not_supported(".");
1119*40407d39SAlex Richardson 
1120844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1121844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1122844fc5ebSAlan Somers 		"extattr_set_link.*%s.*%s.*return,success", path, name);
1123844fc5ebSAlan Somers 
1124844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1125*40407d39SAlex Richardson 	REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_link(path,
1126844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1127844fc5ebSAlan Somers 
1128844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1129844fc5ebSAlan Somers }
1130844fc5ebSAlan Somers 
1131844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_set_link_success, tc)
1132844fc5ebSAlan Somers {
1133844fc5ebSAlan Somers 	cleanup();
1134844fc5ebSAlan Somers }
1135844fc5ebSAlan Somers 
1136844fc5ebSAlan Somers 
1137844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_set_link_failure);
1138844fc5ebSAlan Somers ATF_TC_HEAD(extattr_set_link_failure, tc)
1139844fc5ebSAlan Somers {
1140844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1141844fc5ebSAlan Somers 					"extattr_set_link(2) call");
1142844fc5ebSAlan Somers }
1143844fc5ebSAlan Somers 
1144844fc5ebSAlan Somers ATF_TC_BODY(extattr_set_link_failure, tc)
1145844fc5ebSAlan Somers {
1146844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1147844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1148844fc5ebSAlan Somers 		"extattr_set_link.*%s.*%s.*failure", path, name);
1149844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1150844fc5ebSAlan Somers 	/* Failure reason: symbolic link does not exist */
1151*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT,
1152*40407d39SAlex Richardson 	    extattr_set_link(path, EXTATTR_NAMESPACE_USER, name, NULL, 0) ==
1153*40407d39SAlex Richardson 		-1);
1154844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1155844fc5ebSAlan Somers }
1156844fc5ebSAlan Somers 
1157844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_set_link_failure, tc)
1158844fc5ebSAlan Somers {
1159844fc5ebSAlan Somers 	cleanup();
1160844fc5ebSAlan Somers }
1161844fc5ebSAlan Somers 
1162844fc5ebSAlan Somers 
1163844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_delete_file_success);
1164844fc5ebSAlan Somers ATF_TC_HEAD(extattr_delete_file_success, tc)
1165844fc5ebSAlan Somers {
1166844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1167844fc5ebSAlan Somers 					"extattr_delete_file(2) call");
1168844fc5ebSAlan Somers }
1169844fc5ebSAlan Somers 
1170844fc5ebSAlan Somers ATF_TC_BODY(extattr_delete_file_success, tc)
1171844fc5ebSAlan Somers {
1172844fc5ebSAlan Somers 	/* File needs to exist to call extattr_delete_file(2) */
1173844fc5ebSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1174*40407d39SAlex Richardson 	skip_if_extattr_not_supported(path);
1175*40407d39SAlex Richardson 
1176*40407d39SAlex Richardson 	REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_file(path,
1177844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1178844fc5ebSAlan Somers 
1179844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1180*40407d39SAlex Richardson 	retval = REQUIRE_EXTATTR_SUCCESS(
1181*40407d39SAlex Richardson 	    extattr_delete_file(path, EXTATTR_NAMESPACE_USER, name));
1182844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1183844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1184844fc5ebSAlan Somers 	"extattr_delete_file.*%s.*return,success,%d", path, retval);
1185844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1186844fc5ebSAlan Somers 	close(filedesc);
1187844fc5ebSAlan Somers }
1188844fc5ebSAlan Somers 
1189844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_delete_file_success, tc)
1190844fc5ebSAlan Somers {
1191844fc5ebSAlan Somers 	cleanup();
1192844fc5ebSAlan Somers }
1193844fc5ebSAlan Somers 
1194844fc5ebSAlan Somers 
1195844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_delete_file_failure);
1196844fc5ebSAlan Somers ATF_TC_HEAD(extattr_delete_file_failure, tc)
1197844fc5ebSAlan Somers {
1198844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1199844fc5ebSAlan Somers 					"extattr_delete_file(2) call");
1200844fc5ebSAlan Somers }
1201844fc5ebSAlan Somers 
1202844fc5ebSAlan Somers ATF_TC_BODY(extattr_delete_file_failure, tc)
1203844fc5ebSAlan Somers {
1204844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1205844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1206844fc5ebSAlan Somers 		"extattr_delete_file.*%s.*return,failure", path);
1207844fc5ebSAlan Somers 
1208844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1209844fc5ebSAlan Somers 	/* Failure reason: file does not exist */
1210*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT,
1211*40407d39SAlex Richardson 	    extattr_delete_file(path, EXTATTR_NAMESPACE_USER, name) == -1);
1212844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1213844fc5ebSAlan Somers }
1214844fc5ebSAlan Somers 
1215844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_delete_file_failure, tc)
1216844fc5ebSAlan Somers {
1217844fc5ebSAlan Somers 	cleanup();
1218844fc5ebSAlan Somers }
1219844fc5ebSAlan Somers 
1220844fc5ebSAlan Somers 
1221844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_delete_fd_success);
1222844fc5ebSAlan Somers ATF_TC_HEAD(extattr_delete_fd_success, tc)
1223844fc5ebSAlan Somers {
1224844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1225844fc5ebSAlan Somers 					"extattr_delete_fd(2) call");
1226844fc5ebSAlan Somers }
1227844fc5ebSAlan Somers 
1228844fc5ebSAlan Somers ATF_TC_BODY(extattr_delete_fd_success, tc)
1229844fc5ebSAlan Somers {
1230844fc5ebSAlan Somers 	/* File needs to exist to call extattr_delete_fd(2) */
1231844fc5ebSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1232*40407d39SAlex Richardson 	skip_if_extattr_not_supported(path);
1233*40407d39SAlex Richardson 
1234*40407d39SAlex Richardson 	REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_file(path,
1235844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1236844fc5ebSAlan Somers 
1237844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1238*40407d39SAlex Richardson 	retval = REQUIRE_EXTATTR_SUCCESS(extattr_delete_fd(filedesc,
1239*40407d39SAlex Richardson 		EXTATTR_NAMESPACE_USER, name));
1240844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1241844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1242844fc5ebSAlan Somers 		"extattr_delete_fd.*return,success,%d", retval);
1243844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1244844fc5ebSAlan Somers 	close(filedesc);
1245844fc5ebSAlan Somers }
1246844fc5ebSAlan Somers 
1247844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_delete_fd_success, tc)
1248844fc5ebSAlan Somers {
1249844fc5ebSAlan Somers 	cleanup();
1250844fc5ebSAlan Somers }
1251844fc5ebSAlan Somers 
1252844fc5ebSAlan Somers 
1253844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_delete_fd_failure);
1254844fc5ebSAlan Somers ATF_TC_HEAD(extattr_delete_fd_failure, tc)
1255844fc5ebSAlan Somers {
1256844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1257844fc5ebSAlan Somers 					"extattr_delete_fd(2) call");
1258844fc5ebSAlan Somers }
1259844fc5ebSAlan Somers 
1260844fc5ebSAlan Somers ATF_TC_BODY(extattr_delete_fd_failure, tc)
1261844fc5ebSAlan Somers {
1262844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1263844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1264844fc5ebSAlan Somers 		"extattr_delete_fd.*return,failure : Bad file descriptor");
1265844fc5ebSAlan Somers 
1266844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1267844fc5ebSAlan Somers 	/* Failure reason: Invalid file descriptor */
1268*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(EBADF,
1269*40407d39SAlex Richardson 	    extattr_delete_fd(-1, EXTATTR_NAMESPACE_USER, name) == -1);
1270844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1271844fc5ebSAlan Somers }
1272844fc5ebSAlan Somers 
1273844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_delete_fd_failure, tc)
1274844fc5ebSAlan Somers {
1275844fc5ebSAlan Somers 	cleanup();
1276844fc5ebSAlan Somers }
1277844fc5ebSAlan Somers 
1278844fc5ebSAlan Somers 
1279844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_delete_link_success);
1280844fc5ebSAlan Somers ATF_TC_HEAD(extattr_delete_link_success, tc)
1281844fc5ebSAlan Somers {
1282844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1283844fc5ebSAlan Somers 					"extattr_delete_link(2) call");
1284844fc5ebSAlan Somers }
1285844fc5ebSAlan Somers 
1286844fc5ebSAlan Somers ATF_TC_BODY(extattr_delete_link_success, tc)
1287844fc5ebSAlan Somers {
1288844fc5ebSAlan Somers 	/* Symbolic link needs to exist to call extattr_delete_link(2) */
1289844fc5ebSAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
1290*40407d39SAlex Richardson 	skip_if_extattr_not_supported(".");
1291*40407d39SAlex Richardson 
1292*40407d39SAlex Richardson 	REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_link(path,
1293844fc5ebSAlan Somers 		EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1294844fc5ebSAlan Somers 
1295844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1296*40407d39SAlex Richardson 	retval = REQUIRE_EXTATTR_SUCCESS(extattr_delete_link(path,
1297*40407d39SAlex Richardson 		EXTATTR_NAMESPACE_USER, name));
1298844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1299844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1300844fc5ebSAlan Somers 	"extattr_delete_link.*%s.*return,success,%d", path, retval);
1301844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1302844fc5ebSAlan Somers }
1303844fc5ebSAlan Somers 
1304844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_delete_link_success, tc)
1305844fc5ebSAlan Somers {
1306844fc5ebSAlan Somers 	cleanup();
1307844fc5ebSAlan Somers }
1308844fc5ebSAlan Somers 
1309844fc5ebSAlan Somers 
1310844fc5ebSAlan Somers ATF_TC_WITH_CLEANUP(extattr_delete_link_failure);
1311844fc5ebSAlan Somers ATF_TC_HEAD(extattr_delete_link_failure, tc)
1312844fc5ebSAlan Somers {
1313844fc5ebSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1314844fc5ebSAlan Somers 					"extattr_delete_link(2) call");
1315844fc5ebSAlan Somers }
1316844fc5ebSAlan Somers 
1317844fc5ebSAlan Somers ATF_TC_BODY(extattr_delete_link_failure, tc)
1318844fc5ebSAlan Somers {
1319844fc5ebSAlan Somers 	/* Prepare the regex to be checked in the audit record */
1320844fc5ebSAlan Somers 	snprintf(extregex, sizeof(extregex),
1321844fc5ebSAlan Somers 		"extattr_delete_link.*%s.*failure", path);
1322844fc5ebSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1323844fc5ebSAlan Somers 	/* Failure reason: symbolic link does not exist */
1324*40407d39SAlex Richardson 	ATF_REQUIRE_ERRNO(ENOENT,
1325*40407d39SAlex Richardson 	    extattr_delete_link(path, EXTATTR_NAMESPACE_USER, name) == -1);
1326844fc5ebSAlan Somers 	check_audit(fds, extregex, pipefd);
1327844fc5ebSAlan Somers }
1328844fc5ebSAlan Somers 
1329844fc5ebSAlan Somers ATF_TC_CLEANUP(extattr_delete_link_failure, tc)
1330844fc5ebSAlan Somers {
1331844fc5ebSAlan Somers 	cleanup();
1332844fc5ebSAlan Somers }
1333844fc5ebSAlan Somers 
1334844fc5ebSAlan Somers 
13356d203d2dSAlan Somers ATF_TP_ADD_TCS(tp)
13366d203d2dSAlan Somers {
13376d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, flock_success);
13386d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, flock_failure);
13396d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fcntl_success);
13406d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fcntl_failure);
13416d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fsync_success);
13426d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fsync_failure);
13436d203d2dSAlan Somers 
134428845213SAlan Somers 	ATF_TP_ADD_TC(tp, chmod_success);
134528845213SAlan Somers 	ATF_TP_ADD_TC(tp, chmod_failure);
134628845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmod_success);
134728845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmod_failure);
134828845213SAlan Somers 	ATF_TP_ADD_TC(tp, lchmod_success);
134928845213SAlan Somers 	ATF_TP_ADD_TC(tp, lchmod_failure);
135028845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmodat_success);
135128845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmodat_failure);
135228845213SAlan Somers 
13535c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, chown_success);
13545c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, chown_failure);
13555c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchown_success);
13565c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchown_failure);
13575c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, lchown_success);
13585c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, lchown_failure);
13595c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchownat_success);
13605c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchownat_failure);
13615c9a4738SAlan Somers 
136268e520feSAlan Somers 	ATF_TP_ADD_TC(tp, chflags_success);
136368e520feSAlan Somers 	ATF_TP_ADD_TC(tp, chflags_failure);
136468e520feSAlan Somers 	ATF_TP_ADD_TC(tp, fchflags_success);
136568e520feSAlan Somers 	ATF_TP_ADD_TC(tp, fchflags_failure);
136668e520feSAlan Somers 	ATF_TP_ADD_TC(tp, lchflags_success);
136768e520feSAlan Somers 	ATF_TP_ADD_TC(tp, lchflags_failure);
136855cd4523SAlan Somers 	ATF_TP_ADD_TC(tp, chflagsat_success);
136955cd4523SAlan Somers 	ATF_TP_ADD_TC(tp, chflagsat_failure);
137068e520feSAlan Somers 
1371d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, utimes_success);
1372d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, utimes_failure);
1373d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, futimes_success);
1374d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, futimes_failure);
1375d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, lutimes_success);
1376d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, lutimes_failure);
1377d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, futimesat_success);
1378d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, futimesat_failure);
1379d1fb351cSAlan Somers 
1380d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, mprotect_success);
1381d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, mprotect_failure);
1382d1fb351cSAlan Somers 	ATF_TP_ADD_TC(tp, undelete_failure);
1383d1fb351cSAlan Somers 
1384844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_set_file_success);
1385844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_set_file_failure);
1386844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_set_fd_success);
1387844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_set_fd_failure);
1388844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_set_link_success);
1389844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_set_link_failure);
1390844fc5ebSAlan Somers 
1391844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_delete_file_success);
1392844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_delete_file_failure);
1393844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_delete_fd_success);
1394844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_delete_fd_failure);
1395844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_delete_link_success);
1396844fc5ebSAlan Somers 	ATF_TP_ADD_TC(tp, extattr_delete_link_failure);
1397844fc5ebSAlan Somers 
13986d203d2dSAlan Somers 	return (atf_no_error());
13996d203d2dSAlan Somers }
1400