2 * Copyright (c) 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/param.h>
29 #include <sys/extattr.h>
30 #include <sys/ucred.h>
31 #include <sys/mount.h>
33 #include <sys/syscall.h>
41 static struct pollfd fds[1];
42 static mode_t mode = 0777;
45 static int filedesc, fhdesc;
46 static char extregex[80];
47 static char buff[] = "ezio";
48 static struct stat statbuff;
49 static struct statfs statfsbuff;
50 static const char *auclass = "fa";
51 static const char *name = "authorname";
52 static const char *path = "fileforaudit";
53 static const char *errpath = "dirdoesnotexist/fileforaudit";
54 static const char *successreg = "fileforaudit.*return,success";
55 static const char *failurereg = "fileforaudit.*return,failure";
58 ATF_TC_WITH_CLEANUP(stat_success);
59 ATF_TC_HEAD(stat_success, tc)
61 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
65 ATF_TC_BODY(stat_success, tc)
67 /* File needs to exist to call stat(2) */
68 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
69 FILE *pipefd = setup(fds, auclass);
70 ATF_REQUIRE_EQ(0, stat(path, &statbuff));
71 check_audit(fds, successreg, pipefd);
75 ATF_TC_CLEANUP(stat_success, tc)
81 ATF_TC_WITH_CLEANUP(stat_failure);
82 ATF_TC_HEAD(stat_failure, tc)
84 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
88 ATF_TC_BODY(stat_failure, tc)
90 FILE *pipefd = setup(fds, auclass);
91 /* Failure reason: file does not exist */
92 ATF_REQUIRE_EQ(-1, stat(errpath, &statbuff));
93 check_audit(fds, failurereg, pipefd);
96 ATF_TC_CLEANUP(stat_failure, tc)
102 ATF_TC_WITH_CLEANUP(lstat_success);
103 ATF_TC_HEAD(lstat_success, tc)
105 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
109 ATF_TC_BODY(lstat_success, tc)
111 /* Symbolic link needs to exist to call lstat(2) */
112 ATF_REQUIRE_EQ(0, symlink("symlink", path));
113 FILE *pipefd = setup(fds, auclass);
114 ATF_REQUIRE_EQ(0, lstat(path, &statbuff));
115 check_audit(fds, successreg, pipefd);
118 ATF_TC_CLEANUP(lstat_success, tc)
124 ATF_TC_WITH_CLEANUP(lstat_failure);
125 ATF_TC_HEAD(lstat_failure, tc)
127 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
131 ATF_TC_BODY(lstat_failure, tc)
133 FILE *pipefd = setup(fds, auclass);
134 /* Failure reason: symbolic link does not exist */
135 ATF_REQUIRE_EQ(-1, lstat(errpath, &statbuff));
136 check_audit(fds, failurereg, pipefd);
139 ATF_TC_CLEANUP(lstat_failure, tc)
145 ATF_TC_WITH_CLEANUP(fstat_success);
146 ATF_TC_HEAD(fstat_success, tc)
148 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
152 ATF_TC_BODY(fstat_success, tc)
154 /* File needs to exist to call fstat(2) */
155 ATF_REQUIRE((filedesc = open(path, O_CREAT | O_RDWR, mode)) != -1);
156 FILE *pipefd = setup(fds, auclass);
157 ATF_REQUIRE_EQ(0, fstat(filedesc, &statbuff));
159 snprintf(extregex, sizeof(extregex),
160 "fstat.*%jd.*return,success", (intmax_t)statbuff.st_ino);
161 check_audit(fds, extregex, pipefd);
165 ATF_TC_CLEANUP(fstat_success, tc)
171 ATF_TC_WITH_CLEANUP(fstat_failure);
172 ATF_TC_HEAD(fstat_failure, tc)
174 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
178 ATF_TC_BODY(fstat_failure, tc)
180 FILE *pipefd = setup(fds, auclass);
181 const char *regex = "fstat.*return,failure : Bad file descriptor";
182 /* Failure reason: bad file descriptor */
183 ATF_REQUIRE_EQ(-1, fstat(-1, &statbuff));
184 check_audit(fds, regex, pipefd);
187 ATF_TC_CLEANUP(fstat_failure, tc)
193 ATF_TC_WITH_CLEANUP(fstatat_success);
194 ATF_TC_HEAD(fstatat_success, tc)
196 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
200 ATF_TC_BODY(fstatat_success, tc)
202 /* File or Symbolic link needs to exist to call lstat(2) */
203 ATF_REQUIRE_EQ(0, symlink("symlink", path));
204 FILE *pipefd = setup(fds, auclass);
205 ATF_REQUIRE_EQ(0, fstatat(AT_FDCWD, path, &statbuff,
206 AT_SYMLINK_NOFOLLOW));
207 check_audit(fds, successreg, pipefd);
210 ATF_TC_CLEANUP(fstatat_success, tc)
216 ATF_TC_WITH_CLEANUP(fstatat_failure);
217 ATF_TC_HEAD(fstatat_failure, tc)
219 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
223 ATF_TC_BODY(fstatat_failure, tc)
225 FILE *pipefd = setup(fds, auclass);
226 /* Failure reason: symbolic link does not exist */
227 ATF_REQUIRE_EQ(-1, fstatat(AT_FDCWD, path, &statbuff,
228 AT_SYMLINK_NOFOLLOW));
229 check_audit(fds, failurereg, pipefd);
232 ATF_TC_CLEANUP(fstatat_failure, tc)
238 ATF_TC_WITH_CLEANUP(statfs_success);
239 ATF_TC_HEAD(statfs_success, tc)
241 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
245 ATF_TC_BODY(statfs_success, tc)
247 /* File needs to exist to call statfs(2) */
248 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
249 FILE *pipefd = setup(fds, auclass);
250 ATF_REQUIRE_EQ(0, statfs(path, &statfsbuff));
251 check_audit(fds, successreg, pipefd);
255 ATF_TC_CLEANUP(statfs_success, tc)
261 ATF_TC_WITH_CLEANUP(statfs_failure);
262 ATF_TC_HEAD(statfs_failure, tc)
264 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
268 ATF_TC_BODY(statfs_failure, tc)
270 FILE *pipefd = setup(fds, auclass);
271 /* Failure reason: file does not exist */
272 ATF_REQUIRE_EQ(-1, statfs(errpath, &statfsbuff));
273 check_audit(fds, failurereg, pipefd);
276 ATF_TC_CLEANUP(statfs_failure, tc)
282 ATF_TC_WITH_CLEANUP(fstatfs_success);
283 ATF_TC_HEAD(fstatfs_success, tc)
285 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
289 ATF_TC_BODY(fstatfs_success, tc)
291 /* File needs to exist to call fstat(2) */
292 ATF_REQUIRE((filedesc = open(path, O_CREAT | O_RDWR, mode)) != -1);
293 /* Call stat(2) to store the Inode number of 'path' */
294 ATF_REQUIRE_EQ(0, stat(path, &statbuff));
295 FILE *pipefd = setup(fds, auclass);
296 ATF_REQUIRE_EQ(0, fstatfs(filedesc, &statfsbuff));
298 snprintf(extregex, sizeof(extregex), "fstatfs.*%jd.*return,success",
299 (intmax_t)statbuff.st_ino);
300 check_audit(fds, extregex, pipefd);
304 ATF_TC_CLEANUP(fstatfs_success, tc)
310 ATF_TC_WITH_CLEANUP(fstatfs_failure);
311 ATF_TC_HEAD(fstatfs_failure, tc)
313 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
317 ATF_TC_BODY(fstatfs_failure, tc)
319 FILE *pipefd = setup(fds, auclass);
320 const char *regex = "fstatfs.*return,failure : Bad file descriptor";
321 /* Failure reason: bad file descriptor */
322 ATF_REQUIRE_EQ(-1, fstatfs(-1, &statfsbuff));
323 check_audit(fds, regex, pipefd);
326 ATF_TC_CLEANUP(fstatfs_failure, tc)
332 ATF_TC_WITH_CLEANUP(getfsstat_success);
333 ATF_TC_HEAD(getfsstat_success, tc)
335 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
336 "getfsstat(2) call");
339 ATF_TC_BODY(getfsstat_success, tc)
342 snprintf(extregex, sizeof(extregex), "getfsstat.*%d.*success", pid);
344 FILE *pipefd = setup(fds, auclass);
345 ATF_REQUIRE(getfsstat(NULL, 0, MNT_NOWAIT) != -1);
346 check_audit(fds, extregex, pipefd);
349 ATF_TC_CLEANUP(getfsstat_success, tc)
355 ATF_TC_WITH_CLEANUP(getfsstat_failure);
356 ATF_TC_HEAD(getfsstat_failure, tc)
358 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
359 "getfsstat(2) call");
362 ATF_TC_BODY(getfsstat_failure, tc)
364 const char *regex = "getfsstat.*return,failure : Invalid argument";
365 FILE *pipefd = setup(fds, auclass);
366 /* Failure reason: Invalid value for mode */
367 ATF_REQUIRE_EQ(-1, getfsstat(NULL, 0, -1));
368 check_audit(fds, regex, pipefd);
371 ATF_TC_CLEANUP(getfsstat_failure, tc)
377 ATF_TC_WITH_CLEANUP(fhopen_success);
378 ATF_TC_HEAD(fhopen_success, tc)
380 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
384 ATF_TC_BODY(fhopen_success, tc)
387 snprintf(extregex, sizeof(extregex), "fhopen.*%d.*return,success", pid);
389 /* File needs to exist to get a file-handle */
390 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
391 /* Get the file handle to be passed to fhopen(2) */
392 ATF_REQUIRE_EQ(0, getfh(path, &fht));
394 FILE *pipefd = setup(fds, auclass);
395 ATF_REQUIRE((fhdesc = fhopen(&fht, O_RDWR)) != -1);
396 check_audit(fds, extregex, pipefd);
402 ATF_TC_CLEANUP(fhopen_success, tc)
408 ATF_TC_WITH_CLEANUP(fhopen_failure);
409 ATF_TC_HEAD(fhopen_failure, tc)
411 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
415 ATF_TC_BODY(fhopen_failure, tc)
417 const char *regex = "fhopen.*return,failure : Invalid argument";
418 FILE *pipefd = setup(fds, auclass);
420 * Failure reason: NULL does not represent any file handle
421 * and O_CREAT is not allowed as the flag for fhopen(2)
423 ATF_REQUIRE_EQ(-1, fhopen(NULL, O_CREAT));
424 check_audit(fds, regex, pipefd);
427 ATF_TC_CLEANUP(fhopen_failure, tc)
433 ATF_TC_WITH_CLEANUP(fhstat_success);
434 ATF_TC_HEAD(fhstat_success, tc)
436 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
440 ATF_TC_BODY(fhstat_success, tc)
443 snprintf(extregex, sizeof(extregex), "fhstat.*%d.*return,success", pid);
445 /* File needs to exist to get a file-handle */
446 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
447 /* Get the file handle to be passed to fhstat(2) */
448 ATF_REQUIRE_EQ(0, getfh(path, &fht));
450 FILE *pipefd = setup(fds, auclass);
451 ATF_REQUIRE_EQ(0, fhstat(&fht, &statbuff));
452 check_audit(fds, extregex, pipefd);
456 ATF_TC_CLEANUP(fhstat_success, tc)
462 ATF_TC_WITH_CLEANUP(fhstat_failure);
463 ATF_TC_HEAD(fhstat_failure, tc)
465 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
469 ATF_TC_BODY(fhstat_failure, tc)
471 const char *regex = "fhstat.*return,failure : Bad address";
472 FILE *pipefd = setup(fds, auclass);
473 /* Failure reason: NULL does not represent any file handle */
474 ATF_REQUIRE_EQ(-1, fhstat(NULL, NULL));
475 check_audit(fds, regex, pipefd);
478 ATF_TC_CLEANUP(fhstat_failure, tc)
484 ATF_TC_WITH_CLEANUP(fhstatfs_success);
485 ATF_TC_HEAD(fhstatfs_success, tc)
487 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
491 ATF_TC_BODY(fhstatfs_success, tc)
494 snprintf(extregex, sizeof(extregex), "fhstatfs.*%d.*success", pid);
496 /* File needs to exist to get a file-handle */
497 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
498 /* Get the file handle to be passed to fhstatfs(2) */
499 ATF_REQUIRE_EQ(0, getfh(path, &fht));
501 FILE *pipefd = setup(fds, auclass);
502 ATF_REQUIRE_EQ(0, fhstatfs(&fht, &statfsbuff));
503 check_audit(fds, extregex, pipefd);
507 ATF_TC_CLEANUP(fhstatfs_success, tc)
513 ATF_TC_WITH_CLEANUP(fhstatfs_failure);
514 ATF_TC_HEAD(fhstatfs_failure, tc)
516 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
520 ATF_TC_BODY(fhstatfs_failure, tc)
522 const char *regex = "fhstatfs.*return,failure : Bad address";
523 FILE *pipefd = setup(fds, auclass);
524 /* Failure reason: NULL does not represent any file handle */
525 ATF_REQUIRE_EQ(-1, fhstatfs(NULL, NULL));
526 check_audit(fds, regex, pipefd);
529 ATF_TC_CLEANUP(fhstatfs_failure, tc)
535 ATF_TC_WITH_CLEANUP(access_success);
536 ATF_TC_HEAD(access_success, tc)
538 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
542 ATF_TC_BODY(access_success, tc)
544 /* File needs to exist to call access(2) */
545 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
546 FILE *pipefd = setup(fds, auclass);
547 ATF_REQUIRE_EQ(0, access(path, F_OK));
548 check_audit(fds, successreg, pipefd);
552 ATF_TC_CLEANUP(access_success, tc)
558 ATF_TC_WITH_CLEANUP(access_failure);
559 ATF_TC_HEAD(access_failure, tc)
561 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
565 ATF_TC_BODY(access_failure, tc)
567 FILE *pipefd = setup(fds, auclass);
568 /* Failure reason: file does not exist */
569 ATF_REQUIRE_EQ(-1, access(errpath, F_OK));
570 check_audit(fds, failurereg, pipefd);
573 ATF_TC_CLEANUP(access_failure, tc)
579 ATF_TC_WITH_CLEANUP(eaccess_success);
580 ATF_TC_HEAD(eaccess_success, tc)
582 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
586 ATF_TC_BODY(eaccess_success, tc)
588 /* File needs to exist to call eaccess(2) */
589 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
590 FILE *pipefd = setup(fds, auclass);
591 ATF_REQUIRE_EQ(0, eaccess(path, F_OK));
592 check_audit(fds, successreg, pipefd);
596 ATF_TC_CLEANUP(eaccess_success, tc)
602 ATF_TC_WITH_CLEANUP(eaccess_failure);
603 ATF_TC_HEAD(eaccess_failure, tc)
605 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
609 ATF_TC_BODY(eaccess_failure, tc)
611 FILE *pipefd = setup(fds, auclass);
612 /* Failure reason: file does not exist */
613 ATF_REQUIRE_EQ(-1, eaccess(errpath, F_OK));
614 check_audit(fds, failurereg, pipefd);
617 ATF_TC_CLEANUP(eaccess_failure, tc)
623 ATF_TC_WITH_CLEANUP(faccessat_success);
624 ATF_TC_HEAD(faccessat_success, tc)
626 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
627 "faccessat(2) call");
630 ATF_TC_BODY(faccessat_success, tc)
632 /* File needs to exist to call faccessat(2) */
633 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
634 FILE *pipefd = setup(fds, auclass);
635 ATF_REQUIRE_EQ(0, faccessat(AT_FDCWD, path, F_OK, AT_EACCESS));
636 check_audit(fds, successreg, pipefd);
640 ATF_TC_CLEANUP(faccessat_success, tc)
646 ATF_TC_WITH_CLEANUP(faccessat_failure);
647 ATF_TC_HEAD(faccessat_failure, tc)
649 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
650 "faccessat(2) call");
653 ATF_TC_BODY(faccessat_failure, tc)
655 FILE *pipefd = setup(fds, auclass);
656 /* Failure reason: file does not exist */
657 ATF_REQUIRE_EQ(-1, faccessat(AT_FDCWD, errpath, F_OK, AT_EACCESS));
658 check_audit(fds, failurereg, pipefd);
661 ATF_TC_CLEANUP(faccessat_failure, tc)
667 ATF_TC_WITH_CLEANUP(pathconf_success);
668 ATF_TC_HEAD(pathconf_success, tc)
670 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
674 ATF_TC_BODY(pathconf_success, tc)
676 /* File needs to exist to call pathconf(2) */
677 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
678 FILE *pipefd = setup(fds, auclass);
679 /* Get the maximum number of bytes of filename */
680 ATF_REQUIRE(pathconf(path, _PC_NAME_MAX) != -1);
681 check_audit(fds, successreg, pipefd);
685 ATF_TC_CLEANUP(pathconf_success, tc)
691 ATF_TC_WITH_CLEANUP(pathconf_failure);
692 ATF_TC_HEAD(pathconf_failure, tc)
694 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
698 ATF_TC_BODY(pathconf_failure, tc)
700 FILE *pipefd = setup(fds, auclass);
701 /* Failure reason: file does not exist */
702 ATF_REQUIRE_EQ(-1, pathconf(errpath, _PC_NAME_MAX));
703 check_audit(fds, failurereg, pipefd);
706 ATF_TC_CLEANUP(pathconf_failure, tc)
712 ATF_TC_WITH_CLEANUP(lpathconf_success);
713 ATF_TC_HEAD(lpathconf_success, tc)
715 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
716 "lpathconf(2) call");
719 ATF_TC_BODY(lpathconf_success, tc)
721 /* Symbolic link needs to exist to call lpathconf(2) */
722 ATF_REQUIRE_EQ(0, symlink("symlink", path));
723 FILE *pipefd = setup(fds, auclass);
724 /* Get the maximum number of bytes of symlink's name */
725 ATF_REQUIRE(lpathconf(path, _PC_SYMLINK_MAX) != -1);
726 check_audit(fds, successreg, pipefd);
729 ATF_TC_CLEANUP(lpathconf_success, tc)
735 ATF_TC_WITH_CLEANUP(lpathconf_failure);
736 ATF_TC_HEAD(lpathconf_failure, tc)
738 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
739 "lpathconf(2) call");
742 ATF_TC_BODY(lpathconf_failure, tc)
744 FILE *pipefd = setup(fds, auclass);
745 /* Failure reason: symbolic link does not exist */
746 ATF_REQUIRE_EQ(-1, lpathconf(errpath, _PC_SYMLINK_MAX));
747 check_audit(fds, failurereg, pipefd);
750 ATF_TC_CLEANUP(lpathconf_failure, tc)
756 ATF_TC_WITH_CLEANUP(fpathconf_success);
757 ATF_TC_HEAD(fpathconf_success, tc)
759 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
760 "fpathconf(2) call");
763 ATF_TC_BODY(fpathconf_success, tc)
766 snprintf(extregex, sizeof(extregex), "fpathconf.*%d.*success", pid);
768 /* File needs to exist to call fpathconf(2) */
769 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
770 FILE *pipefd = setup(fds, auclass);
771 /* Get the maximum number of bytes of filename */
772 ATF_REQUIRE(fpathconf(filedesc, _PC_NAME_MAX) != -1);
773 check_audit(fds, extregex, pipefd);
777 ATF_TC_CLEANUP(fpathconf_success, tc)
783 ATF_TC_WITH_CLEANUP(fpathconf_failure);
784 ATF_TC_HEAD(fpathconf_failure, tc)
786 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
787 "fpathconf(2) call");
790 ATF_TC_BODY(fpathconf_failure, tc)
792 FILE *pipefd = setup(fds, auclass);
793 const char *regex = "fpathconf.*return,failure : Bad file descriptor";
794 /* Failure reason: Bad file descriptor */
795 ATF_REQUIRE_EQ(-1, fpathconf(-1, _PC_NAME_MAX));
796 check_audit(fds, regex, pipefd);
799 ATF_TC_CLEANUP(fpathconf_failure, tc)
805 ATF_TC_WITH_CLEANUP(extattr_get_file_success);
806 ATF_TC_HEAD(extattr_get_file_success, tc)
808 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
809 "extattr_get_file(2) call");
812 ATF_TC_BODY(extattr_get_file_success, tc)
814 /* File needs to exist to call extattr_get_file(2) */
815 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
816 /* Set an extended attribute to be retrieved later on */
817 ATF_REQUIRE_EQ(sizeof(buff), extattr_set_file(path,
818 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
820 /* Prepare the regex to be checked in the audit record */
821 snprintf(extregex, sizeof(extregex),
822 "extattr_get_file.*%s.*%s.*return,success", path, name);
824 FILE *pipefd = setup(fds, auclass);
825 ATF_REQUIRE_EQ(sizeof(buff), extattr_get_file(path,
826 EXTATTR_NAMESPACE_USER, name, NULL, 0));
827 check_audit(fds, extregex, pipefd);
831 ATF_TC_CLEANUP(extattr_get_file_success, tc)
837 ATF_TC_WITH_CLEANUP(extattr_get_file_failure);
838 ATF_TC_HEAD(extattr_get_file_failure, tc)
840 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
841 "extattr_get_file(2) call");
844 ATF_TC_BODY(extattr_get_file_failure, tc)
846 /* Prepare the regex to be checked in the audit record */
847 snprintf(extregex, sizeof(extregex),
848 "extattr_get_file.*%s.*%s.*failure", path, name);
850 FILE *pipefd = setup(fds, auclass);
851 /* Failure reason: file does not exist */
852 ATF_REQUIRE_EQ(-1, extattr_get_file(path,
853 EXTATTR_NAMESPACE_USER, name, NULL, 0));
854 check_audit(fds, extregex, pipefd);
857 ATF_TC_CLEANUP(extattr_get_file_failure, tc)
863 ATF_TC_WITH_CLEANUP(extattr_get_fd_success);
864 ATF_TC_HEAD(extattr_get_fd_success, tc)
866 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
867 "extattr_get_fd(2) call");
870 ATF_TC_BODY(extattr_get_fd_success, tc)
872 /* File needs to exist to call extattr_get_fd(2) */
873 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
874 /* Set an extended attribute to be retrieved later on */
875 ATF_REQUIRE_EQ(sizeof(buff), extattr_set_file(path,
876 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
878 /* Prepare the regex to be checked in the audit record */
879 snprintf(extregex, sizeof(extregex),
880 "extattr_get_fd.*%s.*return,success", name);
882 FILE *pipefd = setup(fds, auclass);
883 ATF_REQUIRE_EQ(sizeof(buff), extattr_get_fd(filedesc,
884 EXTATTR_NAMESPACE_USER, name, NULL, 0));
885 check_audit(fds, extregex, pipefd);
889 ATF_TC_CLEANUP(extattr_get_fd_success, tc)
895 ATF_TC_WITH_CLEANUP(extattr_get_fd_failure);
896 ATF_TC_HEAD(extattr_get_fd_failure, tc)
898 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
899 "extattr_get_fd(2) call");
902 ATF_TC_BODY(extattr_get_fd_failure, tc)
904 /* Prepare the regex to be checked in the audit record */
905 snprintf(extregex, sizeof(extregex),
906 "extattr_get_fd.*%s.*return,failure : Bad file descriptor", name);
908 FILE *pipefd = setup(fds, auclass);
909 /* Failure reason: Invalid file descriptor */
910 ATF_REQUIRE_EQ(-1, extattr_get_fd(-1,
911 EXTATTR_NAMESPACE_USER, name, NULL, 0));
912 check_audit(fds, extregex, pipefd);
915 ATF_TC_CLEANUP(extattr_get_fd_failure, tc)
921 ATF_TC_WITH_CLEANUP(extattr_get_link_success);
922 ATF_TC_HEAD(extattr_get_link_success, tc)
924 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
925 "extattr_get_link(2) call");
928 ATF_TC_BODY(extattr_get_link_success, tc)
930 /* Symbolic link needs to exist to call extattr_get_link(2) */
931 ATF_REQUIRE_EQ(0, symlink("symlink", path));
932 /* Set an extended attribute to be retrieved later on */
933 ATF_REQUIRE_EQ(sizeof(buff), extattr_set_link(path,
934 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
936 /* Prepare the regex to be checked in the audit record */
937 snprintf(extregex, sizeof(extregex),
938 "extattr_get_link.*%s.*%s.*return,success", path, name);
940 FILE *pipefd = setup(fds, auclass);
941 ATF_REQUIRE_EQ(sizeof(buff), extattr_get_link(path,
942 EXTATTR_NAMESPACE_USER, name, NULL, 0));
943 check_audit(fds, extregex, pipefd);
946 ATF_TC_CLEANUP(extattr_get_link_success, tc)
952 ATF_TC_WITH_CLEANUP(extattr_get_link_failure);
953 ATF_TC_HEAD(extattr_get_link_failure, tc)
955 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
956 "extattr_get_link(2) call");
959 ATF_TC_BODY(extattr_get_link_failure, tc)
961 /* Prepare the regex to be checked in the audit record */
962 snprintf(extregex, sizeof(extregex),
963 "extattr_get_link.*%s.*%s.*failure", path, name);
964 FILE *pipefd = setup(fds, auclass);
965 /* Failure reason: symbolic link does not exist */
966 ATF_REQUIRE_EQ(-1, extattr_get_link(path,
967 EXTATTR_NAMESPACE_USER, name, NULL, 0));
968 check_audit(fds, extregex, pipefd);
971 ATF_TC_CLEANUP(extattr_get_link_failure, tc)
977 ATF_TC_WITH_CLEANUP(extattr_list_file_success);
978 ATF_TC_HEAD(extattr_list_file_success, tc)
980 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
981 "extattr_list_file(2) call");
984 ATF_TC_BODY(extattr_list_file_success, tc)
987 /* File needs to exist to call extattr_list_file(2) */
988 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
990 FILE *pipefd = setup(fds, auclass);
991 ATF_REQUIRE((readbuff = extattr_list_file(path,
992 EXTATTR_NAMESPACE_USER, NULL, 0)) != -1);
993 /* Prepare the regex to be checked in the audit record */
994 snprintf(extregex, sizeof(extregex),
995 "extattr_list_file.*%s.*return,success,%d", path, readbuff);
996 check_audit(fds, extregex, pipefd);
999 ATF_TC_CLEANUP(extattr_list_file_success, tc)
1005 ATF_TC_WITH_CLEANUP(extattr_list_file_failure);
1006 ATF_TC_HEAD(extattr_list_file_failure, tc)
1008 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1009 "extattr_list_file(2) call");
1012 ATF_TC_BODY(extattr_list_file_failure, tc)
1014 /* Prepare the regex to be checked in the audit record */
1015 snprintf(extregex, sizeof(extregex),
1016 "extattr_list_file.*%s.*return,failure", path);
1018 FILE *pipefd = setup(fds, auclass);
1019 /* Failure reason: file does not exist */
1020 ATF_REQUIRE_EQ(-1, extattr_list_file(path,
1021 EXTATTR_NAMESPACE_USER, NULL, 0));
1022 check_audit(fds, extregex, pipefd);
1025 ATF_TC_CLEANUP(extattr_list_file_failure, tc)
1031 ATF_TC_WITH_CLEANUP(extattr_list_fd_success);
1032 ATF_TC_HEAD(extattr_list_fd_success, tc)
1034 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1035 "extattr_list_fd(2) call");
1038 ATF_TC_BODY(extattr_list_fd_success, tc)
1041 /* File needs to exist to call extattr_list_fd(2) */
1042 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1044 FILE *pipefd = setup(fds, auclass);
1045 ATF_REQUIRE((readbuff = extattr_list_fd(filedesc,
1046 EXTATTR_NAMESPACE_USER, NULL, 0)) != -1);
1047 /* Prepare the regex to be checked in the audit record */
1048 snprintf(extregex, sizeof(extregex),
1049 "extattr_list_fd.*return,success,%d", readbuff);
1050 check_audit(fds, extregex, pipefd);
1054 ATF_TC_CLEANUP(extattr_list_fd_success, tc)
1060 ATF_TC_WITH_CLEANUP(extattr_list_fd_failure);
1061 ATF_TC_HEAD(extattr_list_fd_failure, tc)
1063 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1064 "extattr_list_fd(2) call");
1067 ATF_TC_BODY(extattr_list_fd_failure, tc)
1069 /* Prepare the regex to be checked in the audit record */
1070 snprintf(extregex, sizeof(extregex),
1071 "extattr_list_fd.*return,failure : Bad file descriptor");
1073 FILE *pipefd = setup(fds, auclass);
1074 /* Failure reason: Invalid file descriptor */
1076 extattr_list_fd(-1, EXTATTR_NAMESPACE_USER, NULL, 0));
1077 check_audit(fds, extregex, pipefd);
1080 ATF_TC_CLEANUP(extattr_list_fd_failure, tc)
1086 ATF_TC_WITH_CLEANUP(extattr_list_link_success);
1087 ATF_TC_HEAD(extattr_list_link_success, tc)
1089 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1090 "extattr_list_link(2) call");
1093 ATF_TC_BODY(extattr_list_link_success, tc)
1096 /* Symbolic link needs to exist to call extattr_list_link(2) */
1097 ATF_REQUIRE_EQ(0, symlink("symlink", path));
1098 FILE *pipefd = setup(fds, auclass);
1100 ATF_REQUIRE((readbuff = extattr_list_link(path,
1101 EXTATTR_NAMESPACE_USER, NULL, 0)) != -1);
1102 /* Prepare the regex to be checked in the audit record */
1103 snprintf(extregex, sizeof(extregex),
1104 "extattr_list_link.*%s.*return,success,%d", path, readbuff);
1105 check_audit(fds, extregex, pipefd);
1108 ATF_TC_CLEANUP(extattr_list_link_success, tc)
1114 ATF_TC_WITH_CLEANUP(extattr_list_link_failure);
1115 ATF_TC_HEAD(extattr_list_link_failure, tc)
1117 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1118 "extattr_list_link(2) call");
1121 ATF_TC_BODY(extattr_list_link_failure, tc)
1123 /* Prepare the regex to be checked in the audit record */
1124 snprintf(extregex, sizeof(extregex),
1125 "extattr_list_link.*%s.*failure", path);
1126 FILE *pipefd = setup(fds, auclass);
1127 /* Failure reason: symbolic link does not exist */
1128 ATF_REQUIRE_EQ(-1, extattr_list_link(path,
1129 EXTATTR_NAMESPACE_USER, NULL, 0));
1130 check_audit(fds, extregex, pipefd);
1133 ATF_TC_CLEANUP(extattr_list_link_failure, tc)
1141 ATF_TP_ADD_TC(tp, stat_success);
1142 ATF_TP_ADD_TC(tp, stat_failure);
1143 ATF_TP_ADD_TC(tp, lstat_success);
1144 ATF_TP_ADD_TC(tp, lstat_failure);
1145 ATF_TP_ADD_TC(tp, fstat_success);
1146 ATF_TP_ADD_TC(tp, fstat_failure);
1147 ATF_TP_ADD_TC(tp, fstatat_success);
1148 ATF_TP_ADD_TC(tp, fstatat_failure);
1150 ATF_TP_ADD_TC(tp, statfs_success);
1151 ATF_TP_ADD_TC(tp, statfs_failure);
1152 ATF_TP_ADD_TC(tp, fstatfs_success);
1153 ATF_TP_ADD_TC(tp, fstatfs_failure);
1155 ATF_TP_ADD_TC(tp, getfsstat_success);
1156 ATF_TP_ADD_TC(tp, getfsstat_failure);
1158 ATF_TP_ADD_TC(tp, fhopen_success);
1159 ATF_TP_ADD_TC(tp, fhopen_failure);
1160 ATF_TP_ADD_TC(tp, fhstat_success);
1161 ATF_TP_ADD_TC(tp, fhstat_failure);
1162 ATF_TP_ADD_TC(tp, fhstatfs_success);
1163 ATF_TP_ADD_TC(tp, fhstatfs_failure);
1165 ATF_TP_ADD_TC(tp, access_success);
1166 ATF_TP_ADD_TC(tp, access_failure);
1167 ATF_TP_ADD_TC(tp, eaccess_success);
1168 ATF_TP_ADD_TC(tp, eaccess_failure);
1169 ATF_TP_ADD_TC(tp, faccessat_success);
1170 ATF_TP_ADD_TC(tp, faccessat_failure);
1172 ATF_TP_ADD_TC(tp, pathconf_success);
1173 ATF_TP_ADD_TC(tp, pathconf_failure);
1174 ATF_TP_ADD_TC(tp, lpathconf_success);
1175 ATF_TP_ADD_TC(tp, lpathconf_failure);
1176 ATF_TP_ADD_TC(tp, fpathconf_success);
1177 ATF_TP_ADD_TC(tp, fpathconf_failure);
1179 ATF_TP_ADD_TC(tp, extattr_get_file_success);
1180 ATF_TP_ADD_TC(tp, extattr_get_file_failure);
1181 ATF_TP_ADD_TC(tp, extattr_get_fd_success);
1182 ATF_TP_ADD_TC(tp, extattr_get_fd_failure);
1183 ATF_TP_ADD_TC(tp, extattr_get_link_success);
1184 ATF_TP_ADD_TC(tp, extattr_get_link_failure);
1186 ATF_TP_ADD_TC(tp, extattr_list_file_success);
1187 ATF_TP_ADD_TC(tp, extattr_list_file_failure);
1188 ATF_TP_ADD_TC(tp, extattr_list_fd_success);
1189 ATF_TP_ADD_TC(tp, extattr_list_fd_failure);
1190 ATF_TP_ADD_TC(tp, extattr_list_link_success);
1191 ATF_TP_ADD_TC(tp, extattr_list_link_failure);
1193 return (atf_no_error());