2 * Copyright 2018 Aniket Pandey
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 #include <sys/types.h>
36 static struct pollfd fds[1];
37 static mode_t mode = 0777;
40 static const char *auclass = "fc";
41 static const char *path = "fileforaudit";
42 static const char *successreg = "fileforaudit.*return,success";
43 static const char *failurereg = "fileforaudit.*return,failure";
46 ATF_TC_WITH_CLEANUP(mkdir_success);
47 ATF_TC_HEAD(mkdir_success, tc)
49 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
53 ATF_TC_BODY(mkdir_success, tc)
55 FILE *pipefd = setup(fds, auclass);
56 ATF_REQUIRE_EQ(0, mkdir(path, mode));
57 check_audit(fds, successreg, pipefd);
60 ATF_TC_CLEANUP(mkdir_success, tc)
66 ATF_TC_WITH_CLEANUP(mkdir_failure);
67 ATF_TC_HEAD(mkdir_failure, tc)
69 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
73 ATF_TC_BODY(mkdir_failure, tc)
75 ATF_REQUIRE_EQ(0, mkdir(path, mode));
76 FILE *pipefd = setup(fds, auclass);
77 /* Failure reason: directory already exists */
78 ATF_REQUIRE_EQ(-1, mkdir(path, mode));
79 check_audit(fds, failurereg, pipefd);
82 ATF_TC_CLEANUP(mkdir_failure, tc)
88 ATF_TC_WITH_CLEANUP(mkdirat_success);
89 ATF_TC_HEAD(mkdirat_success, tc)
91 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
95 ATF_TC_BODY(mkdirat_success, tc)
97 FILE *pipefd = setup(fds, auclass);
98 ATF_REQUIRE_EQ(0, mkdirat(AT_FDCWD, path, mode));
99 check_audit(fds, successreg, pipefd);
102 ATF_TC_CLEANUP(mkdirat_success, tc)
108 ATF_TC_WITH_CLEANUP(mkdirat_failure);
109 ATF_TC_HEAD(mkdirat_failure, tc)
111 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
115 ATF_TC_BODY(mkdirat_failure, tc)
117 ATF_REQUIRE_EQ(0, mkdirat(AT_FDCWD, path, mode));
118 FILE *pipefd = setup(fds, auclass);
119 /* Failure reason: directory already exists */
120 ATF_REQUIRE_EQ(-1, mkdirat(AT_FDCWD, path, mode));
121 check_audit(fds, failurereg, pipefd);
124 ATF_TC_CLEANUP(mkdirat_failure, tc)
130 ATF_TC_WITH_CLEANUP(mkfifo_success);
131 ATF_TC_HEAD(mkfifo_success, tc)
133 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
137 ATF_TC_BODY(mkfifo_success, tc)
139 FILE *pipefd = setup(fds, auclass);
140 ATF_REQUIRE_EQ(0, mkfifo(path, mode));
141 check_audit(fds, successreg, pipefd);
144 ATF_TC_CLEANUP(mkfifo_success, tc)
150 ATF_TC_WITH_CLEANUP(mkfifo_failure);
151 ATF_TC_HEAD(mkfifo_failure, tc)
153 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
157 ATF_TC_BODY(mkfifo_failure, tc)
159 ATF_REQUIRE_EQ(0, mkfifo(path, mode));
160 FILE *pipefd = setup(fds, auclass);
161 /* Failure reason: FIFO already exists */
162 ATF_REQUIRE_EQ(-1, mkfifo(path, mode));
163 check_audit(fds, failurereg, pipefd);
166 ATF_TC_CLEANUP(mkfifo_failure, tc)
172 ATF_TC_WITH_CLEANUP(mkfifoat_success);
173 ATF_TC_HEAD(mkfifoat_success, tc)
175 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
179 ATF_TC_BODY(mkfifoat_success, tc)
181 FILE *pipefd = setup(fds, auclass);
182 ATF_REQUIRE_EQ(0, mkfifoat(AT_FDCWD, path, mode));
183 check_audit(fds, successreg, pipefd);
186 ATF_TC_CLEANUP(mkfifoat_success, tc)
192 ATF_TC_WITH_CLEANUP(mkfifoat_failure);
193 ATF_TC_HEAD(mkfifoat_failure, tc)
195 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
199 ATF_TC_BODY(mkfifoat_failure, tc)
201 ATF_REQUIRE_EQ(0, mkfifoat(AT_FDCWD, path, mode));
202 FILE *pipefd = setup(fds, auclass);
203 /* Failure reason: FIFO already exists */
204 ATF_REQUIRE_EQ(-1, mkfifoat(AT_FDCWD, path, mode));
205 check_audit(fds, failurereg, pipefd);
208 ATF_TC_CLEANUP(mkfifoat_failure, tc)
214 ATF_TC_WITH_CLEANUP(mknod_success);
215 ATF_TC_HEAD(mknod_success, tc)
217 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
221 ATF_TC_BODY(mknod_success, tc)
223 FILE *pipefd = setup(fds, auclass);
224 ATF_REQUIRE_EQ(0, mknod(path, S_IFIFO | S_IRWXO, dev));
225 check_audit(fds, successreg, pipefd);
228 ATF_TC_CLEANUP(mknod_success, tc)
234 ATF_TC_WITH_CLEANUP(mknod_failure);
235 ATF_TC_HEAD(mknod_failure, tc)
237 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
241 ATF_TC_BODY(mknod_failure, tc)
243 ATF_REQUIRE_EQ(0, mknod(path, S_IFIFO | S_IRWXO, dev));
244 FILE *pipefd = setup(fds, auclass);
245 /* Failure reason: FIFO node already exists */
246 ATF_REQUIRE_EQ(-1, mknod(path, S_IFIFO | S_IRWXO, dev));
247 check_audit(fds, failurereg, pipefd);
250 ATF_TC_CLEANUP(mknod_failure, tc)
256 ATF_TC_WITH_CLEANUP(mknodat_success);
257 ATF_TC_HEAD(mknodat_success, tc)
259 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
263 ATF_TC_BODY(mknodat_success, tc)
265 FILE *pipefd = setup(fds, auclass);
266 ATF_REQUIRE_EQ(0, mknodat(AT_FDCWD, path, S_IFIFO | S_IRWXO, dev));
267 check_audit(fds, successreg, pipefd);
270 ATF_TC_CLEANUP(mknodat_success, tc)
276 ATF_TC_WITH_CLEANUP(mknodat_failure);
277 ATF_TC_HEAD(mknodat_failure, tc)
279 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
283 ATF_TC_BODY(mknodat_failure, tc)
285 ATF_REQUIRE_EQ(0, mknodat(AT_FDCWD, path, S_IFIFO | S_IRWXO, dev));
286 FILE *pipefd = setup(fds, auclass);
287 /* Failure reason: FIFO node already exists */
288 ATF_REQUIRE_EQ(-1, mknodat(AT_FDCWD, path, S_IFIFO | S_IRWXO, dev));
289 check_audit(fds, failurereg, pipefd);
292 ATF_TC_CLEANUP(mknodat_failure, tc)
298 ATF_TC_WITH_CLEANUP(rename_success);
299 ATF_TC_HEAD(rename_success, tc)
301 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
305 ATF_TC_BODY(rename_success, tc)
307 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
308 FILE *pipefd = setup(fds, auclass);
309 ATF_REQUIRE_EQ(0, rename(path, "renamed"));
310 check_audit(fds, successreg, pipefd);
314 ATF_TC_CLEANUP(rename_success, tc)
320 ATF_TC_WITH_CLEANUP(rename_failure);
321 ATF_TC_HEAD(rename_failure, tc)
323 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
327 ATF_TC_BODY(rename_failure, tc)
329 FILE *pipefd = setup(fds, auclass);
330 /* Failure reason: file does not exist */
331 ATF_REQUIRE_EQ(-1, rename(path, "renamed"));
332 check_audit(fds, failurereg, pipefd);
335 ATF_TC_CLEANUP(rename_failure, tc)
341 ATF_TC_WITH_CLEANUP(renameat_success);
342 ATF_TC_HEAD(renameat_success, tc)
344 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
348 ATF_TC_BODY(renameat_success, tc)
350 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
351 FILE *pipefd = setup(fds, auclass);
352 ATF_REQUIRE_EQ(0, renameat(AT_FDCWD, path, AT_FDCWD, "renamed"));
353 check_audit(fds, successreg, pipefd);
357 ATF_TC_CLEANUP(renameat_success, tc)
363 ATF_TC_WITH_CLEANUP(renameat_failure);
364 ATF_TC_HEAD(renameat_failure, tc)
366 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
370 ATF_TC_BODY(renameat_failure, tc)
372 FILE *pipefd = setup(fds, auclass);
373 /* Failure reason: file does not exist */
374 ATF_REQUIRE_EQ(-1, renameat(AT_FDCWD, path, AT_FDCWD, "renamed"));
375 check_audit(fds, failurereg, pipefd);
378 ATF_TC_CLEANUP(renameat_failure, tc)
384 ATF_TC_WITH_CLEANUP(link_success);
385 ATF_TC_HEAD(link_success, tc)
387 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
391 ATF_TC_BODY(link_success, tc)
393 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
394 FILE *pipefd = setup(fds, auclass);
395 ATF_REQUIRE_EQ(0, link(path, "hardlink"));
396 check_audit(fds, successreg, pipefd);
400 ATF_TC_CLEANUP(link_success, tc)
406 ATF_TC_WITH_CLEANUP(link_failure);
407 ATF_TC_HEAD(link_failure, tc)
409 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
413 ATF_TC_BODY(link_failure, tc)
415 FILE *pipefd = setup(fds, auclass);
416 /* Failure reason: file does not exist */
417 ATF_REQUIRE_EQ(-1, link(path, "hardlink"));
418 check_audit(fds, failurereg, pipefd);
421 ATF_TC_CLEANUP(link_failure, tc)
427 ATF_TC_WITH_CLEANUP(linkat_success);
428 ATF_TC_HEAD(linkat_success, tc)
430 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
434 ATF_TC_BODY(linkat_success, tc)
436 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
437 FILE *pipefd = setup(fds, auclass);
438 ATF_REQUIRE_EQ(0, linkat(AT_FDCWD, path, AT_FDCWD, "hardlink", 0));
439 check_audit(fds, successreg, pipefd);
443 ATF_TC_CLEANUP(linkat_success, tc)
449 ATF_TC_WITH_CLEANUP(linkat_failure);
450 ATF_TC_HEAD(linkat_failure, tc)
452 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
456 ATF_TC_BODY(linkat_failure, tc)
458 FILE *pipefd = setup(fds, auclass);
459 /* Failure reason: file does not exist */
460 ATF_REQUIRE_EQ(-1, linkat(AT_FDCWD, path, AT_FDCWD, "hardlink", 0));
461 check_audit(fds, failurereg, pipefd);
464 ATF_TC_CLEANUP(linkat_failure, tc)
470 ATF_TC_WITH_CLEANUP(symlink_success);
471 ATF_TC_HEAD(symlink_success, tc)
473 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
477 ATF_TC_BODY(symlink_success, tc)
479 FILE *pipefd = setup(fds, auclass);
480 ATF_REQUIRE_EQ(0, symlink(path, "symlink"));
481 check_audit(fds, successreg, pipefd);
484 ATF_TC_CLEANUP(symlink_success, tc)
490 ATF_TC_WITH_CLEANUP(symlink_failure);
491 ATF_TC_HEAD(symlink_failure, tc)
493 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
497 ATF_TC_BODY(symlink_failure, tc)
499 ATF_REQUIRE_EQ(0, symlink(path, "symlink"));
500 FILE *pipefd = setup(fds, auclass);
501 /* Failure reason: symbolic link already exists */
502 ATF_REQUIRE_EQ(-1, symlink(path, "symlink"));
503 check_audit(fds, failurereg, pipefd);
506 ATF_TC_CLEANUP(symlink_failure, tc)
512 ATF_TC_WITH_CLEANUP(symlinkat_success);
513 ATF_TC_HEAD(symlinkat_success, tc)
515 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
516 "symlinkat(2) call");
519 ATF_TC_BODY(symlinkat_success, tc)
521 FILE *pipefd = setup(fds, auclass);
522 ATF_REQUIRE_EQ(0, symlinkat(path, AT_FDCWD, "symlink"));
523 check_audit(fds, successreg, pipefd);
526 ATF_TC_CLEANUP(symlinkat_success, tc)
532 ATF_TC_WITH_CLEANUP(symlinkat_failure);
533 ATF_TC_HEAD(symlinkat_failure, tc)
535 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
536 "symlinkat(2) call");
539 ATF_TC_BODY(symlinkat_failure, tc)
541 ATF_REQUIRE_EQ(0, symlinkat(path, AT_FDCWD, "symlink"));
542 FILE *pipefd = setup(fds, auclass);
543 /* Failure reason: symbolic link already exists */
544 ATF_REQUIRE_EQ(-1, symlinkat(path, AT_FDCWD, "symlink"));
545 check_audit(fds, failurereg, pipefd);
548 ATF_TC_CLEANUP(symlinkat_failure, tc)
556 ATF_TP_ADD_TC(tp, mkdir_success);
557 ATF_TP_ADD_TC(tp, mkdir_failure);
558 ATF_TP_ADD_TC(tp, mkdirat_success);
559 ATF_TP_ADD_TC(tp, mkdirat_failure);
561 ATF_TP_ADD_TC(tp, mkfifo_success);
562 ATF_TP_ADD_TC(tp, mkfifo_failure);
563 ATF_TP_ADD_TC(tp, mkfifoat_success);
564 ATF_TP_ADD_TC(tp, mkfifoat_failure);
566 ATF_TP_ADD_TC(tp, mknod_success);
567 ATF_TP_ADD_TC(tp, mknod_failure);
568 ATF_TP_ADD_TC(tp, mknodat_success);
569 ATF_TP_ADD_TC(tp, mknodat_failure);
571 ATF_TP_ADD_TC(tp, rename_success);
572 ATF_TP_ADD_TC(tp, rename_failure);
573 ATF_TP_ADD_TC(tp, renameat_success);
574 ATF_TP_ADD_TC(tp, renameat_failure);
576 ATF_TP_ADD_TC(tp, link_success);
577 ATF_TP_ADD_TC(tp, link_failure);
578 ATF_TP_ADD_TC(tp, linkat_success);
579 ATF_TP_ADD_TC(tp, linkat_failure);
581 ATF_TP_ADD_TC(tp, symlink_success);
582 ATF_TP_ADD_TC(tp, symlink_failure);
583 ATF_TP_ADD_TC(tp, symlinkat_success);
584 ATF_TP_ADD_TC(tp, symlinkat_failure);
586 return (atf_no_error());