xref: /freebsd/tests/sys/audit/file-attribute-modify.c (revision 28845213708373c55368c07ed56a7c1b7b8661cd)
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>
29*28845213SAlan 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;
386d203d2dSAlan Somers static int filedesc;
396d203d2dSAlan Somers static struct pollfd fds[1];
406d203d2dSAlan Somers static mode_t mode = 0777;
416d203d2dSAlan Somers static char extregex[80];
426d203d2dSAlan Somers static const char *auclass = "fm";
436d203d2dSAlan Somers static const char *path = "fileforaudit";
44*28845213SAlan Somers static const char *errpath = "adirhasnoname/fileforaudit";
45*28845213SAlan Somers static const char *successreg = "fileforaudit.*return,success";
46*28845213SAlan Somers static const char *failurereg = "fileforaudit.*return,failure";
476d203d2dSAlan Somers 
486d203d2dSAlan Somers 
496d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(flock_success);
506d203d2dSAlan Somers ATF_TC_HEAD(flock_success, tc)
516d203d2dSAlan Somers {
526d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
536d203d2dSAlan Somers 					"flock(2) call");
546d203d2dSAlan Somers }
556d203d2dSAlan Somers 
566d203d2dSAlan Somers ATF_TC_BODY(flock_success, tc)
576d203d2dSAlan Somers {
586d203d2dSAlan Somers 	pid = getpid();
596d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex), "flock.*%d.*return,success", pid);
606d203d2dSAlan Somers 
616d203d2dSAlan Somers 	/* File needs to exist to call flock(2) */
626d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
636d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
646d203d2dSAlan Somers 	ATF_REQUIRE_EQ(0, flock(filedesc, LOCK_SH));
656d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
666d203d2dSAlan Somers 	close(filedesc);
676d203d2dSAlan Somers }
686d203d2dSAlan Somers 
696d203d2dSAlan Somers ATF_TC_CLEANUP(flock_success, tc)
706d203d2dSAlan Somers {
716d203d2dSAlan Somers 	cleanup();
726d203d2dSAlan Somers }
736d203d2dSAlan Somers 
746d203d2dSAlan Somers 
756d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(flock_failure);
766d203d2dSAlan Somers ATF_TC_HEAD(flock_failure, tc)
776d203d2dSAlan Somers {
786d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
796d203d2dSAlan Somers 					"flock(2) call");
806d203d2dSAlan Somers }
816d203d2dSAlan Somers 
826d203d2dSAlan Somers ATF_TC_BODY(flock_failure, tc)
836d203d2dSAlan Somers {
846d203d2dSAlan Somers 	const char *regex = "flock.*return,failure : Bad file descriptor";
856d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
866d203d2dSAlan Somers 	ATF_REQUIRE_EQ(-1, flock(-1, LOCK_SH));
876d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
886d203d2dSAlan Somers }
896d203d2dSAlan Somers 
906d203d2dSAlan Somers ATF_TC_CLEANUP(flock_failure, tc)
916d203d2dSAlan Somers {
926d203d2dSAlan Somers 	cleanup();
936d203d2dSAlan Somers }
946d203d2dSAlan Somers 
956d203d2dSAlan Somers 
966d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fcntl_success);
976d203d2dSAlan Somers ATF_TC_HEAD(fcntl_success, tc)
986d203d2dSAlan Somers {
996d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1006d203d2dSAlan Somers 					"fcntl(2) call");
1016d203d2dSAlan Somers }
1026d203d2dSAlan Somers 
1036d203d2dSAlan Somers ATF_TC_BODY(fcntl_success, tc)
1046d203d2dSAlan Somers {
1056d203d2dSAlan Somers 	int flagstatus;
1066d203d2dSAlan Somers 	/* File needs to exist to call fcntl(2) */
1076d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1086d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1096d203d2dSAlan Somers 
1106d203d2dSAlan Somers 	/* Retrieve the status flags of 'filedesc' and store it in flagstatus */
1116d203d2dSAlan Somers 	ATF_REQUIRE((flagstatus = fcntl(filedesc, F_GETFL, 0)) != -1);
1126d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex),
1136d203d2dSAlan Somers 			"fcntl.*return,success,%d", flagstatus);
1146d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
1156d203d2dSAlan Somers 	close(filedesc);
1166d203d2dSAlan Somers }
1176d203d2dSAlan Somers 
1186d203d2dSAlan Somers ATF_TC_CLEANUP(fcntl_success, tc)
1196d203d2dSAlan Somers {
1206d203d2dSAlan Somers 	cleanup();
1216d203d2dSAlan Somers }
1226d203d2dSAlan Somers 
1236d203d2dSAlan Somers 
1246d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fcntl_failure);
1256d203d2dSAlan Somers ATF_TC_HEAD(fcntl_failure, tc)
1266d203d2dSAlan Somers {
1276d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1286d203d2dSAlan Somers 					"fcntl(2) call");
1296d203d2dSAlan Somers }
1306d203d2dSAlan Somers 
1316d203d2dSAlan Somers ATF_TC_BODY(fcntl_failure, tc)
1326d203d2dSAlan Somers {
1336d203d2dSAlan Somers 	const char *regex = "fcntl.*return,failure : Bad file descriptor";
1346d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1356d203d2dSAlan Somers 	ATF_REQUIRE_EQ(-1, fcntl(-1, F_GETFL, 0));
1366d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
1376d203d2dSAlan Somers }
1386d203d2dSAlan Somers 
1396d203d2dSAlan Somers ATF_TC_CLEANUP(fcntl_failure, tc)
1406d203d2dSAlan Somers {
1416d203d2dSAlan Somers 	cleanup();
1426d203d2dSAlan Somers }
1436d203d2dSAlan Somers 
1446d203d2dSAlan Somers 
1456d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fsync_success);
1466d203d2dSAlan Somers ATF_TC_HEAD(fsync_success, tc)
1476d203d2dSAlan Somers {
1486d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1496d203d2dSAlan Somers 					"fsync(2) call");
1506d203d2dSAlan Somers }
1516d203d2dSAlan Somers 
1526d203d2dSAlan Somers ATF_TC_BODY(fsync_success, tc)
1536d203d2dSAlan Somers {
1546d203d2dSAlan Somers 	pid = getpid();
1556d203d2dSAlan Somers 	snprintf(extregex, sizeof(extregex), "fsync.*%d.*return,success", pid);
1566d203d2dSAlan Somers 
1576d203d2dSAlan Somers 	/* File needs to exist to call fsync(2) */
1586d203d2dSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1596d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1606d203d2dSAlan Somers 	ATF_REQUIRE_EQ(0, fsync(filedesc));
1616d203d2dSAlan Somers 	check_audit(fds, extregex, pipefd);
1626d203d2dSAlan Somers 	close(filedesc);
1636d203d2dSAlan Somers }
1646d203d2dSAlan Somers 
1656d203d2dSAlan Somers ATF_TC_CLEANUP(fsync_success, tc)
1666d203d2dSAlan Somers {
1676d203d2dSAlan Somers 	cleanup();
1686d203d2dSAlan Somers }
1696d203d2dSAlan Somers 
1706d203d2dSAlan Somers 
1716d203d2dSAlan Somers ATF_TC_WITH_CLEANUP(fsync_failure);
1726d203d2dSAlan Somers ATF_TC_HEAD(fsync_failure, tc)
1736d203d2dSAlan Somers {
1746d203d2dSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1756d203d2dSAlan Somers 					"fsync(2) call");
1766d203d2dSAlan Somers }
1776d203d2dSAlan Somers 
1786d203d2dSAlan Somers ATF_TC_BODY(fsync_failure, tc)
1796d203d2dSAlan Somers {
1806d203d2dSAlan Somers 	const char *regex = "fsync.*return,failure : Bad file descriptor";
1816d203d2dSAlan Somers 	FILE *pipefd = setup(fds, auclass);
1826d203d2dSAlan Somers 	/* Failure reason: Invalid file descriptor */
1836d203d2dSAlan Somers 	ATF_REQUIRE_EQ(-1, fsync(-1));
1846d203d2dSAlan Somers 	check_audit(fds, regex, pipefd);
1856d203d2dSAlan Somers }
1866d203d2dSAlan Somers 
1876d203d2dSAlan Somers ATF_TC_CLEANUP(fsync_failure, tc)
1886d203d2dSAlan Somers {
1896d203d2dSAlan Somers 	cleanup();
1906d203d2dSAlan Somers }
1916d203d2dSAlan Somers 
1926d203d2dSAlan Somers 
193*28845213SAlan Somers ATF_TC_WITH_CLEANUP(chmod_success);
194*28845213SAlan Somers ATF_TC_HEAD(chmod_success, tc)
195*28845213SAlan Somers {
196*28845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
197*28845213SAlan Somers 					"chmod(2) call");
198*28845213SAlan Somers }
199*28845213SAlan Somers 
200*28845213SAlan Somers ATF_TC_BODY(chmod_success, tc)
201*28845213SAlan Somers {
202*28845213SAlan Somers 	/* File needs to exist to call chmod(2) */
203*28845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
204*28845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
205*28845213SAlan Somers 	ATF_REQUIRE_EQ(0, chmod(path, mode));
206*28845213SAlan Somers 	check_audit(fds, successreg, pipefd);
207*28845213SAlan Somers 	close(filedesc);
208*28845213SAlan Somers }
209*28845213SAlan Somers 
210*28845213SAlan Somers ATF_TC_CLEANUP(chmod_success, tc)
211*28845213SAlan Somers {
212*28845213SAlan Somers 	cleanup();
213*28845213SAlan Somers }
214*28845213SAlan Somers 
215*28845213SAlan Somers 
216*28845213SAlan Somers ATF_TC_WITH_CLEANUP(chmod_failure);
217*28845213SAlan Somers ATF_TC_HEAD(chmod_failure, tc)
218*28845213SAlan Somers {
219*28845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
220*28845213SAlan Somers 					"chmod(2) call");
221*28845213SAlan Somers }
222*28845213SAlan Somers 
223*28845213SAlan Somers ATF_TC_BODY(chmod_failure, tc)
224*28845213SAlan Somers {
225*28845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
226*28845213SAlan Somers 	/* Failure reason: file does not exist */
227*28845213SAlan Somers 	ATF_REQUIRE_EQ(-1, chmod(errpath, mode));
228*28845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
229*28845213SAlan Somers }
230*28845213SAlan Somers 
231*28845213SAlan Somers ATF_TC_CLEANUP(chmod_failure, tc)
232*28845213SAlan Somers {
233*28845213SAlan Somers 	cleanup();
234*28845213SAlan Somers }
235*28845213SAlan Somers 
236*28845213SAlan Somers 
237*28845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmod_success);
238*28845213SAlan Somers ATF_TC_HEAD(fchmod_success, tc)
239*28845213SAlan Somers {
240*28845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
241*28845213SAlan Somers 					"fchmod(2) call");
242*28845213SAlan Somers }
243*28845213SAlan Somers 
244*28845213SAlan Somers ATF_TC_BODY(fchmod_success, tc)
245*28845213SAlan Somers {
246*28845213SAlan Somers 	pid = getpid();
247*28845213SAlan Somers 	snprintf(extregex, sizeof(extregex), "fchmod.*%d.*return,success", pid);
248*28845213SAlan Somers 
249*28845213SAlan Somers 	/* File needs to exist to call fchmod(2) */
250*28845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
251*28845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
252*28845213SAlan Somers 	ATF_REQUIRE_EQ(0, fchmod(filedesc, mode));
253*28845213SAlan Somers 	check_audit(fds, extregex, pipefd);
254*28845213SAlan Somers 	close(filedesc);
255*28845213SAlan Somers }
256*28845213SAlan Somers 
257*28845213SAlan Somers ATF_TC_CLEANUP(fchmod_success, tc)
258*28845213SAlan Somers {
259*28845213SAlan Somers 	cleanup();
260*28845213SAlan Somers }
261*28845213SAlan Somers 
262*28845213SAlan Somers 
263*28845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmod_failure);
264*28845213SAlan Somers ATF_TC_HEAD(fchmod_failure, tc)
265*28845213SAlan Somers {
266*28845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
267*28845213SAlan Somers 					"fchmod(2) call");
268*28845213SAlan Somers }
269*28845213SAlan Somers 
270*28845213SAlan Somers ATF_TC_BODY(fchmod_failure, tc)
271*28845213SAlan Somers {
272*28845213SAlan Somers 	const char *regex = "fchmod.*return,failure : Bad file descriptor";
273*28845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
274*28845213SAlan Somers 	/* Failure reason: Invalid file descriptor */
275*28845213SAlan Somers 	ATF_REQUIRE_EQ(-1, fchmod(-1, mode));
276*28845213SAlan Somers 	check_audit(fds, regex, pipefd);
277*28845213SAlan Somers }
278*28845213SAlan Somers 
279*28845213SAlan Somers ATF_TC_CLEANUP(fchmod_failure, tc)
280*28845213SAlan Somers {
281*28845213SAlan Somers 	cleanup();
282*28845213SAlan Somers }
283*28845213SAlan Somers 
284*28845213SAlan Somers 
285*28845213SAlan Somers ATF_TC_WITH_CLEANUP(lchmod_success);
286*28845213SAlan Somers ATF_TC_HEAD(lchmod_success, tc)
287*28845213SAlan Somers {
288*28845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
289*28845213SAlan Somers 					"lchmod(2) call");
290*28845213SAlan Somers }
291*28845213SAlan Somers 
292*28845213SAlan Somers ATF_TC_BODY(lchmod_success, tc)
293*28845213SAlan Somers {
294*28845213SAlan Somers 	/* Symbolic link needs to exist to call lchmod(2) */
295*28845213SAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
296*28845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
297*28845213SAlan Somers 	ATF_REQUIRE_EQ(0, lchmod(path, mode));
298*28845213SAlan Somers 	check_audit(fds, successreg, pipefd);
299*28845213SAlan Somers }
300*28845213SAlan Somers 
301*28845213SAlan Somers ATF_TC_CLEANUP(lchmod_success, tc)
302*28845213SAlan Somers {
303*28845213SAlan Somers 	cleanup();
304*28845213SAlan Somers }
305*28845213SAlan Somers 
306*28845213SAlan Somers 
307*28845213SAlan Somers ATF_TC_WITH_CLEANUP(lchmod_failure);
308*28845213SAlan Somers ATF_TC_HEAD(lchmod_failure, tc)
309*28845213SAlan Somers {
310*28845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
311*28845213SAlan Somers 					"lchmod(2) call");
312*28845213SAlan Somers }
313*28845213SAlan Somers 
314*28845213SAlan Somers ATF_TC_BODY(lchmod_failure, tc)
315*28845213SAlan Somers {
316*28845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
317*28845213SAlan Somers 	/* Failure reason: file does not exist */
318*28845213SAlan Somers 	ATF_REQUIRE_EQ(-1, lchmod(errpath, mode));
319*28845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
320*28845213SAlan Somers }
321*28845213SAlan Somers 
322*28845213SAlan Somers ATF_TC_CLEANUP(lchmod_failure, tc)
323*28845213SAlan Somers {
324*28845213SAlan Somers 	cleanup();
325*28845213SAlan Somers }
326*28845213SAlan Somers 
327*28845213SAlan Somers 
328*28845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmodat_success);
329*28845213SAlan Somers ATF_TC_HEAD(fchmodat_success, tc)
330*28845213SAlan Somers {
331*28845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
332*28845213SAlan Somers 					"fchmodat(2) call");
333*28845213SAlan Somers }
334*28845213SAlan Somers 
335*28845213SAlan Somers ATF_TC_BODY(fchmodat_success, tc)
336*28845213SAlan Somers {
337*28845213SAlan Somers 	/* File needs to exist to call fchmodat(2) */
338*28845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
339*28845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
340*28845213SAlan Somers 	ATF_REQUIRE_EQ(0, fchmodat(AT_FDCWD, path, mode, 0));
341*28845213SAlan Somers 	check_audit(fds, successreg, pipefd);
342*28845213SAlan Somers 	close(filedesc);
343*28845213SAlan Somers }
344*28845213SAlan Somers 
345*28845213SAlan Somers ATF_TC_CLEANUP(fchmodat_success, tc)
346*28845213SAlan Somers {
347*28845213SAlan Somers 	cleanup();
348*28845213SAlan Somers }
349*28845213SAlan Somers 
350*28845213SAlan Somers 
351*28845213SAlan Somers ATF_TC_WITH_CLEANUP(fchmodat_failure);
352*28845213SAlan Somers ATF_TC_HEAD(fchmodat_failure, tc)
353*28845213SAlan Somers {
354*28845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
355*28845213SAlan Somers 					"fchmodat(2) call");
356*28845213SAlan Somers }
357*28845213SAlan Somers 
358*28845213SAlan Somers ATF_TC_BODY(fchmodat_failure, tc)
359*28845213SAlan Somers {
360*28845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
361*28845213SAlan Somers 	/* Failure reason: file does not exist */
362*28845213SAlan Somers 	ATF_REQUIRE_EQ(-1, fchmodat(AT_FDCWD, errpath, mode, 0));
363*28845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
364*28845213SAlan Somers }
365*28845213SAlan Somers 
366*28845213SAlan Somers ATF_TC_CLEANUP(fchmodat_failure, tc)
367*28845213SAlan Somers {
368*28845213SAlan Somers 	cleanup();
369*28845213SAlan Somers }
370*28845213SAlan Somers 
371*28845213SAlan Somers 
3726d203d2dSAlan Somers ATF_TP_ADD_TCS(tp)
3736d203d2dSAlan Somers {
3746d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, flock_success);
3756d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, flock_failure);
3766d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fcntl_success);
3776d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fcntl_failure);
3786d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fsync_success);
3796d203d2dSAlan Somers 	ATF_TP_ADD_TC(tp, fsync_failure);
3806d203d2dSAlan Somers 
381*28845213SAlan Somers 	ATF_TP_ADD_TC(tp, chmod_success);
382*28845213SAlan Somers 	ATF_TP_ADD_TC(tp, chmod_failure);
383*28845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmod_success);
384*28845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmod_failure);
385*28845213SAlan Somers 	ATF_TP_ADD_TC(tp, lchmod_success);
386*28845213SAlan Somers 	ATF_TP_ADD_TC(tp, lchmod_failure);
387*28845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmodat_success);
388*28845213SAlan Somers 	ATF_TP_ADD_TC(tp, fchmodat_failure);
389*28845213SAlan Somers 
3906d203d2dSAlan Somers 	return (atf_no_error());
3916d203d2dSAlan Somers }
392