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
28 #include <sys/types.h>
38 static struct pollfd fds[1];
39 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((filedesc = 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);
316 ATF_TC_CLEANUP(rename_success, tc)
322 ATF_TC_WITH_CLEANUP(rename_failure);
323 ATF_TC_HEAD(rename_failure, tc)
325 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
329 ATF_TC_BODY(rename_failure, tc)
331 FILE *pipefd = setup(fds, auclass);
332 /* Failure reason: file does not exist */
333 ATF_REQUIRE_EQ(-1, rename(path, "renamed"));
334 check_audit(fds, failurereg, pipefd);
337 ATF_TC_CLEANUP(rename_failure, tc)
343 ATF_TC_WITH_CLEANUP(renameat_success);
344 ATF_TC_HEAD(renameat_success, tc)
346 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
350 ATF_TC_BODY(renameat_success, tc)
352 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
353 FILE *pipefd = setup(fds, auclass);
354 ATF_REQUIRE_EQ(0, renameat(AT_FDCWD, path, AT_FDCWD, "renamed"));
355 check_audit(fds, successreg, pipefd);
359 ATF_TC_CLEANUP(renameat_success, tc)
365 ATF_TC_WITH_CLEANUP(renameat_failure);
366 ATF_TC_HEAD(renameat_failure, tc)
368 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
372 ATF_TC_BODY(renameat_failure, tc)
374 FILE *pipefd = setup(fds, auclass);
375 /* Failure reason: file does not exist */
376 ATF_REQUIRE_EQ(-1, renameat(AT_FDCWD, path, AT_FDCWD, "renamed"));
377 check_audit(fds, failurereg, pipefd);
380 ATF_TC_CLEANUP(renameat_failure, tc)
386 ATF_TC_WITH_CLEANUP(link_success);
387 ATF_TC_HEAD(link_success, tc)
389 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
393 ATF_TC_BODY(link_success, tc)
395 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
396 FILE *pipefd = setup(fds, auclass);
397 ATF_REQUIRE_EQ(0, link(path, "hardlink"));
398 check_audit(fds, successreg, pipefd);
402 ATF_TC_CLEANUP(link_success, tc)
408 ATF_TC_WITH_CLEANUP(link_failure);
409 ATF_TC_HEAD(link_failure, tc)
411 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
415 ATF_TC_BODY(link_failure, tc)
417 FILE *pipefd = setup(fds, auclass);
418 /* Failure reason: file does not exist */
419 ATF_REQUIRE_EQ(-1, link(path, "hardlink"));
420 check_audit(fds, failurereg, pipefd);
423 ATF_TC_CLEANUP(link_failure, tc)
429 ATF_TC_WITH_CLEANUP(linkat_success);
430 ATF_TC_HEAD(linkat_success, tc)
432 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
436 ATF_TC_BODY(linkat_success, tc)
438 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
439 FILE *pipefd = setup(fds, auclass);
440 ATF_REQUIRE_EQ(0, linkat(AT_FDCWD, path, AT_FDCWD, "hardlink", 0));
441 check_audit(fds, successreg, pipefd);
445 ATF_TC_CLEANUP(linkat_success, tc)
451 ATF_TC_WITH_CLEANUP(linkat_failure);
452 ATF_TC_HEAD(linkat_failure, tc)
454 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
458 ATF_TC_BODY(linkat_failure, tc)
460 FILE *pipefd = setup(fds, auclass);
461 /* Failure reason: file does not exist */
462 ATF_REQUIRE_EQ(-1, linkat(AT_FDCWD, path, AT_FDCWD, "hardlink", 0));
463 check_audit(fds, failurereg, pipefd);
466 ATF_TC_CLEANUP(linkat_failure, tc)
472 ATF_TC_WITH_CLEANUP(symlink_success);
473 ATF_TC_HEAD(symlink_success, tc)
475 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
479 ATF_TC_BODY(symlink_success, tc)
481 FILE *pipefd = setup(fds, auclass);
482 ATF_REQUIRE_EQ(0, symlink(path, "symlink"));
483 check_audit(fds, successreg, pipefd);
486 ATF_TC_CLEANUP(symlink_success, tc)
492 ATF_TC_WITH_CLEANUP(symlink_failure);
493 ATF_TC_HEAD(symlink_failure, tc)
495 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
499 ATF_TC_BODY(symlink_failure, tc)
501 ATF_REQUIRE_EQ(0, symlink(path, "symlink"));
502 FILE *pipefd = setup(fds, auclass);
503 /* Failure reason: symbolic link already exists */
504 ATF_REQUIRE_EQ(-1, symlink(path, "symlink"));
505 check_audit(fds, failurereg, pipefd);
508 ATF_TC_CLEANUP(symlink_failure, tc)
514 ATF_TC_WITH_CLEANUP(symlinkat_success);
515 ATF_TC_HEAD(symlinkat_success, tc)
517 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
518 "symlinkat(2) call");
521 ATF_TC_BODY(symlinkat_success, tc)
523 FILE *pipefd = setup(fds, auclass);
524 ATF_REQUIRE_EQ(0, symlinkat(path, AT_FDCWD, "symlink"));
525 check_audit(fds, successreg, pipefd);
528 ATF_TC_CLEANUP(symlinkat_success, tc)
534 ATF_TC_WITH_CLEANUP(symlinkat_failure);
535 ATF_TC_HEAD(symlinkat_failure, tc)
537 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
538 "symlinkat(2) call");
541 ATF_TC_BODY(symlinkat_failure, tc)
543 ATF_REQUIRE_EQ(0, symlinkat(path, AT_FDCWD, "symlink"));
544 FILE *pipefd = setup(fds, auclass);
545 /* Failure reason: symbolic link already exists */
546 ATF_REQUIRE_EQ(-1, symlinkat(path, AT_FDCWD, "symlink"));
547 check_audit(fds, failurereg, pipefd);
550 ATF_TC_CLEANUP(symlinkat_failure, tc)
558 ATF_TP_ADD_TC(tp, mkdir_success);
559 ATF_TP_ADD_TC(tp, mkdir_failure);
560 ATF_TP_ADD_TC(tp, mkdirat_success);
561 ATF_TP_ADD_TC(tp, mkdirat_failure);
563 ATF_TP_ADD_TC(tp, mkfifo_success);
564 ATF_TP_ADD_TC(tp, mkfifo_failure);
565 ATF_TP_ADD_TC(tp, mkfifoat_success);
566 ATF_TP_ADD_TC(tp, mkfifoat_failure);
568 ATF_TP_ADD_TC(tp, mknod_success);
569 ATF_TP_ADD_TC(tp, mknod_failure);
570 ATF_TP_ADD_TC(tp, mknodat_success);
571 ATF_TP_ADD_TC(tp, mknodat_failure);
573 ATF_TP_ADD_TC(tp, rename_success);
574 ATF_TP_ADD_TC(tp, rename_failure);
575 ATF_TP_ADD_TC(tp, renameat_success);
576 ATF_TP_ADD_TC(tp, renameat_failure);
578 ATF_TP_ADD_TC(tp, link_success);
579 ATF_TP_ADD_TC(tp, link_failure);
580 ATF_TP_ADD_TC(tp, linkat_success);
581 ATF_TP_ADD_TC(tp, linkat_failure);
583 ATF_TP_ADD_TC(tp, symlink_success);
584 ATF_TP_ADD_TC(tp, symlink_failure);
585 ATF_TP_ADD_TC(tp, symlinkat_success);
586 ATF_TP_ADD_TC(tp, symlinkat_failure);
588 return (atf_no_error());