1*a19dca2dSAlan Somers /*- 2*a19dca2dSAlan Somers * Copyright 2018 Aniket Pandey 3*a19dca2dSAlan Somers * 4*a19dca2dSAlan Somers * Redistribution and use in source and binary forms, with or without 5*a19dca2dSAlan Somers * modification, are permitted provided that the following conditions 6*a19dca2dSAlan Somers * are met: 7*a19dca2dSAlan Somers * 1. Redistributions of source code must retain the above copyright 8*a19dca2dSAlan Somers * notice, this list of conditions and the following disclaimer. 9*a19dca2dSAlan Somers * 2. Redistributions in binary form must reproduce the above copyright 10*a19dca2dSAlan Somers * notice, this list of conditions and the following disclaimer in the 11*a19dca2dSAlan Somers * documentation and/or other materials provided with the distribution. 12*a19dca2dSAlan Somers * 13*a19dca2dSAlan Somers * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14*a19dca2dSAlan Somers * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15*a19dca2dSAlan Somers * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16*a19dca2dSAlan Somers * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17*a19dca2dSAlan Somers * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18*a19dca2dSAlan Somers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19*a19dca2dSAlan Somers * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 20*a19dca2dSAlan Somers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*a19dca2dSAlan Somers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*a19dca2dSAlan Somers * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*a19dca2dSAlan Somers * SUCH DAMAGE. 24*a19dca2dSAlan Somers * 25*a19dca2dSAlan Somers * $FreeBSD$ 26*a19dca2dSAlan Somers */ 27*a19dca2dSAlan Somers 28*a19dca2dSAlan Somers #include <sys/stat.h> 29*a19dca2dSAlan Somers 30*a19dca2dSAlan Somers #include <atf-c.h> 31*a19dca2dSAlan Somers #include <fcntl.h> 32*a19dca2dSAlan Somers #include <unistd.h> 33*a19dca2dSAlan Somers 34*a19dca2dSAlan Somers #include "utils.h" 35*a19dca2dSAlan Somers 36*a19dca2dSAlan Somers static struct pollfd fds[1]; 37*a19dca2dSAlan Somers static mode_t mode = 0777; 38*a19dca2dSAlan Somers static const char *path = "fileforaudit"; 39*a19dca2dSAlan Somers static const char *errpath = "dirdoesnotexist/fileforaudit"; 40*a19dca2dSAlan Somers static const char *successreg = "fileforaudit.*return,success"; 41*a19dca2dSAlan Somers static const char *failurereg = "fileforaudit.*return,failure"; 42*a19dca2dSAlan Somers 43*a19dca2dSAlan Somers 44*a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(rmdir_success); 45*a19dca2dSAlan Somers ATF_TC_HEAD(rmdir_success, tc) 46*a19dca2dSAlan Somers { 47*a19dca2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 48*a19dca2dSAlan Somers "rmdir(2) call"); 49*a19dca2dSAlan Somers } 50*a19dca2dSAlan Somers 51*a19dca2dSAlan Somers ATF_TC_BODY(rmdir_success, tc) 52*a19dca2dSAlan Somers { 53*a19dca2dSAlan Somers ATF_REQUIRE_EQ(0, mkdir(path, mode)); 54*a19dca2dSAlan Somers FILE *pipefd = setup(fds, "fd"); 55*a19dca2dSAlan Somers ATF_REQUIRE_EQ(0, rmdir(path)); 56*a19dca2dSAlan Somers check_audit(fds, successreg, pipefd); 57*a19dca2dSAlan Somers } 58*a19dca2dSAlan Somers 59*a19dca2dSAlan Somers ATF_TC_CLEANUP(rmdir_success, tc) 60*a19dca2dSAlan Somers { 61*a19dca2dSAlan Somers cleanup(); 62*a19dca2dSAlan Somers } 63*a19dca2dSAlan Somers 64*a19dca2dSAlan Somers 65*a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(rmdir_failure); 66*a19dca2dSAlan Somers ATF_TC_HEAD(rmdir_failure, tc) 67*a19dca2dSAlan Somers { 68*a19dca2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 69*a19dca2dSAlan Somers "rmdir(2) call"); 70*a19dca2dSAlan Somers } 71*a19dca2dSAlan Somers 72*a19dca2dSAlan Somers ATF_TC_BODY(rmdir_failure, tc) 73*a19dca2dSAlan Somers { 74*a19dca2dSAlan Somers FILE *pipefd = setup(fds, "fd"); 75*a19dca2dSAlan Somers /* Failure reason: directory does not exist */ 76*a19dca2dSAlan Somers ATF_REQUIRE_EQ(-1, rmdir(errpath)); 77*a19dca2dSAlan Somers check_audit(fds, failurereg, pipefd); 78*a19dca2dSAlan Somers } 79*a19dca2dSAlan Somers 80*a19dca2dSAlan Somers ATF_TC_CLEANUP(rmdir_failure, tc) 81*a19dca2dSAlan Somers { 82*a19dca2dSAlan Somers cleanup(); 83*a19dca2dSAlan Somers } 84*a19dca2dSAlan Somers 85*a19dca2dSAlan Somers 86*a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(rename_success); 87*a19dca2dSAlan Somers ATF_TC_HEAD(rename_success, tc) 88*a19dca2dSAlan Somers { 89*a19dca2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 90*a19dca2dSAlan Somers "rename(2) call"); 91*a19dca2dSAlan Somers } 92*a19dca2dSAlan Somers 93*a19dca2dSAlan Somers ATF_TC_BODY(rename_success, tc) 94*a19dca2dSAlan Somers { 95*a19dca2dSAlan Somers ATF_REQUIRE(open(path, O_CREAT, mode) != -1); 96*a19dca2dSAlan Somers FILE *pipefd = setup(fds, "fd"); 97*a19dca2dSAlan Somers ATF_REQUIRE_EQ(0, rename(path, "renamed")); 98*a19dca2dSAlan Somers check_audit(fds, successreg, pipefd); 99*a19dca2dSAlan Somers } 100*a19dca2dSAlan Somers 101*a19dca2dSAlan Somers ATF_TC_CLEANUP(rename_success, tc) 102*a19dca2dSAlan Somers { 103*a19dca2dSAlan Somers cleanup(); 104*a19dca2dSAlan Somers } 105*a19dca2dSAlan Somers 106*a19dca2dSAlan Somers 107*a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(rename_failure); 108*a19dca2dSAlan Somers ATF_TC_HEAD(rename_failure, tc) 109*a19dca2dSAlan Somers { 110*a19dca2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 111*a19dca2dSAlan Somers "rename(2) call"); 112*a19dca2dSAlan Somers } 113*a19dca2dSAlan Somers 114*a19dca2dSAlan Somers ATF_TC_BODY(rename_failure, tc) 115*a19dca2dSAlan Somers { 116*a19dca2dSAlan Somers FILE *pipefd = setup(fds, "fd"); 117*a19dca2dSAlan Somers /* Failure reason: file does not exist */ 118*a19dca2dSAlan Somers ATF_REQUIRE_EQ(-1, rename(path, "renamed")); 119*a19dca2dSAlan Somers check_audit(fds, failurereg, pipefd); 120*a19dca2dSAlan Somers } 121*a19dca2dSAlan Somers 122*a19dca2dSAlan Somers ATF_TC_CLEANUP(rename_failure, tc) 123*a19dca2dSAlan Somers { 124*a19dca2dSAlan Somers cleanup(); 125*a19dca2dSAlan Somers } 126*a19dca2dSAlan Somers 127*a19dca2dSAlan Somers 128*a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(renameat_success); 129*a19dca2dSAlan Somers ATF_TC_HEAD(renameat_success, tc) 130*a19dca2dSAlan Somers { 131*a19dca2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 132*a19dca2dSAlan Somers "renameat(2) call"); 133*a19dca2dSAlan Somers } 134*a19dca2dSAlan Somers 135*a19dca2dSAlan Somers ATF_TC_BODY(renameat_success, tc) 136*a19dca2dSAlan Somers { 137*a19dca2dSAlan Somers ATF_REQUIRE(open(path, O_CREAT, mode) != -1); 138*a19dca2dSAlan Somers FILE *pipefd = setup(fds, "fd"); 139*a19dca2dSAlan Somers ATF_REQUIRE_EQ(0, renameat(AT_FDCWD, path, AT_FDCWD, "renamed")); 140*a19dca2dSAlan Somers check_audit(fds, successreg, pipefd); 141*a19dca2dSAlan Somers } 142*a19dca2dSAlan Somers 143*a19dca2dSAlan Somers ATF_TC_CLEANUP(renameat_success, tc) 144*a19dca2dSAlan Somers { 145*a19dca2dSAlan Somers cleanup(); 146*a19dca2dSAlan Somers } 147*a19dca2dSAlan Somers 148*a19dca2dSAlan Somers 149*a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(renameat_failure); 150*a19dca2dSAlan Somers ATF_TC_HEAD(renameat_failure, tc) 151*a19dca2dSAlan Somers { 152*a19dca2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 153*a19dca2dSAlan Somers "renameat(2) call"); 154*a19dca2dSAlan Somers } 155*a19dca2dSAlan Somers 156*a19dca2dSAlan Somers ATF_TC_BODY(renameat_failure, tc) 157*a19dca2dSAlan Somers { 158*a19dca2dSAlan Somers FILE *pipefd = setup(fds, "fd"); 159*a19dca2dSAlan Somers /* Failure reason: file does not exist */ 160*a19dca2dSAlan Somers ATF_REQUIRE_EQ(-1, renameat(AT_FDCWD, path, AT_FDCWD, "renamed")); 161*a19dca2dSAlan Somers check_audit(fds, failurereg, pipefd); 162*a19dca2dSAlan Somers } 163*a19dca2dSAlan Somers 164*a19dca2dSAlan Somers ATF_TC_CLEANUP(renameat_failure, tc) 165*a19dca2dSAlan Somers { 166*a19dca2dSAlan Somers cleanup(); 167*a19dca2dSAlan Somers } 168*a19dca2dSAlan Somers 169*a19dca2dSAlan Somers 170*a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(unlink_success); 171*a19dca2dSAlan Somers ATF_TC_HEAD(unlink_success, tc) 172*a19dca2dSAlan Somers { 173*a19dca2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 174*a19dca2dSAlan Somers "unlink(2) call"); 175*a19dca2dSAlan Somers } 176*a19dca2dSAlan Somers 177*a19dca2dSAlan Somers ATF_TC_BODY(unlink_success, tc) 178*a19dca2dSAlan Somers { 179*a19dca2dSAlan Somers ATF_REQUIRE(open(path, O_CREAT, mode) != -1); 180*a19dca2dSAlan Somers FILE *pipefd = setup(fds, "fd"); 181*a19dca2dSAlan Somers ATF_REQUIRE_EQ(0, unlink(path)); 182*a19dca2dSAlan Somers check_audit(fds, successreg, pipefd); 183*a19dca2dSAlan Somers } 184*a19dca2dSAlan Somers 185*a19dca2dSAlan Somers ATF_TC_CLEANUP(unlink_success, tc) 186*a19dca2dSAlan Somers { 187*a19dca2dSAlan Somers cleanup(); 188*a19dca2dSAlan Somers } 189*a19dca2dSAlan Somers 190*a19dca2dSAlan Somers 191*a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(unlink_failure); 192*a19dca2dSAlan Somers ATF_TC_HEAD(unlink_failure, tc) 193*a19dca2dSAlan Somers { 194*a19dca2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 195*a19dca2dSAlan Somers "unlink(2) call"); 196*a19dca2dSAlan Somers } 197*a19dca2dSAlan Somers 198*a19dca2dSAlan Somers ATF_TC_BODY(unlink_failure, tc) 199*a19dca2dSAlan Somers { 200*a19dca2dSAlan Somers FILE *pipefd = setup(fds, "fd"); 201*a19dca2dSAlan Somers /* Failure reason: file does not exist */ 202*a19dca2dSAlan Somers ATF_REQUIRE_EQ(-1, unlink(errpath)); 203*a19dca2dSAlan Somers check_audit(fds, failurereg, pipefd); 204*a19dca2dSAlan Somers } 205*a19dca2dSAlan Somers 206*a19dca2dSAlan Somers ATF_TC_CLEANUP(unlink_failure, tc) 207*a19dca2dSAlan Somers { 208*a19dca2dSAlan Somers cleanup(); 209*a19dca2dSAlan Somers } 210*a19dca2dSAlan Somers 211*a19dca2dSAlan Somers 212*a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(unlinkat_success); 213*a19dca2dSAlan Somers ATF_TC_HEAD(unlinkat_success, tc) 214*a19dca2dSAlan Somers { 215*a19dca2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful " 216*a19dca2dSAlan Somers "unlinkat(2) call"); 217*a19dca2dSAlan Somers } 218*a19dca2dSAlan Somers 219*a19dca2dSAlan Somers ATF_TC_BODY(unlinkat_success, tc) 220*a19dca2dSAlan Somers { 221*a19dca2dSAlan Somers ATF_REQUIRE_EQ(0, mkdir(path, mode)); 222*a19dca2dSAlan Somers FILE *pipefd = setup(fds, "fd"); 223*a19dca2dSAlan Somers ATF_REQUIRE_EQ(0, unlinkat(AT_FDCWD, path, AT_REMOVEDIR)); 224*a19dca2dSAlan Somers check_audit(fds, successreg, pipefd); 225*a19dca2dSAlan Somers } 226*a19dca2dSAlan Somers 227*a19dca2dSAlan Somers ATF_TC_CLEANUP(unlinkat_success, tc) 228*a19dca2dSAlan Somers { 229*a19dca2dSAlan Somers cleanup(); 230*a19dca2dSAlan Somers } 231*a19dca2dSAlan Somers 232*a19dca2dSAlan Somers 233*a19dca2dSAlan Somers ATF_TC_WITH_CLEANUP(unlinkat_failure); 234*a19dca2dSAlan Somers ATF_TC_HEAD(unlinkat_failure, tc) 235*a19dca2dSAlan Somers { 236*a19dca2dSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful " 237*a19dca2dSAlan Somers "unlinkat(2) call"); 238*a19dca2dSAlan Somers } 239*a19dca2dSAlan Somers 240*a19dca2dSAlan Somers ATF_TC_BODY(unlinkat_failure, tc) 241*a19dca2dSAlan Somers { 242*a19dca2dSAlan Somers FILE *pipefd = setup(fds, "fd"); 243*a19dca2dSAlan Somers /* Failure reason: directory does not exist */ 244*a19dca2dSAlan Somers ATF_REQUIRE_EQ(-1, unlinkat(AT_FDCWD, errpath, AT_REMOVEDIR)); 245*a19dca2dSAlan Somers check_audit(fds, failurereg, pipefd); 246*a19dca2dSAlan Somers } 247*a19dca2dSAlan Somers 248*a19dca2dSAlan Somers ATF_TC_CLEANUP(unlinkat_failure, tc) 249*a19dca2dSAlan Somers { 250*a19dca2dSAlan Somers cleanup(); 251*a19dca2dSAlan Somers } 252*a19dca2dSAlan Somers 253*a19dca2dSAlan Somers 254*a19dca2dSAlan Somers ATF_TP_ADD_TCS(tp) 255*a19dca2dSAlan Somers { 256*a19dca2dSAlan Somers ATF_TP_ADD_TC(tp, rmdir_success); 257*a19dca2dSAlan Somers ATF_TP_ADD_TC(tp, rmdir_failure); 258*a19dca2dSAlan Somers 259*a19dca2dSAlan Somers ATF_TP_ADD_TC(tp, rename_success); 260*a19dca2dSAlan Somers ATF_TP_ADD_TC(tp, rename_failure); 261*a19dca2dSAlan Somers ATF_TP_ADD_TC(tp, renameat_success); 262*a19dca2dSAlan Somers ATF_TP_ADD_TC(tp, renameat_failure); 263*a19dca2dSAlan Somers 264*a19dca2dSAlan Somers ATF_TP_ADD_TC(tp, unlink_success); 265*a19dca2dSAlan Somers ATF_TP_ADD_TC(tp, unlink_failure); 266*a19dca2dSAlan Somers ATF_TP_ADD_TC(tp, unlinkat_success); 267*a19dca2dSAlan Somers ATF_TP_ADD_TC(tp, unlinkat_failure); 268*a19dca2dSAlan Somers 269*a19dca2dSAlan Somers return (atf_no_error()); 270*a19dca2dSAlan Somers } 271