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