xref: /freebsd/tests/sys/audit/file-attribute-modify.c (revision 68e520fea44bd3223e16a13161c3f0636d868d7d)
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 
286d203d2dSAlan Somers #include <sys/file.h>
2928845213SAlan Somers #include <sys/stat.h>
306d203d2dSAlan Somers 
316d203d2dSAlan Somers #include <atf-c.h>
326d203d2dSAlan Somers #include <fcntl.h>
336d203d2dSAlan Somers #include <unistd.h>
346d203d2dSAlan Somers 
356d203d2dSAlan Somers #include "utils.h"
366d203d2dSAlan Somers 
376d203d2dSAlan Somers static pid_t pid;
385c9a4738SAlan Somers static uid_t uid = -1;
395c9a4738SAlan Somers static gid_t gid = -1;
406d203d2dSAlan Somers static int filedesc;
416d203d2dSAlan Somers static struct pollfd fds[1];
426d203d2dSAlan Somers static mode_t mode = 0777;
436d203d2dSAlan Somers static char extregex[80];
446d203d2dSAlan Somers static const char *auclass = "fm";
456d203d2dSAlan Somers static const char *path = "fileforaudit";
4628845213SAlan Somers static const char *errpath = "adirhasnoname/fileforaudit";
4728845213SAlan Somers static const char *successreg = "fileforaudit.*return,success";
4828845213SAlan Somers static const char *failurereg = "fileforaudit.*return,failure";
496d203d2dSAlan Somers 
506d203d2dSAlan Somers 
516d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(flock_success);
526d203d2dSAlan Somers ATF_TC_HEAD(flock_success, tc)
536d203d2dSAlan Somers {
546d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
556d203d2dSAlan Somers 					"flock(2) call");
566d203d2dSAlan Somers }
576d203d2dSAlan Somers 
586d203d2dSAlan Somers ATF_TC_BODY(flock_success, tc)
596d203d2dSAlan Somers {
606d203d2dSAlan Somers 	pid = getpid();
616d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex), "flock.*%d.*return,success", pid);
626d203d2dSAlan Somers 
636d203d2dSAlan Somers 	/* File needs to exist to call flock(2) */
646d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
656d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
666d203d2dSAlan Somers 	ATF_REQUIRE_EQ(0, flock(filedesc, LOCK_SH));
676d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
686d203d2dSAlan Somers 	close(filedesc);
696d203d2dSAlan Somers }
706d203d2dSAlan Somers 
716d203d2dSAlan Somers ATF_TC_CLEANUP(flock_success, tc)
726d203d2dSAlan Somers {
736d203d2dSAlan Somers 	cleanup();
746d203d2dSAlan Somers }
756d203d2dSAlan Somers 
766d203d2dSAlan Somers 
776d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(flock_failure);
786d203d2dSAlan Somers ATF_TC_HEAD(flock_failure, tc)
796d203d2dSAlan Somers {
806d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
816d203d2dSAlan Somers 					"flock(2) call");
826d203d2dSAlan Somers }
836d203d2dSAlan Somers 
846d203d2dSAlan Somers ATF_TC_BODY(flock_failure, tc)
856d203d2dSAlan Somers {
866d203d2dSAlan Somers 	const char *regex = "flock.*return,failure : Bad file descriptor";
876d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
886d203d2dSAlan Somers 	ATF_REQUIRE_EQ(-1, flock(-1, LOCK_SH));
896d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
906d203d2dSAlan Somers }
916d203d2dSAlan Somers 
926d203d2dSAlan Somers ATF_TC_CLEANUP(flock_failure, tc)
936d203d2dSAlan Somers {
946d203d2dSAlan Somers 	cleanup();
956d203d2dSAlan Somers }
966d203d2dSAlan Somers 
976d203d2dSAlan Somers 
986d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fcntl_success);
996d203d2dSAlan Somers ATF_TC_HEAD(fcntl_success, tc)
1006d203d2dSAlan Somers {
1016d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1026d203d2dSAlan Somers 					"fcntl(2) call");
1036d203d2dSAlan Somers }
1046d203d2dSAlan Somers 
1056d203d2dSAlan Somers ATF_TC_BODY(fcntl_success, tc)
1066d203d2dSAlan Somers {
1076d203d2dSAlan Somers 	int flagstatus;
1086d203d2dSAlan Somers 	/* File needs to exist to call fcntl(2) */
1096d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1106d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1116d203d2dSAlan Somers 
1126d203d2dSAlan Somers 	/* Retrieve the status flags of 'filedesc' and store it in flagstatus */
1136d203d2dSAlan Somers 	ATF_REQUIRE((flagstatus = fcntl(filedesc, F_GETFL, 0)) != -1);
1146d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex),
1156d203d2dSAlan Somers 			"fcntl.*return,success,%d", flagstatus);
1166d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
1176d203d2dSAlan Somers 	close(filedesc);
1186d203d2dSAlan Somers }
1196d203d2dSAlan Somers 
1206d203d2dSAlan Somers ATF_TC_CLEANUP(fcntl_success, tc)
1216d203d2dSAlan Somers {
1226d203d2dSAlan Somers 	cleanup();
1236d203d2dSAlan Somers }
1246d203d2dSAlan Somers 
1256d203d2dSAlan Somers 
1266d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fcntl_failure);
1276d203d2dSAlan Somers ATF_TC_HEAD(fcntl_failure, tc)
1286d203d2dSAlan Somers {
1296d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1306d203d2dSAlan Somers 					"fcntl(2) call");
1316d203d2dSAlan Somers }
1326d203d2dSAlan Somers 
1336d203d2dSAlan Somers ATF_TC_BODY(fcntl_failure, tc)
1346d203d2dSAlan Somers {
1356d203d2dSAlan Somers 	const char *regex = "fcntl.*return,failure : Bad file descriptor";
1366d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1376d203d2dSAlan Somers 	ATF_REQUIRE_EQ(-1, fcntl(-1, F_GETFL, 0));
1386d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
1396d203d2dSAlan Somers }
1406d203d2dSAlan Somers 
1416d203d2dSAlan Somers ATF_TC_CLEANUP(fcntl_failure, tc)
1426d203d2dSAlan Somers {
1436d203d2dSAlan Somers 	cleanup();
1446d203d2dSAlan Somers }
1456d203d2dSAlan Somers 
1466d203d2dSAlan Somers 
1476d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fsync_success);
1486d203d2dSAlan Somers ATF_TC_HEAD(fsync_success, tc)
1496d203d2dSAlan Somers {
1506d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1516d203d2dSAlan Somers 					"fsync(2) call");
1526d203d2dSAlan Somers }
1536d203d2dSAlan Somers 
1546d203d2dSAlan Somers ATF_TC_BODY(fsync_success, tc)
1556d203d2dSAlan Somers {
1566d203d2dSAlan Somers 	pid = getpid();
1576d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex), "fsync.*%d.*return,success", pid);
1586d203d2dSAlan Somers 
1596d203d2dSAlan Somers 	/* File needs to exist to call fsync(2) */
1606d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1616d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1626d203d2dSAlan Somers 	ATF_REQUIRE_EQ(0, fsync(filedesc));
1636d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
1646d203d2dSAlan Somers 	close(filedesc);
1656d203d2dSAlan Somers }
1666d203d2dSAlan Somers 
1676d203d2dSAlan Somers ATF_TC_CLEANUP(fsync_success, tc)
1686d203d2dSAlan Somers {
1696d203d2dSAlan Somers 	cleanup();
1706d203d2dSAlan Somers }
1716d203d2dSAlan Somers 
1726d203d2dSAlan Somers 
1736d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fsync_failure);
1746d203d2dSAlan Somers ATF_TC_HEAD(fsync_failure, tc)
1756d203d2dSAlan Somers {
1766d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1776d203d2dSAlan Somers 					"fsync(2) call");
1786d203d2dSAlan Somers }
1796d203d2dSAlan Somers 
1806d203d2dSAlan Somers ATF_TC_BODY(fsync_failure, tc)
1816d203d2dSAlan Somers {
1826d203d2dSAlan Somers 	const char *regex = "fsync.*return,failure : Bad file descriptor";
1836d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1846d203d2dSAlan Somers 	/* Failure reason: Invalid file descriptor */
1856d203d2dSAlan Somers 	ATF_REQUIRE_EQ(-1, fsync(-1));
1866d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
1876d203d2dSAlan Somers }
1886d203d2dSAlan Somers 
1896d203d2dSAlan Somers ATF_TC_CLEANUP(fsync_failure, tc)
1906d203d2dSAlan Somers {
1916d203d2dSAlan Somers 	cleanup();
1926d203d2dSAlan Somers }
1936d203d2dSAlan Somers 
1946d203d2dSAlan Somers 
19528845213SAlan Somers ATF_TC_WITH_CLEANUP(chmod_success);
19628845213SAlan Somers ATF_TC_HEAD(chmod_success, tc)
19728845213SAlan Somers {
19828845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
19928845213SAlan Somers 					"chmod(2) call");
20028845213SAlan Somers }
20128845213SAlan Somers 
20228845213SAlan Somers ATF_TC_BODY(chmod_success, tc)
20328845213SAlan Somers {
20428845213SAlan Somers 	/* File needs to exist to call chmod(2) */
20528845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
20628845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
20728845213SAlan Somers 	ATF_REQUIRE_EQ(0, chmod(path, mode));
20828845213SAlan Somers 	check_audit(fds, successreg, pipefd);
20928845213SAlan Somers 	close(filedesc);
21028845213SAlan Somers }
21128845213SAlan Somers 
21228845213SAlan Somers ATF_TC_CLEANUP(chmod_success, tc)
21328845213SAlan Somers {
21428845213SAlan Somers 	cleanup();
21528845213SAlan Somers }
21628845213SAlan Somers 
21728845213SAlan Somers 
21828845213SAlan Somers ATF_TC_WITH_CLEANUP(chmod_failure);
21928845213SAlan Somers ATF_TC_HEAD(chmod_failure, tc)
22028845213SAlan Somers {
22128845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
22228845213SAlan Somers 					"chmod(2) call");
22328845213SAlan Somers }
22428845213SAlan Somers 
22528845213SAlan Somers ATF_TC_BODY(chmod_failure, tc)
22628845213SAlan Somers {
22728845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
22828845213SAlan Somers 	/* Failure reason: file does not exist */
22928845213SAlan Somers 	ATF_REQUIRE_EQ(-1, chmod(errpath, mode));
23028845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
23128845213SAlan Somers }
23228845213SAlan Somers 
23328845213SAlan Somers ATF_TC_CLEANUP(chmod_failure, tc)
23428845213SAlan Somers {
23528845213SAlan Somers 	cleanup();
23628845213SAlan Somers }
23728845213SAlan Somers 
23828845213SAlan Somers 
23928845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmod_success);
24028845213SAlan Somers ATF_TC_HEAD(fchmod_success, tc)
24128845213SAlan Somers {
24228845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
24328845213SAlan Somers 					"fchmod(2) call");
24428845213SAlan Somers }
24528845213SAlan Somers 
24628845213SAlan Somers ATF_TC_BODY(fchmod_success, tc)
24728845213SAlan Somers {
24828845213SAlan Somers 	pid = getpid();
24928845213SAlan Somers 	snprintf(extregex, sizeof(extregex), "fchmod.*%d.*return,success", pid);
25028845213SAlan Somers 
25128845213SAlan Somers 	/* File needs to exist to call fchmod(2) */
25228845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
25328845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
25428845213SAlan Somers 	ATF_REQUIRE_EQ(0, fchmod(filedesc, mode));
25528845213SAlan Somers 	check_audit(fds, extregex, pipefd);
25628845213SAlan Somers 	close(filedesc);
25728845213SAlan Somers }
25828845213SAlan Somers 
25928845213SAlan Somers ATF_TC_CLEANUP(fchmod_success, tc)
26028845213SAlan Somers {
26128845213SAlan Somers 	cleanup();
26228845213SAlan Somers }
26328845213SAlan Somers 
26428845213SAlan Somers 
26528845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmod_failure);
26628845213SAlan Somers ATF_TC_HEAD(fchmod_failure, tc)
26728845213SAlan Somers {
26828845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
26928845213SAlan Somers 					"fchmod(2) call");
27028845213SAlan Somers }
27128845213SAlan Somers 
27228845213SAlan Somers ATF_TC_BODY(fchmod_failure, tc)
27328845213SAlan Somers {
27428845213SAlan Somers 	const char *regex = "fchmod.*return,failure : Bad file descriptor";
27528845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
27628845213SAlan Somers 	/* Failure reason: Invalid file descriptor */
27728845213SAlan Somers 	ATF_REQUIRE_EQ(-1, fchmod(-1, mode));
27828845213SAlan Somers 	check_audit(fds, regex, pipefd);
27928845213SAlan Somers }
28028845213SAlan Somers 
28128845213SAlan Somers ATF_TC_CLEANUP(fchmod_failure, tc)
28228845213SAlan Somers {
28328845213SAlan Somers 	cleanup();
28428845213SAlan Somers }
28528845213SAlan Somers 
28628845213SAlan Somers 
28728845213SAlan Somers ATF_TC_WITH_CLEANUP(lchmod_success);
28828845213SAlan Somers ATF_TC_HEAD(lchmod_success, tc)
28928845213SAlan Somers {
29028845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
29128845213SAlan Somers 					"lchmod(2) call");
29228845213SAlan Somers }
29328845213SAlan Somers 
29428845213SAlan Somers ATF_TC_BODY(lchmod_success, tc)
29528845213SAlan Somers {
29628845213SAlan Somers 	/* Symbolic link needs to exist to call lchmod(2) */
29728845213SAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
29828845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
29928845213SAlan Somers 	ATF_REQUIRE_EQ(0, lchmod(path, mode));
30028845213SAlan Somers 	check_audit(fds, successreg, pipefd);
30128845213SAlan Somers }
30228845213SAlan Somers 
30328845213SAlan Somers ATF_TC_CLEANUP(lchmod_success, tc)
30428845213SAlan Somers {
30528845213SAlan Somers 	cleanup();
30628845213SAlan Somers }
30728845213SAlan Somers 
30828845213SAlan Somers 
30928845213SAlan Somers ATF_TC_WITH_CLEANUP(lchmod_failure);
31028845213SAlan Somers ATF_TC_HEAD(lchmod_failure, tc)
31128845213SAlan Somers {
31228845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
31328845213SAlan Somers 					"lchmod(2) call");
31428845213SAlan Somers }
31528845213SAlan Somers 
31628845213SAlan Somers ATF_TC_BODY(lchmod_failure, tc)
31728845213SAlan Somers {
31828845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
31928845213SAlan Somers 	/* Failure reason: file does not exist */
32028845213SAlan Somers 	ATF_REQUIRE_EQ(-1, lchmod(errpath, mode));
32128845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
32228845213SAlan Somers }
32328845213SAlan Somers 
32428845213SAlan Somers ATF_TC_CLEANUP(lchmod_failure, tc)
32528845213SAlan Somers {
32628845213SAlan Somers 	cleanup();
32728845213SAlan Somers }
32828845213SAlan Somers 
32928845213SAlan Somers 
33028845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmodat_success);
33128845213SAlan Somers ATF_TC_HEAD(fchmodat_success, tc)
33228845213SAlan Somers {
33328845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
33428845213SAlan Somers 					"fchmodat(2) call");
33528845213SAlan Somers }
33628845213SAlan Somers 
33728845213SAlan Somers ATF_TC_BODY(fchmodat_success, tc)
33828845213SAlan Somers {
33928845213SAlan Somers 	/* File needs to exist to call fchmodat(2) */
34028845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
34128845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
34228845213SAlan Somers 	ATF_REQUIRE_EQ(0, fchmodat(AT_FDCWD, path, mode, 0));
34328845213SAlan Somers 	check_audit(fds, successreg, pipefd);
34428845213SAlan Somers 	close(filedesc);
34528845213SAlan Somers }
34628845213SAlan Somers 
34728845213SAlan Somers ATF_TC_CLEANUP(fchmodat_success, tc)
34828845213SAlan Somers {
34928845213SAlan Somers 	cleanup();
35028845213SAlan Somers }
35128845213SAlan Somers 
35228845213SAlan Somers 
35328845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmodat_failure);
35428845213SAlan Somers ATF_TC_HEAD(fchmodat_failure, tc)
35528845213SAlan Somers {
35628845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
35728845213SAlan Somers 					"fchmodat(2) call");
35828845213SAlan Somers }
35928845213SAlan Somers 
36028845213SAlan Somers ATF_TC_BODY(fchmodat_failure, tc)
36128845213SAlan Somers {
36228845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
36328845213SAlan Somers 	/* Failure reason: file does not exist */
36428845213SAlan Somers 	ATF_REQUIRE_EQ(-1, fchmodat(AT_FDCWD, errpath, mode, 0));
36528845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
36628845213SAlan Somers }
36728845213SAlan Somers 
36828845213SAlan Somers ATF_TC_CLEANUP(fchmodat_failure, tc)
36928845213SAlan Somers {
37028845213SAlan Somers 	cleanup();
37128845213SAlan Somers }
37228845213SAlan Somers 
37328845213SAlan Somers 
3745c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(chown_success);
3755c9a4738SAlan Somers ATF_TC_HEAD(chown_success, tc)
3765c9a4738SAlan Somers {
3775c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
3785c9a4738SAlan Somers 					"chown(2) call");
3795c9a4738SAlan Somers }
3805c9a4738SAlan Somers 
3815c9a4738SAlan Somers ATF_TC_BODY(chown_success, tc)
3825c9a4738SAlan Somers {
3835c9a4738SAlan Somers 	/* File needs to exist to call chown(2) */
3845c9a4738SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
3855c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
3865c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, chown(path, uid, gid));
3875c9a4738SAlan Somers 	check_audit(fds, successreg, pipefd);
3885c9a4738SAlan Somers 	close(filedesc);
3895c9a4738SAlan Somers }
3905c9a4738SAlan Somers 
3915c9a4738SAlan Somers ATF_TC_CLEANUP(chown_success, tc)
3925c9a4738SAlan Somers {
3935c9a4738SAlan Somers 	cleanup();
3945c9a4738SAlan Somers }
3955c9a4738SAlan Somers 
3965c9a4738SAlan Somers 
3975c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(chown_failure);
3985c9a4738SAlan Somers ATF_TC_HEAD(chown_failure, tc)
3995c9a4738SAlan Somers {
4005c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
4015c9a4738SAlan Somers 					"chown(2) call");
4025c9a4738SAlan Somers }
4035c9a4738SAlan Somers 
4045c9a4738SAlan Somers ATF_TC_BODY(chown_failure, tc)
4055c9a4738SAlan Somers {
4065c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
4075c9a4738SAlan Somers 	/* Failure reason: file does not exist */
4085c9a4738SAlan Somers 	ATF_REQUIRE_EQ(-1, chown(errpath, uid, gid));
4095c9a4738SAlan Somers 	check_audit(fds, failurereg, pipefd);
4105c9a4738SAlan Somers }
4115c9a4738SAlan Somers 
4125c9a4738SAlan Somers ATF_TC_CLEANUP(chown_failure, tc)
4135c9a4738SAlan Somers {
4145c9a4738SAlan Somers 	cleanup();
4155c9a4738SAlan Somers }
4165c9a4738SAlan Somers 
4175c9a4738SAlan Somers 
4185c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchown_success);
4195c9a4738SAlan Somers ATF_TC_HEAD(fchown_success, tc)
4205c9a4738SAlan Somers {
4215c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
4225c9a4738SAlan Somers 					"fchown(2) call");
4235c9a4738SAlan Somers }
4245c9a4738SAlan Somers 
4255c9a4738SAlan Somers ATF_TC_BODY(fchown_success, tc)
4265c9a4738SAlan Somers {
4275c9a4738SAlan Somers 	pid = getpid();
4285c9a4738SAlan Somers 	snprintf(extregex, sizeof(extregex), "fchown.*%d.*return,success", pid);
4295c9a4738SAlan Somers 
4305c9a4738SAlan Somers 	/* File needs to exist to call fchown(2) */
4315c9a4738SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
4325c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
4335c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, fchown(filedesc, uid, gid));
4345c9a4738SAlan Somers 	check_audit(fds, extregex, pipefd);
4355c9a4738SAlan Somers 	close(filedesc);
4365c9a4738SAlan Somers }
4375c9a4738SAlan Somers 
4385c9a4738SAlan Somers ATF_TC_CLEANUP(fchown_success, tc)
4395c9a4738SAlan Somers {
4405c9a4738SAlan Somers 	cleanup();
4415c9a4738SAlan Somers }
4425c9a4738SAlan Somers 
4435c9a4738SAlan Somers 
4445c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchown_failure);
4455c9a4738SAlan Somers ATF_TC_HEAD(fchown_failure, tc)
4465c9a4738SAlan Somers {
4475c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
4485c9a4738SAlan Somers 					"fchown(2) call");
4495c9a4738SAlan Somers }
4505c9a4738SAlan Somers 
4515c9a4738SAlan Somers ATF_TC_BODY(fchown_failure, tc)
4525c9a4738SAlan Somers {
4535c9a4738SAlan Somers 	const char *regex = "fchown.*return,failure : Bad file descriptor";
4545c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
4555c9a4738SAlan Somers 	/* Failure reason: Invalid file descriptor */
4565c9a4738SAlan Somers 	ATF_REQUIRE_EQ(-1, fchown(-1, uid, gid));
4575c9a4738SAlan Somers 	check_audit(fds, regex, pipefd);
4585c9a4738SAlan Somers }
4595c9a4738SAlan Somers 
4605c9a4738SAlan Somers ATF_TC_CLEANUP(fchown_failure, tc)
4615c9a4738SAlan Somers {
4625c9a4738SAlan Somers 	cleanup();
4635c9a4738SAlan Somers }
4645c9a4738SAlan Somers 
4655c9a4738SAlan Somers 
4665c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(lchown_success);
4675c9a4738SAlan Somers ATF_TC_HEAD(lchown_success, tc)
4685c9a4738SAlan Somers {
4695c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
4705c9a4738SAlan Somers 					"lchown(2) call");
4715c9a4738SAlan Somers }
4725c9a4738SAlan Somers 
4735c9a4738SAlan Somers ATF_TC_BODY(lchown_success, tc)
4745c9a4738SAlan Somers {
4755c9a4738SAlan Somers 	/* Symbolic link needs to exist to call lchown(2) */
4765c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
4775c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
4785c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, lchown(path, uid, gid));
4795c9a4738SAlan Somers 	check_audit(fds, successreg, pipefd);
4805c9a4738SAlan Somers }
4815c9a4738SAlan Somers 
4825c9a4738SAlan Somers ATF_TC_CLEANUP(lchown_success, tc)
4835c9a4738SAlan Somers {
4845c9a4738SAlan Somers 	cleanup();
4855c9a4738SAlan Somers }
4865c9a4738SAlan Somers 
4875c9a4738SAlan Somers 
4885c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(lchown_failure);
4895c9a4738SAlan Somers ATF_TC_HEAD(lchown_failure, tc)
4905c9a4738SAlan Somers {
4915c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
4925c9a4738SAlan Somers 					"lchown(2) call");
4935c9a4738SAlan Somers }
4945c9a4738SAlan Somers 
4955c9a4738SAlan Somers ATF_TC_BODY(lchown_failure, tc)
4965c9a4738SAlan Somers {
4975c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
4985c9a4738SAlan Somers 	/* Failure reason: Symbolic link does not exist */
4995c9a4738SAlan Somers 	ATF_REQUIRE_EQ(-1, lchown(errpath, uid, gid));
5005c9a4738SAlan Somers 	check_audit(fds, failurereg, pipefd);
5015c9a4738SAlan Somers }
5025c9a4738SAlan Somers 
5035c9a4738SAlan Somers ATF_TC_CLEANUP(lchown_failure, tc)
5045c9a4738SAlan Somers {
5055c9a4738SAlan Somers 	cleanup();
5065c9a4738SAlan Somers }
5075c9a4738SAlan Somers 
5085c9a4738SAlan Somers 
5095c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchownat_success);
5105c9a4738SAlan Somers ATF_TC_HEAD(fchownat_success, tc)
5115c9a4738SAlan Somers {
5125c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
5135c9a4738SAlan Somers 					"fchownat(2) call");
5145c9a4738SAlan Somers }
5155c9a4738SAlan Somers 
5165c9a4738SAlan Somers ATF_TC_BODY(fchownat_success, tc)
5175c9a4738SAlan Somers {
5185c9a4738SAlan Somers 	/* File needs to exist to call fchownat(2) */
5195c9a4738SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
5205c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
5215c9a4738SAlan Somers 	ATF_REQUIRE_EQ(0, fchownat(AT_FDCWD, path, uid, gid, 0));
5225c9a4738SAlan Somers 	check_audit(fds, successreg, pipefd);
5235c9a4738SAlan Somers 	close(filedesc);
5245c9a4738SAlan Somers }
5255c9a4738SAlan Somers 
5265c9a4738SAlan Somers ATF_TC_CLEANUP(fchownat_success, tc)
5275c9a4738SAlan Somers {
5285c9a4738SAlan Somers 	cleanup();
5295c9a4738SAlan Somers }
5305c9a4738SAlan Somers 
5315c9a4738SAlan Somers 
5325c9a4738SAlan Somers ATF_TC_WITH_CLEANUP(fchownat_failure);
5335c9a4738SAlan Somers ATF_TC_HEAD(fchownat_failure, tc)
5345c9a4738SAlan Somers {
5355c9a4738SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
5365c9a4738SAlan Somers 					"fchownat(2) call");
5375c9a4738SAlan Somers }
5385c9a4738SAlan Somers 
5395c9a4738SAlan Somers ATF_TC_BODY(fchownat_failure, tc)
5405c9a4738SAlan Somers {
5415c9a4738SAlan Somers 	FILE *pipefd = setup(fds, auclass);
5425c9a4738SAlan Somers 	/* Failure reason: file does not exist */
5435c9a4738SAlan Somers 	ATF_REQUIRE_EQ(-1, fchownat(AT_FDCWD, errpath, uid, gid, 0));
5445c9a4738SAlan Somers 	check_audit(fds, failurereg, pipefd);
5455c9a4738SAlan Somers }
5465c9a4738SAlan Somers 
5475c9a4738SAlan Somers ATF_TC_CLEANUP(fchownat_failure, tc)
5485c9a4738SAlan Somers {
5495c9a4738SAlan Somers 	cleanup();
5505c9a4738SAlan Somers }
5515c9a4738SAlan Somers 
5525c9a4738SAlan Somers 
553*68e520feSAlan Somers ATF_TC_WITH_CLEANUP(chflags_success);
554*68e520feSAlan Somers ATF_TC_HEAD(chflags_success, tc)
555*68e520feSAlan Somers {
556*68e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
557*68e520feSAlan Somers 					"chflags(2) call");
558*68e520feSAlan Somers }
559*68e520feSAlan Somers 
560*68e520feSAlan Somers ATF_TC_BODY(chflags_success, tc)
561*68e520feSAlan Somers {
562*68e520feSAlan Somers 	/* File needs to exist to call chflags(2) */
563*68e520feSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
564*68e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
565*68e520feSAlan Somers 	ATF_REQUIRE_EQ(0, chflags(path, UF_OFFLINE));
566*68e520feSAlan Somers 	check_audit(fds, successreg, pipefd);
567*68e520feSAlan Somers 	close(filedesc);
568*68e520feSAlan Somers }
569*68e520feSAlan Somers 
570*68e520feSAlan Somers ATF_TC_CLEANUP(chflags_success, tc)
571*68e520feSAlan Somers {
572*68e520feSAlan Somers 	cleanup();
573*68e520feSAlan Somers }
574*68e520feSAlan Somers 
575*68e520feSAlan Somers 
576*68e520feSAlan Somers ATF_TC_WITH_CLEANUP(chflags_failure);
577*68e520feSAlan Somers ATF_TC_HEAD(chflags_failure, tc)
578*68e520feSAlan Somers {
579*68e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
580*68e520feSAlan Somers 					"chflags(2) call");
581*68e520feSAlan Somers }
582*68e520feSAlan Somers 
583*68e520feSAlan Somers ATF_TC_BODY(chflags_failure, tc)
584*68e520feSAlan Somers {
585*68e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
586*68e520feSAlan Somers 	/* Failure reason: file does not exist */
587*68e520feSAlan Somers 	ATF_REQUIRE_EQ(-1, chflags(errpath, UF_OFFLINE));
588*68e520feSAlan Somers 	check_audit(fds, failurereg, pipefd);
589*68e520feSAlan Somers }
590*68e520feSAlan Somers 
591*68e520feSAlan Somers ATF_TC_CLEANUP(chflags_failure, tc)
592*68e520feSAlan Somers {
593*68e520feSAlan Somers 	cleanup();
594*68e520feSAlan Somers }
595*68e520feSAlan Somers 
596*68e520feSAlan Somers 
597*68e520feSAlan Somers ATF_TC_WITH_CLEANUP(fchflags_success);
598*68e520feSAlan Somers ATF_TC_HEAD(fchflags_success, tc)
599*68e520feSAlan Somers {
600*68e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
601*68e520feSAlan Somers 					"fchflags(2) call");
602*68e520feSAlan Somers }
603*68e520feSAlan Somers 
604*68e520feSAlan Somers ATF_TC_BODY(fchflags_success, tc)
605*68e520feSAlan Somers {
606*68e520feSAlan Somers 	pid = getpid();
607*68e520feSAlan Somers 	snprintf(extregex, sizeof(extregex), "fchflags.*%d.*ret.*success", pid);
608*68e520feSAlan Somers 	/* File needs to exist to call fchflags(2) */
609*68e520feSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
610*68e520feSAlan Somers 
611*68e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
612*68e520feSAlan Somers 	ATF_REQUIRE_EQ(0, fchflags(filedesc, UF_OFFLINE));
613*68e520feSAlan Somers 	check_audit(fds, extregex, pipefd);
614*68e520feSAlan Somers 	close(filedesc);
615*68e520feSAlan Somers }
616*68e520feSAlan Somers 
617*68e520feSAlan Somers ATF_TC_CLEANUP(fchflags_success, tc)
618*68e520feSAlan Somers {
619*68e520feSAlan Somers 	cleanup();
620*68e520feSAlan Somers }
621*68e520feSAlan Somers 
622*68e520feSAlan Somers 
623*68e520feSAlan Somers ATF_TC_WITH_CLEANUP(fchflags_failure);
624*68e520feSAlan Somers ATF_TC_HEAD(fchflags_failure, tc)
625*68e520feSAlan Somers {
626*68e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
627*68e520feSAlan Somers 					"fchflags(2) call");
628*68e520feSAlan Somers }
629*68e520feSAlan Somers 
630*68e520feSAlan Somers ATF_TC_BODY(fchflags_failure, tc)
631*68e520feSAlan Somers {
632*68e520feSAlan Somers 	const char *regex = "fchflags.*return,failure : Bad file descriptor";
633*68e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
634*68e520feSAlan Somers 	/* Failure reason: Invalid file descriptor */
635*68e520feSAlan Somers 	ATF_REQUIRE_EQ(-1, fchflags(-1, UF_OFFLINE));
636*68e520feSAlan Somers 	check_audit(fds, regex, pipefd);
637*68e520feSAlan Somers }
638*68e520feSAlan Somers 
639*68e520feSAlan Somers ATF_TC_CLEANUP(fchflags_failure, tc)
640*68e520feSAlan Somers {
641*68e520feSAlan Somers 	cleanup();
642*68e520feSAlan Somers }
643*68e520feSAlan Somers 
644*68e520feSAlan Somers 
645*68e520feSAlan Somers ATF_TC_WITH_CLEANUP(lchflags_success);
646*68e520feSAlan Somers ATF_TC_HEAD(lchflags_success, tc)
647*68e520feSAlan Somers {
648*68e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
649*68e520feSAlan Somers 					"lchflags(2) call");
650*68e520feSAlan Somers }
651*68e520feSAlan Somers 
652*68e520feSAlan Somers ATF_TC_BODY(lchflags_success, tc)
653*68e520feSAlan Somers {
654*68e520feSAlan Somers 	/* Symbolic link needs to exist to call lchflags(2) */
655*68e520feSAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
656*68e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
657*68e520feSAlan Somers 	ATF_REQUIRE_EQ(0, lchflags(path, UF_OFFLINE));
658*68e520feSAlan Somers 	check_audit(fds, successreg, pipefd);
659*68e520feSAlan Somers }
660*68e520feSAlan Somers 
661*68e520feSAlan Somers ATF_TC_CLEANUP(lchflags_success, tc)
662*68e520feSAlan Somers {
663*68e520feSAlan Somers 	cleanup();
664*68e520feSAlan Somers }
665*68e520feSAlan Somers 
666*68e520feSAlan Somers 
667*68e520feSAlan Somers ATF_TC_WITH_CLEANUP(lchflags_failure);
668*68e520feSAlan Somers ATF_TC_HEAD(lchflags_failure, tc)
669*68e520feSAlan Somers {
670*68e520feSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
671*68e520feSAlan Somers 					"lchflags(2) call");
672*68e520feSAlan Somers }
673*68e520feSAlan Somers 
674*68e520feSAlan Somers ATF_TC_BODY(lchflags_failure, tc)
675*68e520feSAlan Somers {
676*68e520feSAlan Somers 	FILE *pipefd = setup(fds, auclass);
677*68e520feSAlan Somers 	/* Failure reason: Symbolic link does not exist */
678*68e520feSAlan Somers 	ATF_REQUIRE_EQ(-1, lchflags(errpath, UF_OFFLINE));
679*68e520feSAlan Somers 	check_audit(fds, failurereg, pipefd);
680*68e520feSAlan Somers }
681*68e520feSAlan Somers 
682*68e520feSAlan Somers ATF_TC_CLEANUP(lchflags_failure, tc)
683*68e520feSAlan Somers {
684*68e520feSAlan Somers 	cleanup();
685*68e520feSAlan Somers }
686*68e520feSAlan Somers 
687*68e520feSAlan Somers 
6886d203d2dSAlan Somers ATF_TP_ADD_TCS(tp)
6896d203d2dSAlan Somers {
6906d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, flock_success);
6916d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, flock_failure);
6926d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fcntl_success);
6936d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fcntl_failure);
6946d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fsync_success);
6956d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fsync_failure);
6966d203d2dSAlan Somers 
69728845213SAlan Somers 	ATF_TP_ADD_TC(tp, chmod_success);
69828845213SAlan Somers 	ATF_TP_ADD_TC(tp, chmod_failure);
69928845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmod_success);
70028845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmod_failure);
70128845213SAlan Somers 	ATF_TP_ADD_TC(tp, lchmod_success);
70228845213SAlan Somers 	ATF_TP_ADD_TC(tp, lchmod_failure);
70328845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmodat_success);
70428845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmodat_failure);
70528845213SAlan Somers 
7065c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, chown_success);
7075c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, chown_failure);
7085c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchown_success);
7095c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchown_failure);
7105c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, lchown_success);
7115c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, lchown_failure);
7125c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchownat_success);
7135c9a4738SAlan Somers 	ATF_TP_ADD_TC(tp, fchownat_failure);
7145c9a4738SAlan Somers 
715*68e520feSAlan Somers 	ATF_TP_ADD_TC(tp, chflags_success);
716*68e520feSAlan Somers 	ATF_TP_ADD_TC(tp, chflags_failure);
717*68e520feSAlan Somers 	ATF_TP_ADD_TC(tp, fchflags_success);
718*68e520feSAlan Somers 	ATF_TP_ADD_TC(tp, fchflags_failure);
719*68e520feSAlan Somers 	ATF_TP_ADD_TC(tp, lchflags_success);
720*68e520feSAlan Somers 	ATF_TP_ADD_TC(tp, lchflags_failure);
721*68e520feSAlan Somers 
7226d203d2dSAlan Somers 	return (atf_no_error());
7236d203d2dSAlan Somers }
724