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