2 * Copyright 2018 Aniket Pandey
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 #include <sys/types.h>
39 static struct pollfd fds[1];
40 static mode_t mode = 0777;
42 static const char *auclass = "fc";
43 static const char *path = "fileforaudit";
44 static const char *successreg = "fileforaudit.*return,success";
45 static const char *failurereg = "fileforaudit.*return,failure";
48 ATF_TC_WITH_CLEANUP(mkdir_success);
49 ATF_TC_HEAD(mkdir_success, tc)
51 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
55 ATF_TC_BODY(mkdir_success, tc)
57 FILE *pipefd = setup(fds, auclass);
58 ATF_REQUIRE_EQ(0, mkdir(path, mode));
59 check_audit(fds, successreg, pipefd);
62 ATF_TC_CLEANUP(mkdir_success, tc)
68 ATF_TC_WITH_CLEANUP(mkdir_failure);
69 ATF_TC_HEAD(mkdir_failure, tc)
71 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
75 ATF_TC_BODY(mkdir_failure, tc)
77 ATF_REQUIRE_EQ(0, mkdir(path, mode));
78 FILE *pipefd = setup(fds, auclass);
79 /* Failure reason: directory already exists */
80 ATF_REQUIRE_EQ(-1, mkdir(path, mode));
81 check_audit(fds, failurereg, pipefd);
84 ATF_TC_CLEANUP(mkdir_failure, tc)
90 ATF_TC_WITH_CLEANUP(mkdirat_success);
91 ATF_TC_HEAD(mkdirat_success, tc)
93 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
97 ATF_TC_BODY(mkdirat_success, tc)
99 FILE *pipefd = setup(fds, auclass);
100 ATF_REQUIRE_EQ(0, mkdirat(AT_FDCWD, path, mode));
101 check_audit(fds, successreg, pipefd);
104 ATF_TC_CLEANUP(mkdirat_success, tc)
110 ATF_TC_WITH_CLEANUP(mkdirat_failure);
111 ATF_TC_HEAD(mkdirat_failure, tc)
113 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
117 ATF_TC_BODY(mkdirat_failure, tc)
119 ATF_REQUIRE_EQ(0, mkdirat(AT_FDCWD, path, mode));
120 FILE *pipefd = setup(fds, auclass);
121 /* Failure reason: directory already exists */
122 ATF_REQUIRE_EQ(-1, mkdirat(AT_FDCWD, path, mode));
123 check_audit(fds, failurereg, pipefd);
126 ATF_TC_CLEANUP(mkdirat_failure, tc)
132 ATF_TC_WITH_CLEANUP(mkfifo_success);
133 ATF_TC_HEAD(mkfifo_success, tc)
135 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
139 ATF_TC_BODY(mkfifo_success, tc)
141 FILE *pipefd = setup(fds, auclass);
142 ATF_REQUIRE_EQ(0, mkfifo(path, mode));
143 check_audit(fds, successreg, pipefd);
146 ATF_TC_CLEANUP(mkfifo_success, tc)
152 ATF_TC_WITH_CLEANUP(mkfifo_failure);
153 ATF_TC_HEAD(mkfifo_failure, tc)
155 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
159 ATF_TC_BODY(mkfifo_failure, tc)
161 ATF_REQUIRE_EQ(0, mkfifo(path, mode));
162 FILE *pipefd = setup(fds, auclass);
163 /* Failure reason: FIFO already exists */
164 ATF_REQUIRE_EQ(-1, mkfifo(path, mode));
165 check_audit(fds, failurereg, pipefd);
168 ATF_TC_CLEANUP(mkfifo_failure, tc)
174 ATF_TC_WITH_CLEANUP(mkfifoat_success);
175 ATF_TC_HEAD(mkfifoat_success, tc)
177 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
181 ATF_TC_BODY(mkfifoat_success, tc)
183 FILE *pipefd = setup(fds, auclass);
184 ATF_REQUIRE_EQ(0, mkfifoat(AT_FDCWD, path, mode));
185 check_audit(fds, successreg, pipefd);
188 ATF_TC_CLEANUP(mkfifoat_success, tc)
194 ATF_TC_WITH_CLEANUP(mkfifoat_failure);
195 ATF_TC_HEAD(mkfifoat_failure, tc)
197 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
201 ATF_TC_BODY(mkfifoat_failure, tc)
203 ATF_REQUIRE_EQ(0, mkfifoat(AT_FDCWD, path, mode));
204 FILE *pipefd = setup(fds, auclass);
205 /* Failure reason: FIFO already exists */
206 ATF_REQUIRE_EQ(-1, mkfifoat(AT_FDCWD, path, mode));
207 check_audit(fds, failurereg, pipefd);
210 ATF_TC_CLEANUP(mkfifoat_failure, tc)
216 ATF_TC_WITH_CLEANUP(mknod_success);
217 ATF_TC_HEAD(mknod_success, tc)
219 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
223 ATF_TC_BODY(mknod_success, tc)
225 FILE *pipefd = setup(fds, auclass);
226 ATF_REQUIRE_EQ(0, mknod(path, S_IFIFO | S_IRWXO, dev));
227 check_audit(fds, successreg, pipefd);
230 ATF_TC_CLEANUP(mknod_success, tc)
236 ATF_TC_WITH_CLEANUP(mknod_failure);
237 ATF_TC_HEAD(mknod_failure, tc)
239 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
243 ATF_TC_BODY(mknod_failure, tc)
245 ATF_REQUIRE_EQ(0, mknod(path, S_IFIFO | S_IRWXO, dev));
246 FILE *pipefd = setup(fds, auclass);
247 /* Failure reason: FIFO node already exists */
248 ATF_REQUIRE_EQ(-1, mknod(path, S_IFIFO | S_IRWXO, dev));
249 check_audit(fds, failurereg, pipefd);
252 ATF_TC_CLEANUP(mknod_failure, tc)
258 ATF_TC_WITH_CLEANUP(mknodat_success);
259 ATF_TC_HEAD(mknodat_success, tc)
261 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
265 ATF_TC_BODY(mknodat_success, tc)
267 FILE *pipefd = setup(fds, auclass);
268 ATF_REQUIRE_EQ(0, mknodat(AT_FDCWD, path, S_IFIFO | S_IRWXO, dev));
269 check_audit(fds, successreg, pipefd);
272 ATF_TC_CLEANUP(mknodat_success, tc)
278 ATF_TC_WITH_CLEANUP(mknodat_failure);
279 ATF_TC_HEAD(mknodat_failure, tc)
281 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
285 ATF_TC_BODY(mknodat_failure, tc)
287 ATF_REQUIRE_EQ(0, mknodat(AT_FDCWD, path, S_IFIFO | S_IRWXO, dev));
288 FILE *pipefd = setup(fds, auclass);
289 /* Failure reason: FIFO node already exists */
290 ATF_REQUIRE_EQ(-1, mknodat(AT_FDCWD, path, S_IFIFO | S_IRWXO, dev));
291 check_audit(fds, failurereg, pipefd);
294 ATF_TC_CLEANUP(mknodat_failure, tc)
300 ATF_TC_WITH_CLEANUP(rename_success);
301 ATF_TC_HEAD(rename_success, tc)
303 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
307 ATF_TC_BODY(rename_success, tc)
309 ATF_REQUIRE(open(path, O_CREAT, mode) != -1);
310 FILE *pipefd = setup(fds, auclass);
311 ATF_REQUIRE_EQ(0, rename(path, "renamed"));
312 check_audit(fds, successreg, pipefd);
315 ATF_TC_CLEANUP(rename_success, tc)
321 ATF_TC_WITH_CLEANUP(rename_failure);
322 ATF_TC_HEAD(rename_failure, tc)
324 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
328 ATF_TC_BODY(rename_failure, tc)
330 FILE *pipefd = setup(fds, auclass);
331 /* Failure reason: file does not exist */
332 ATF_REQUIRE_EQ(-1, rename(path, "renamed"));
333 check_audit(fds, failurereg, pipefd);
336 ATF_TC_CLEANUP(rename_failure, tc)
342 ATF_TC_WITH_CLEANUP(renameat_success);
343 ATF_TC_HEAD(renameat_success, tc)
345 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
349 ATF_TC_BODY(renameat_success, tc)
351 ATF_REQUIRE(open(path, O_CREAT, mode) != -1);
352 FILE *pipefd = setup(fds, auclass);
353 ATF_REQUIRE_EQ(0, renameat(AT_FDCWD, path, AT_FDCWD, "renamed"));
354 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(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);
399 ATF_TC_CLEANUP(link_success, tc)
405 ATF_TC_WITH_CLEANUP(link_failure);
406 ATF_TC_HEAD(link_failure, tc)
408 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
412 ATF_TC_BODY(link_failure, tc)
414 FILE *pipefd = setup(fds, auclass);
415 /* Failure reason: file does not exist */
416 ATF_REQUIRE_EQ(-1, link(path, "hardlink"));
417 check_audit(fds, failurereg, pipefd);
420 ATF_TC_CLEANUP(link_failure, tc)
426 ATF_TC_WITH_CLEANUP(linkat_success);
427 ATF_TC_HEAD(linkat_success, tc)
429 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
433 ATF_TC_BODY(linkat_success, tc)
435 ATF_REQUIRE(open(path, O_CREAT, mode) != -1);
436 FILE *pipefd = setup(fds, auclass);
437 ATF_REQUIRE_EQ(0, linkat(AT_FDCWD, path, AT_FDCWD, "hardlink", 0));
438 check_audit(fds, successreg, pipefd);
441 ATF_TC_CLEANUP(linkat_success, tc)
447 ATF_TC_WITH_CLEANUP(linkat_failure);
448 ATF_TC_HEAD(linkat_failure, tc)
450 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
454 ATF_TC_BODY(linkat_failure, tc)
456 FILE *pipefd = setup(fds, auclass);
457 /* Failure reason: file does not exist */
458 ATF_REQUIRE_EQ(-1, linkat(AT_FDCWD, path, AT_FDCWD, "hardlink", 0));
459 check_audit(fds, failurereg, pipefd);
462 ATF_TC_CLEANUP(linkat_failure, tc)
468 ATF_TC_WITH_CLEANUP(symlink_success);
469 ATF_TC_HEAD(symlink_success, tc)
471 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
475 ATF_TC_BODY(symlink_success, tc)
477 FILE *pipefd = setup(fds, auclass);
478 ATF_REQUIRE_EQ(0, symlink(path, "symlink"));
479 check_audit(fds, successreg, pipefd);
482 ATF_TC_CLEANUP(symlink_success, tc)
488 ATF_TC_WITH_CLEANUP(symlink_failure);
489 ATF_TC_HEAD(symlink_failure, tc)
491 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
495 ATF_TC_BODY(symlink_failure, tc)
497 ATF_REQUIRE_EQ(0, symlink(path, "symlink"));
498 FILE *pipefd = setup(fds, auclass);
499 /* Failure reason: symbolic link already exists */
500 ATF_REQUIRE_EQ(-1, symlink(path, "symlink"));
501 check_audit(fds, failurereg, pipefd);
504 ATF_TC_CLEANUP(symlink_failure, tc)
510 ATF_TC_WITH_CLEANUP(symlinkat_success);
511 ATF_TC_HEAD(symlinkat_success, tc)
513 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
514 "symlinkat(2) call");
517 ATF_TC_BODY(symlinkat_success, tc)
519 FILE *pipefd = setup(fds, auclass);
520 ATF_REQUIRE_EQ(0, symlinkat(path, AT_FDCWD, "symlink"));
521 check_audit(fds, successreg, pipefd);
524 ATF_TC_CLEANUP(symlinkat_success, tc)
530 ATF_TC_WITH_CLEANUP(symlinkat_failure);
531 ATF_TC_HEAD(symlinkat_failure, tc)
533 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
534 "symlinkat(2) call");
537 ATF_TC_BODY(symlinkat_failure, tc)
539 ATF_REQUIRE_EQ(0, symlinkat(path, AT_FDCWD, "symlink"));
540 FILE *pipefd = setup(fds, auclass);
541 /* Failure reason: symbolic link already exists */
542 ATF_REQUIRE_EQ(-1, symlinkat(path, AT_FDCWD, "symlink"));
543 check_audit(fds, failurereg, pipefd);
546 ATF_TC_CLEANUP(symlinkat_failure, tc)
554 ATF_TP_ADD_TC(tp, mkdir_success);
555 ATF_TP_ADD_TC(tp, mkdir_failure);
556 ATF_TP_ADD_TC(tp, mkdirat_success);
557 ATF_TP_ADD_TC(tp, mkdirat_failure);
559 ATF_TP_ADD_TC(tp, mkfifo_success);
560 ATF_TP_ADD_TC(tp, mkfifo_failure);
561 ATF_TP_ADD_TC(tp, mkfifoat_success);
562 ATF_TP_ADD_TC(tp, mkfifoat_failure);
564 ATF_TP_ADD_TC(tp, mknod_success);
565 ATF_TP_ADD_TC(tp, mknod_failure);
566 ATF_TP_ADD_TC(tp, mknodat_success);
567 ATF_TP_ADD_TC(tp, mknodat_failure);
569 ATF_TP_ADD_TC(tp, rename_success);
570 ATF_TP_ADD_TC(tp, rename_failure);
571 ATF_TP_ADD_TC(tp, renameat_success);
572 ATF_TP_ADD_TC(tp, renameat_failure);
574 ATF_TP_ADD_TC(tp, link_success);
575 ATF_TP_ADD_TC(tp, link_failure);
576 ATF_TP_ADD_TC(tp, linkat_success);
577 ATF_TP_ADD_TC(tp, linkat_failure);
579 ATF_TP_ADD_TC(tp, symlink_success);
580 ATF_TP_ADD_TC(tp, symlink_failure);
581 ATF_TP_ADD_TC(tp, symlinkat_success);
582 ATF_TP_ADD_TC(tp, symlinkat_failure);
584 return (atf_no_error());