]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tests/sys/audit/file-attribute-modify.c
lua: Update to 5.4.4
[FreeBSD/FreeBSD.git] / tests / sys / audit / file-attribute-modify.c
1 /*-
2  * Copyright (c) 2018 Aniket Pandey
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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
23  * SUCH DAMAGE.
24  *
25  * $FreeBSD$
26  */
27
28 #include <sys/types.h>
29 #include <sys/extattr.h>
30 #include <sys/file.h>
31 #include <sys/mman.h>
32 #include <sys/stat.h>
33 #include <sys/time.h>
34
35 #include <atf-c.h>
36 #include <errno.h>
37 #include <fcntl.h>
38 #include <stdint.h>
39 #include <unistd.h>
40
41 #include "utils.h"
42
43 static pid_t pid;
44 static uid_t uid = -1;
45 static gid_t gid = -1;
46 static int filedesc, retval;
47 static struct pollfd fds[1];
48 static mode_t mode = 0777;
49 static char extregex[80];
50 static char buff[] = "ezio";
51 static const char *auclass = "fm";
52 static const char *name = "authorname";
53 static const char *path = "fileforaudit";
54 static const char *errpath = "adirhasnoname/fileforaudit";
55 static const char *successreg = "fileforaudit.*return,success";
56 static const char *failurereg = "fileforaudit.*return,failure";
57
58
59 ATF_TC_WITH_CLEANUP(flock_success);
60 ATF_TC_HEAD(flock_success, tc)
61 {
62         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
63                                         "flock(2) call");
64 }
65
66 ATF_TC_BODY(flock_success, tc)
67 {
68         pid = getpid();
69         snprintf(extregex, sizeof(extregex), "flock.*%d.*return,success", pid);
70
71         /* File needs to exist to call flock(2) */
72         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
73         FILE *pipefd = setup(fds, auclass);
74         ATF_REQUIRE_EQ(0, flock(filedesc, LOCK_SH));
75         check_audit(fds, extregex, pipefd);
76         close(filedesc);
77 }
78
79 ATF_TC_CLEANUP(flock_success, tc)
80 {
81         cleanup();
82 }
83
84
85 ATF_TC_WITH_CLEANUP(flock_failure);
86 ATF_TC_HEAD(flock_failure, tc)
87 {
88         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
89                                         "flock(2) call");
90 }
91
92 ATF_TC_BODY(flock_failure, tc)
93 {
94         const char *regex = "flock.*return,failure : Bad file descriptor";
95         FILE *pipefd = setup(fds, auclass);
96         ATF_REQUIRE_ERRNO(EBADF, flock(-1, LOCK_SH) == -1);
97         check_audit(fds, regex, pipefd);
98 }
99
100 ATF_TC_CLEANUP(flock_failure, tc)
101 {
102         cleanup();
103 }
104
105
106 ATF_TC_WITH_CLEANUP(fcntl_success);
107 ATF_TC_HEAD(fcntl_success, tc)
108 {
109         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
110                                         "fcntl(2) call");
111 }
112
113 ATF_TC_BODY(fcntl_success, tc)
114 {
115         int flagstatus;
116         /* File needs to exist to call fcntl(2) */
117         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
118         FILE *pipefd = setup(fds, auclass);
119
120         /* Retrieve the status flags of 'filedesc' and store it in flagstatus */
121         ATF_REQUIRE((flagstatus = fcntl(filedesc, F_GETFL, 0)) != -1);
122         snprintf(extregex, sizeof(extregex),
123                         "fcntl.*return,success,%d", flagstatus);
124         check_audit(fds, extregex, pipefd);
125         close(filedesc);
126 }
127
128 ATF_TC_CLEANUP(fcntl_success, tc)
129 {
130         cleanup();
131 }
132
133
134 ATF_TC_WITH_CLEANUP(fcntl_failure);
135 ATF_TC_HEAD(fcntl_failure, tc)
136 {
137         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
138                                         "fcntl(2) call");
139 }
140
141 ATF_TC_BODY(fcntl_failure, tc)
142 {
143         const char *regex = "fcntl.*return,failure : Bad file descriptor";
144         FILE *pipefd = setup(fds, auclass);
145         ATF_REQUIRE_ERRNO(EBADF, fcntl(-1, F_GETFL, 0) == -1);
146         check_audit(fds, regex, pipefd);
147 }
148
149 ATF_TC_CLEANUP(fcntl_failure, tc)
150 {
151         cleanup();
152 }
153
154
155 ATF_TC_WITH_CLEANUP(fsync_success);
156 ATF_TC_HEAD(fsync_success, tc)
157 {
158         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
159                                         "fsync(2) call");
160 }
161
162 ATF_TC_BODY(fsync_success, tc)
163 {
164         pid = getpid();
165         snprintf(extregex, sizeof(extregex), "fsync.*%d.*return,success", pid);
166
167         /* File needs to exist to call fsync(2) */
168         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
169         FILE *pipefd = setup(fds, auclass);
170         ATF_REQUIRE_EQ(0, fsync(filedesc));
171         check_audit(fds, extregex, pipefd);
172         close(filedesc);
173 }
174
175 ATF_TC_CLEANUP(fsync_success, tc)
176 {
177         cleanup();
178 }
179
180
181 ATF_TC_WITH_CLEANUP(fsync_failure);
182 ATF_TC_HEAD(fsync_failure, tc)
183 {
184         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
185                                         "fsync(2) call");
186 }
187
188 ATF_TC_BODY(fsync_failure, tc)
189 {
190         const char *regex = "fsync.*return,failure : Bad file descriptor";
191         FILE *pipefd = setup(fds, auclass);
192         /* Failure reason: Invalid file descriptor */
193         ATF_REQUIRE_ERRNO(EBADF, fsync(-1) == -1);
194         check_audit(fds, regex, pipefd);
195 }
196
197 ATF_TC_CLEANUP(fsync_failure, tc)
198 {
199         cleanup();
200 }
201
202
203 ATF_TC_WITH_CLEANUP(chmod_success);
204 ATF_TC_HEAD(chmod_success, tc)
205 {
206         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
207                                         "chmod(2) call");
208 }
209
210 ATF_TC_BODY(chmod_success, tc)
211 {
212         /* File needs to exist to call chmod(2) */
213         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
214         FILE *pipefd = setup(fds, auclass);
215         ATF_REQUIRE_EQ(0, chmod(path, mode));
216         check_audit(fds, successreg, pipefd);
217         close(filedesc);
218 }
219
220 ATF_TC_CLEANUP(chmod_success, tc)
221 {
222         cleanup();
223 }
224
225
226 ATF_TC_WITH_CLEANUP(chmod_failure);
227 ATF_TC_HEAD(chmod_failure, tc)
228 {
229         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
230                                         "chmod(2) call");
231 }
232
233 ATF_TC_BODY(chmod_failure, tc)
234 {
235         FILE *pipefd = setup(fds, auclass);
236         /* Failure reason: file does not exist */
237         ATF_REQUIRE_ERRNO(ENOENT, chmod(errpath, mode) == -1);
238         check_audit(fds, failurereg, pipefd);
239 }
240
241 ATF_TC_CLEANUP(chmod_failure, tc)
242 {
243         cleanup();
244 }
245
246
247 ATF_TC_WITH_CLEANUP(fchmod_success);
248 ATF_TC_HEAD(fchmod_success, tc)
249 {
250         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
251                                         "fchmod(2) call");
252 }
253
254 ATF_TC_BODY(fchmod_success, tc)
255 {
256         pid = getpid();
257         snprintf(extregex, sizeof(extregex), "fchmod.*%d.*return,success", pid);
258
259         /* File needs to exist to call fchmod(2) */
260         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
261         FILE *pipefd = setup(fds, auclass);
262         ATF_REQUIRE_EQ(0, fchmod(filedesc, mode));
263         check_audit(fds, extregex, pipefd);
264         close(filedesc);
265 }
266
267 ATF_TC_CLEANUP(fchmod_success, tc)
268 {
269         cleanup();
270 }
271
272
273 ATF_TC_WITH_CLEANUP(fchmod_failure);
274 ATF_TC_HEAD(fchmod_failure, tc)
275 {
276         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
277                                         "fchmod(2) call");
278 }
279
280 ATF_TC_BODY(fchmod_failure, tc)
281 {
282         const char *regex = "fchmod.*return,failure : Bad file descriptor";
283         FILE *pipefd = setup(fds, auclass);
284         /* Failure reason: Invalid file descriptor */
285         ATF_REQUIRE_ERRNO(EBADF, fchmod(-1, mode) == -1);
286         check_audit(fds, regex, pipefd);
287 }
288
289 ATF_TC_CLEANUP(fchmod_failure, tc)
290 {
291         cleanup();
292 }
293
294
295 ATF_TC_WITH_CLEANUP(lchmod_success);
296 ATF_TC_HEAD(lchmod_success, tc)
297 {
298         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
299                                         "lchmod(2) call");
300 }
301
302 ATF_TC_BODY(lchmod_success, tc)
303 {
304         /* Symbolic link needs to exist to call lchmod(2) */
305         ATF_REQUIRE_EQ(0, symlink("symlink", path));
306         FILE *pipefd = setup(fds, auclass);
307         ATF_REQUIRE_EQ(0, lchmod(path, mode));
308         check_audit(fds, successreg, pipefd);
309 }
310
311 ATF_TC_CLEANUP(lchmod_success, tc)
312 {
313         cleanup();
314 }
315
316
317 ATF_TC_WITH_CLEANUP(lchmod_failure);
318 ATF_TC_HEAD(lchmod_failure, tc)
319 {
320         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
321                                         "lchmod(2) call");
322 }
323
324 ATF_TC_BODY(lchmod_failure, tc)
325 {
326         FILE *pipefd = setup(fds, auclass);
327         /* Failure reason: file does not exist */
328         ATF_REQUIRE_ERRNO(ENOENT, lchmod(errpath, mode) == -1);
329         check_audit(fds, failurereg, pipefd);
330 }
331
332 ATF_TC_CLEANUP(lchmod_failure, tc)
333 {
334         cleanup();
335 }
336
337
338 ATF_TC_WITH_CLEANUP(fchmodat_success);
339 ATF_TC_HEAD(fchmodat_success, tc)
340 {
341         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
342                                         "fchmodat(2) call");
343 }
344
345 ATF_TC_BODY(fchmodat_success, tc)
346 {
347         /* File needs to exist to call fchmodat(2) */
348         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
349         FILE *pipefd = setup(fds, auclass);
350         ATF_REQUIRE_EQ(0, fchmodat(AT_FDCWD, path, mode, 0));
351         check_audit(fds, successreg, pipefd);
352         close(filedesc);
353 }
354
355 ATF_TC_CLEANUP(fchmodat_success, tc)
356 {
357         cleanup();
358 }
359
360
361 ATF_TC_WITH_CLEANUP(fchmodat_failure);
362 ATF_TC_HEAD(fchmodat_failure, tc)
363 {
364         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
365                                         "fchmodat(2) call");
366 }
367
368 ATF_TC_BODY(fchmodat_failure, tc)
369 {
370         FILE *pipefd = setup(fds, auclass);
371         /* Failure reason: file does not exist */
372         ATF_REQUIRE_ERRNO(ENOENT, fchmodat(AT_FDCWD, errpath, mode, 0) == -1);
373         check_audit(fds, failurereg, pipefd);
374 }
375
376 ATF_TC_CLEANUP(fchmodat_failure, tc)
377 {
378         cleanup();
379 }
380
381
382 ATF_TC_WITH_CLEANUP(chown_success);
383 ATF_TC_HEAD(chown_success, tc)
384 {
385         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
386                                         "chown(2) call");
387 }
388
389 ATF_TC_BODY(chown_success, tc)
390 {
391         /* File needs to exist to call chown(2) */
392         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
393         FILE *pipefd = setup(fds, auclass);
394         ATF_REQUIRE_EQ(0, chown(path, uid, gid));
395         check_audit(fds, successreg, pipefd);
396         close(filedesc);
397 }
398
399 ATF_TC_CLEANUP(chown_success, tc)
400 {
401         cleanup();
402 }
403
404
405 ATF_TC_WITH_CLEANUP(chown_failure);
406 ATF_TC_HEAD(chown_failure, tc)
407 {
408         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
409                                         "chown(2) call");
410 }
411
412 ATF_TC_BODY(chown_failure, tc)
413 {
414         FILE *pipefd = setup(fds, auclass);
415         /* Failure reason: file does not exist */
416         ATF_REQUIRE_ERRNO(ENOENT, chown(errpath, uid, gid) == -1);
417         check_audit(fds, failurereg, pipefd);
418 }
419
420 ATF_TC_CLEANUP(chown_failure, tc)
421 {
422         cleanup();
423 }
424
425
426 ATF_TC_WITH_CLEANUP(fchown_success);
427 ATF_TC_HEAD(fchown_success, tc)
428 {
429         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
430                                         "fchown(2) call");
431 }
432
433 ATF_TC_BODY(fchown_success, tc)
434 {
435         pid = getpid();
436         snprintf(extregex, sizeof(extregex), "fchown.*%d.*return,success", pid);
437
438         /* File needs to exist to call fchown(2) */
439         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
440         FILE *pipefd = setup(fds, auclass);
441         ATF_REQUIRE_EQ(0, fchown(filedesc, uid, gid));
442         check_audit(fds, extregex, pipefd);
443         close(filedesc);
444 }
445
446 ATF_TC_CLEANUP(fchown_success, tc)
447 {
448         cleanup();
449 }
450
451
452 ATF_TC_WITH_CLEANUP(fchown_failure);
453 ATF_TC_HEAD(fchown_failure, tc)
454 {
455         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
456                                         "fchown(2) call");
457 }
458
459 ATF_TC_BODY(fchown_failure, tc)
460 {
461         const char *regex = "fchown.*return,failure : Bad file descriptor";
462         FILE *pipefd = setup(fds, auclass);
463         /* Failure reason: Invalid file descriptor */
464         ATF_REQUIRE_ERRNO(EBADF, fchown(-1, uid, gid) == -1);
465         check_audit(fds, regex, pipefd);
466 }
467
468 ATF_TC_CLEANUP(fchown_failure, tc)
469 {
470         cleanup();
471 }
472
473
474 ATF_TC_WITH_CLEANUP(lchown_success);
475 ATF_TC_HEAD(lchown_success, tc)
476 {
477         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
478                                         "lchown(2) call");
479 }
480
481 ATF_TC_BODY(lchown_success, tc)
482 {
483         /* Symbolic link needs to exist to call lchown(2) */
484         ATF_REQUIRE_EQ(0, symlink("symlink", path));
485         FILE *pipefd = setup(fds, auclass);
486         ATF_REQUIRE_EQ(0, lchown(path, uid, gid));
487         check_audit(fds, successreg, pipefd);
488 }
489
490 ATF_TC_CLEANUP(lchown_success, tc)
491 {
492         cleanup();
493 }
494
495
496 ATF_TC_WITH_CLEANUP(lchown_failure);
497 ATF_TC_HEAD(lchown_failure, tc)
498 {
499         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
500                                         "lchown(2) call");
501 }
502
503 ATF_TC_BODY(lchown_failure, tc)
504 {
505         FILE *pipefd = setup(fds, auclass);
506         /* Failure reason: Symbolic link does not exist */
507         ATF_REQUIRE_ERRNO(ENOENT, lchown(errpath, uid, gid) == -1);
508         check_audit(fds, failurereg, pipefd);
509 }
510
511 ATF_TC_CLEANUP(lchown_failure, tc)
512 {
513         cleanup();
514 }
515
516
517 ATF_TC_WITH_CLEANUP(fchownat_success);
518 ATF_TC_HEAD(fchownat_success, tc)
519 {
520         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
521                                         "fchownat(2) call");
522 }
523
524 ATF_TC_BODY(fchownat_success, tc)
525 {
526         /* File needs to exist to call fchownat(2) */
527         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
528         FILE *pipefd = setup(fds, auclass);
529         ATF_REQUIRE_EQ(0, fchownat(AT_FDCWD, path, uid, gid, 0));
530         check_audit(fds, successreg, pipefd);
531         close(filedesc);
532 }
533
534 ATF_TC_CLEANUP(fchownat_success, tc)
535 {
536         cleanup();
537 }
538
539
540 ATF_TC_WITH_CLEANUP(fchownat_failure);
541 ATF_TC_HEAD(fchownat_failure, tc)
542 {
543         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
544                                         "fchownat(2) call");
545 }
546
547 ATF_TC_BODY(fchownat_failure, tc)
548 {
549         FILE *pipefd = setup(fds, auclass);
550         /* Failure reason: file does not exist */
551         ATF_REQUIRE_ERRNO(ENOENT,
552             fchownat(AT_FDCWD, errpath, uid, gid, 0) == -1);
553         check_audit(fds, failurereg, pipefd);
554 }
555
556 ATF_TC_CLEANUP(fchownat_failure, tc)
557 {
558         cleanup();
559 }
560
561
562 ATF_TC_WITH_CLEANUP(chflags_success);
563 ATF_TC_HEAD(chflags_success, tc)
564 {
565         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
566                                         "chflags(2) call");
567 }
568
569 ATF_TC_BODY(chflags_success, tc)
570 {
571         /* File needs to exist to call chflags(2) */
572         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
573         FILE *pipefd = setup(fds, auclass);
574         ATF_REQUIRE_EQ(0, chflags(path, UF_OFFLINE));
575         check_audit(fds, successreg, pipefd);
576         close(filedesc);
577 }
578
579 ATF_TC_CLEANUP(chflags_success, tc)
580 {
581         cleanup();
582 }
583
584
585 ATF_TC_WITH_CLEANUP(chflags_failure);
586 ATF_TC_HEAD(chflags_failure, tc)
587 {
588         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
589                                         "chflags(2) call");
590 }
591
592 ATF_TC_BODY(chflags_failure, tc)
593 {
594         FILE *pipefd = setup(fds, auclass);
595         /* Failure reason: file does not exist */
596         ATF_REQUIRE_ERRNO(ENOENT, chflags(errpath, UF_OFFLINE) == -1);
597         check_audit(fds, failurereg, pipefd);
598 }
599
600 ATF_TC_CLEANUP(chflags_failure, tc)
601 {
602         cleanup();
603 }
604
605
606 ATF_TC_WITH_CLEANUP(fchflags_success);
607 ATF_TC_HEAD(fchflags_success, tc)
608 {
609         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
610                                         "fchflags(2) call");
611 }
612
613 ATF_TC_BODY(fchflags_success, tc)
614 {
615         pid = getpid();
616         snprintf(extregex, sizeof(extregex), "fchflags.*%d.*ret.*success", pid);
617         /* File needs to exist to call fchflags(2) */
618         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
619
620         FILE *pipefd = setup(fds, auclass);
621         ATF_REQUIRE_EQ(0, fchflags(filedesc, UF_OFFLINE));
622         check_audit(fds, extregex, pipefd);
623         close(filedesc);
624 }
625
626 ATF_TC_CLEANUP(fchflags_success, tc)
627 {
628         cleanup();
629 }
630
631
632 ATF_TC_WITH_CLEANUP(fchflags_failure);
633 ATF_TC_HEAD(fchflags_failure, tc)
634 {
635         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
636                                         "fchflags(2) call");
637 }
638
639 ATF_TC_BODY(fchflags_failure, tc)
640 {
641         const char *regex = "fchflags.*return,failure : Bad file descriptor";
642         FILE *pipefd = setup(fds, auclass);
643         /* Failure reason: Invalid file descriptor */
644         ATF_REQUIRE_ERRNO(EBADF, fchflags(-1, UF_OFFLINE) == -1);
645         check_audit(fds, regex, pipefd);
646 }
647
648 ATF_TC_CLEANUP(fchflags_failure, tc)
649 {
650         cleanup();
651 }
652
653
654 ATF_TC_WITH_CLEANUP(lchflags_success);
655 ATF_TC_HEAD(lchflags_success, tc)
656 {
657         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
658                                         "lchflags(2) call");
659 }
660
661 ATF_TC_BODY(lchflags_success, tc)
662 {
663         /* Symbolic link needs to exist to call lchflags(2) */
664         ATF_REQUIRE_EQ(0, symlink("symlink", path));
665         FILE *pipefd = setup(fds, auclass);
666         ATF_REQUIRE_EQ(0, lchflags(path, UF_OFFLINE));
667         check_audit(fds, successreg, pipefd);
668 }
669
670 ATF_TC_CLEANUP(lchflags_success, tc)
671 {
672         cleanup();
673 }
674
675
676 ATF_TC_WITH_CLEANUP(lchflags_failure);
677 ATF_TC_HEAD(lchflags_failure, tc)
678 {
679         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
680                                         "lchflags(2) call");
681 }
682
683 ATF_TC_BODY(lchflags_failure, tc)
684 {
685         FILE *pipefd = setup(fds, auclass);
686         /* Failure reason: Symbolic link does not exist */
687         ATF_REQUIRE_ERRNO(ENOENT, lchflags(errpath, UF_OFFLINE) == -1);
688         check_audit(fds, failurereg, pipefd);
689 }
690
691 ATF_TC_CLEANUP(lchflags_failure, tc)
692 {
693         cleanup();
694 }
695
696
697 ATF_TC_WITH_CLEANUP(chflagsat_success);
698 ATF_TC_HEAD(chflagsat_success, tc)
699 {
700         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
701                                         "chflagsat(2) call");
702 }
703
704 ATF_TC_BODY(chflagsat_success, tc)
705 {
706         /* File needs to exist to call chflagsat(2) */
707         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
708         FILE *pipefd = setup(fds, auclass);
709         ATF_REQUIRE_EQ(0, chflagsat(AT_FDCWD, path, UF_OFFLINE, 0));
710         check_audit(fds, successreg, pipefd);
711         close(filedesc);
712 }
713
714 ATF_TC_CLEANUP(chflagsat_success, tc)
715 {
716         cleanup();
717 }
718
719
720 ATF_TC_WITH_CLEANUP(chflagsat_failure);
721 ATF_TC_HEAD(chflagsat_failure, tc)
722 {
723         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
724                                         "chflagsat(2) call");
725 }
726
727 ATF_TC_BODY(chflagsat_failure, tc)
728 {
729         FILE *pipefd = setup(fds, auclass);
730         /* Failure reason: file does not exist */
731         ATF_REQUIRE_ERRNO(ENOENT,
732             chflagsat(AT_FDCWD, errpath, UF_OFFLINE, 0) == -1);
733         check_audit(fds, failurereg, pipefd);
734 }
735
736 ATF_TC_CLEANUP(chflagsat_failure, tc)
737 {
738         cleanup();
739 }
740
741
742 ATF_TC_WITH_CLEANUP(utimes_success);
743 ATF_TC_HEAD(utimes_success, tc)
744 {
745         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
746                                         "utimes(2) call");
747 }
748
749 ATF_TC_BODY(utimes_success, tc)
750 {
751         /* File needs to exist to call utimes(2) */
752         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
753         FILE *pipefd = setup(fds, auclass);
754         ATF_REQUIRE_EQ(0, utimes(path, NULL));
755         check_audit(fds, successreg, pipefd);
756         close(filedesc);
757 }
758
759 ATF_TC_CLEANUP(utimes_success, tc)
760 {
761         cleanup();
762 }
763
764
765 ATF_TC_WITH_CLEANUP(utimes_failure);
766 ATF_TC_HEAD(utimes_failure, tc)
767 {
768         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
769                                         "utimes(2) call");
770 }
771
772 ATF_TC_BODY(utimes_failure, tc)
773 {
774         FILE *pipefd = setup(fds, auclass);
775         /* Failure reason: file does not exist */
776         ATF_REQUIRE_ERRNO(ENOENT, utimes(errpath, NULL) == -1);
777         check_audit(fds, failurereg, pipefd);
778 }
779
780 ATF_TC_CLEANUP(utimes_failure, tc)
781 {
782         cleanup();
783 }
784
785
786 ATF_TC_WITH_CLEANUP(futimes_success);
787 ATF_TC_HEAD(futimes_success, tc)
788 {
789         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
790                                         "futimes(2) call");
791 }
792
793 ATF_TC_BODY(futimes_success, tc)
794 {
795         pid = getpid();
796         snprintf(extregex, sizeof(extregex), "futimes.*%d.*ret.*success", pid);
797
798         /* File needs to exist to call futimes(2) */
799         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
800         FILE *pipefd = setup(fds, auclass);
801         ATF_REQUIRE_EQ(0, futimes(filedesc, NULL));
802         check_audit(fds, extregex, pipefd);
803         close(filedesc);
804 }
805
806 ATF_TC_CLEANUP(futimes_success, tc)
807 {
808         cleanup();
809 }
810
811
812 ATF_TC_WITH_CLEANUP(futimes_failure);
813 ATF_TC_HEAD(futimes_failure, tc)
814 {
815         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
816                                         "futimes(2) call");
817 }
818
819 ATF_TC_BODY(futimes_failure, tc)
820 {
821         const char *regex = "futimes.*return,failure : Bad file descriptor";
822         FILE *pipefd = setup(fds, auclass);
823         /* Failure reason: Invalid file descriptor */
824         ATF_REQUIRE_ERRNO(EBADF, futimes(-1, NULL) == -1);
825         check_audit(fds, regex, pipefd);
826 }
827
828 ATF_TC_CLEANUP(futimes_failure, tc)
829 {
830         cleanup();
831 }
832
833
834 ATF_TC_WITH_CLEANUP(lutimes_success);
835 ATF_TC_HEAD(lutimes_success, tc)
836 {
837         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
838                                         "lutimes(2) call");
839 }
840
841 ATF_TC_BODY(lutimes_success, tc)
842 {
843         /* Symbolic link needs to exist to call lutimes(2) */
844         ATF_REQUIRE_EQ(0, symlink("symlink", path));
845         FILE *pipefd = setup(fds, auclass);
846         ATF_REQUIRE_EQ(0, lutimes(path, NULL));
847         check_audit(fds, successreg, pipefd);
848 }
849
850 ATF_TC_CLEANUP(lutimes_success, tc)
851 {
852         cleanup();
853 }
854
855
856 ATF_TC_WITH_CLEANUP(lutimes_failure);
857 ATF_TC_HEAD(lutimes_failure, tc)
858 {
859         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
860                                         "lutimes(2) call");
861 }
862
863 ATF_TC_BODY(lutimes_failure, tc)
864 {
865         FILE *pipefd = setup(fds, auclass);
866         /* Failure reason: symbolic link does not exist */
867         ATF_REQUIRE_ERRNO(ENOENT, lutimes(errpath, NULL) == -1);
868         check_audit(fds, failurereg, pipefd);
869 }
870
871 ATF_TC_CLEANUP(lutimes_failure, tc)
872 {
873         cleanup();
874 }
875
876
877 ATF_TC_WITH_CLEANUP(futimesat_success);
878 ATF_TC_HEAD(futimesat_success, tc)
879 {
880         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
881                                         "futimesat(2) call");
882 }
883
884 ATF_TC_BODY(futimesat_success, tc)
885 {
886         /* File needs to exist to call futimesat(2) */
887         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
888         FILE *pipefd = setup(fds, auclass);
889         ATF_REQUIRE_EQ(0, futimesat(AT_FDCWD, path, NULL));
890         check_audit(fds, successreg, pipefd);
891         close(filedesc);
892 }
893
894 ATF_TC_CLEANUP(futimesat_success, tc)
895 {
896         cleanup();
897 }
898
899
900 ATF_TC_WITH_CLEANUP(futimesat_failure);
901 ATF_TC_HEAD(futimesat_failure, tc)
902 {
903         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
904                                         "futimesat(2) call");
905 }
906
907 ATF_TC_BODY(futimesat_failure, tc)
908 {
909         FILE *pipefd = setup(fds, auclass);
910         /* Failure reason: file does not exist */
911         ATF_REQUIRE_ERRNO(ENOENT, futimesat(AT_FDCWD, errpath, NULL) == -1);
912         check_audit(fds, failurereg, pipefd);
913 }
914
915 ATF_TC_CLEANUP(futimesat_failure, tc)
916 {
917         cleanup();
918 }
919
920
921 ATF_TC_WITH_CLEANUP(mprotect_success);
922 ATF_TC_HEAD(mprotect_success, tc)
923 {
924         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
925                                         "mprotect(2) call");
926 }
927
928 ATF_TC_BODY(mprotect_success, tc)
929 {
930         pid = getpid();
931         snprintf(extregex, sizeof(extregex), "mprotect.*%d.*ret.*success", pid);
932
933         FILE *pipefd = setup(fds, auclass);
934         ATF_REQUIRE_EQ(0, mprotect(NULL, 0, PROT_NONE));
935         check_audit(fds, extregex, pipefd);
936 }
937
938 ATF_TC_CLEANUP(mprotect_success, tc)
939 {
940         cleanup();
941 }
942
943
944 ATF_TC_WITH_CLEANUP(mprotect_failure);
945 ATF_TC_HEAD(mprotect_failure, tc)
946 {
947         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
948                                         "mprotect(2) call");
949 }
950
951 ATF_TC_BODY(mprotect_failure, tc)
952 {
953         const char *regex = "mprotect.*return,failure : Invalid argument";
954         FILE *pipefd = setup(fds, auclass);
955         ATF_REQUIRE_ERRNO(EINVAL,
956             mprotect((void *)SIZE_MAX, -1, PROT_NONE) == -1);
957         check_audit(fds, regex, pipefd);
958 }
959
960 ATF_TC_CLEANUP(mprotect_failure, tc)
961 {
962         cleanup();
963 }
964
965 /*
966  * undelete(2) only works on whiteout files in union file system. Hence, no
967  * test case for successful invocation.
968  */
969
970 ATF_TC_WITH_CLEANUP(undelete_failure);
971 ATF_TC_HEAD(undelete_failure, tc)
972 {
973         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
974                                         "undelete(2) call");
975 }
976
977 ATF_TC_BODY(undelete_failure, tc)
978 {
979         pid = getpid();
980         snprintf(extregex, sizeof(extregex), "undelete.*%d.*ret.*failure", pid);
981
982         FILE *pipefd = setup(fds, auclass);
983         /* Failure reason: File does not exist */
984         ATF_REQUIRE_ERRNO(ENOENT, undelete(errpath) == -1);
985         check_audit(fds, extregex, pipefd);
986 }
987
988 ATF_TC_CLEANUP(undelete_failure, tc)
989 {
990         cleanup();
991 }
992
993
994 ATF_TC_WITH_CLEANUP(extattr_set_file_success);
995 ATF_TC_HEAD(extattr_set_file_success, tc)
996 {
997         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
998                                         "extattr_set_file(2) call");
999 }
1000
1001 ATF_TC_BODY(extattr_set_file_success, tc)
1002 {
1003         /* File needs to exist to call extattr_set_file(2) */
1004         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1005         skip_if_extattr_not_supported(path);
1006
1007         /* Prepare the regex to be checked in the audit record */
1008         snprintf(extregex, sizeof(extregex),
1009                 "extattr_set_file.*%s.*%s.*return,success", path, name);
1010
1011         FILE *pipefd = setup(fds, auclass);
1012         REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_file(path,
1013                 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1014         check_audit(fds, extregex, pipefd);
1015         close(filedesc);
1016 }
1017
1018 ATF_TC_CLEANUP(extattr_set_file_success, tc)
1019 {
1020         cleanup();
1021 }
1022
1023
1024 ATF_TC_WITH_CLEANUP(extattr_set_file_failure);
1025 ATF_TC_HEAD(extattr_set_file_failure, tc)
1026 {
1027         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1028                                         "extattr_set_file(2) call");
1029 }
1030
1031 ATF_TC_BODY(extattr_set_file_failure, tc)
1032 {
1033         /* Prepare the regex to be checked in the audit record */
1034         snprintf(extregex, sizeof(extregex),
1035                 "extattr_set_file.*%s.*%s.*failure", path, name);
1036
1037         FILE *pipefd = setup(fds, auclass);
1038         /* Failure reason: file does not exist */
1039         ATF_REQUIRE_ERRNO(ENOENT,
1040             extattr_set_file(path, EXTATTR_NAMESPACE_USER, name, NULL, 0) ==
1041                 -1);
1042         check_audit(fds, extregex, pipefd);
1043 }
1044
1045 ATF_TC_CLEANUP(extattr_set_file_failure, tc)
1046 {
1047         cleanup();
1048 }
1049
1050
1051 ATF_TC_WITH_CLEANUP(extattr_set_fd_success);
1052 ATF_TC_HEAD(extattr_set_fd_success, tc)
1053 {
1054         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1055                                         "extattr_set_fd(2) call");
1056 }
1057
1058 ATF_TC_BODY(extattr_set_fd_success, tc)
1059 {
1060         /* File needs to exist to call extattr_set_fd(2) */
1061         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1062         skip_if_extattr_not_supported(path);
1063
1064         /* Prepare the regex to be checked in the audit record */
1065         snprintf(extregex, sizeof(extregex),
1066                 "extattr_set_fd.*%s.*return,success", name);
1067
1068         FILE *pipefd = setup(fds, auclass);
1069         REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_fd(filedesc,
1070                 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1071         check_audit(fds, extregex, pipefd);
1072         close(filedesc);
1073 }
1074
1075 ATF_TC_CLEANUP(extattr_set_fd_success, tc)
1076 {
1077         cleanup();
1078 }
1079
1080
1081 ATF_TC_WITH_CLEANUP(extattr_set_fd_failure);
1082 ATF_TC_HEAD(extattr_set_fd_failure, tc)
1083 {
1084         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1085                                         "extattr_set_fd(2) call");
1086 }
1087
1088 ATF_TC_BODY(extattr_set_fd_failure, tc)
1089 {
1090         /* Prepare the regex to be checked in the audit record */
1091         snprintf(extregex, sizeof(extregex),
1092         "extattr_set_fd.*%s.*return,failure : Bad file descriptor", name);
1093
1094         FILE *pipefd = setup(fds, auclass);
1095         /* Failure reason: Invalid file descriptor */
1096         ATF_REQUIRE_ERRNO(EBADF,
1097             extattr_set_fd(-1, EXTATTR_NAMESPACE_USER, name, NULL, 0) == -1);
1098         check_audit(fds, extregex, pipefd);
1099 }
1100
1101 ATF_TC_CLEANUP(extattr_set_fd_failure, tc)
1102 {
1103         cleanup();
1104 }
1105
1106
1107 ATF_TC_WITH_CLEANUP(extattr_set_link_success);
1108 ATF_TC_HEAD(extattr_set_link_success, tc)
1109 {
1110         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1111                                         "extattr_set_link(2) call");
1112 }
1113
1114 ATF_TC_BODY(extattr_set_link_success, tc)
1115 {
1116         /* Symbolic link needs to exist to call extattr_set_link(2) */
1117         ATF_REQUIRE_EQ(0, symlink("symlink", path));
1118         skip_if_extattr_not_supported(".");
1119
1120         /* Prepare the regex to be checked in the audit record */
1121         snprintf(extregex, sizeof(extregex),
1122                 "extattr_set_link.*%s.*%s.*return,success", path, name);
1123
1124         FILE *pipefd = setup(fds, auclass);
1125         REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_link(path,
1126                 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1127
1128         check_audit(fds, extregex, pipefd);
1129 }
1130
1131 ATF_TC_CLEANUP(extattr_set_link_success, tc)
1132 {
1133         cleanup();
1134 }
1135
1136
1137 ATF_TC_WITH_CLEANUP(extattr_set_link_failure);
1138 ATF_TC_HEAD(extattr_set_link_failure, tc)
1139 {
1140         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1141                                         "extattr_set_link(2) call");
1142 }
1143
1144 ATF_TC_BODY(extattr_set_link_failure, tc)
1145 {
1146         /* Prepare the regex to be checked in the audit record */
1147         snprintf(extregex, sizeof(extregex),
1148                 "extattr_set_link.*%s.*%s.*failure", path, name);
1149         FILE *pipefd = setup(fds, auclass);
1150         /* Failure reason: symbolic link does not exist */
1151         ATF_REQUIRE_ERRNO(ENOENT,
1152             extattr_set_link(path, EXTATTR_NAMESPACE_USER, name, NULL, 0) ==
1153                 -1);
1154         check_audit(fds, extregex, pipefd);
1155 }
1156
1157 ATF_TC_CLEANUP(extattr_set_link_failure, tc)
1158 {
1159         cleanup();
1160 }
1161
1162
1163 ATF_TC_WITH_CLEANUP(extattr_delete_file_success);
1164 ATF_TC_HEAD(extattr_delete_file_success, tc)
1165 {
1166         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1167                                         "extattr_delete_file(2) call");
1168 }
1169
1170 ATF_TC_BODY(extattr_delete_file_success, tc)
1171 {
1172         /* File needs to exist to call extattr_delete_file(2) */
1173         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1174         skip_if_extattr_not_supported(path);
1175
1176         REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_file(path,
1177                 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1178
1179         FILE *pipefd = setup(fds, auclass);
1180         retval = REQUIRE_EXTATTR_SUCCESS(
1181             extattr_delete_file(path, EXTATTR_NAMESPACE_USER, name));
1182         /* Prepare the regex to be checked in the audit record */
1183         snprintf(extregex, sizeof(extregex),
1184         "extattr_delete_file.*%s.*return,success,%d", path, retval);
1185         check_audit(fds, extregex, pipefd);
1186         close(filedesc);
1187 }
1188
1189 ATF_TC_CLEANUP(extattr_delete_file_success, tc)
1190 {
1191         cleanup();
1192 }
1193
1194
1195 ATF_TC_WITH_CLEANUP(extattr_delete_file_failure);
1196 ATF_TC_HEAD(extattr_delete_file_failure, tc)
1197 {
1198         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1199                                         "extattr_delete_file(2) call");
1200 }
1201
1202 ATF_TC_BODY(extattr_delete_file_failure, tc)
1203 {
1204         /* Prepare the regex to be checked in the audit record */
1205         snprintf(extregex, sizeof(extregex),
1206                 "extattr_delete_file.*%s.*return,failure", path);
1207
1208         FILE *pipefd = setup(fds, auclass);
1209         /* Failure reason: file does not exist */
1210         ATF_REQUIRE_ERRNO(ENOENT,
1211             extattr_delete_file(path, EXTATTR_NAMESPACE_USER, name) == -1);
1212         check_audit(fds, extregex, pipefd);
1213 }
1214
1215 ATF_TC_CLEANUP(extattr_delete_file_failure, tc)
1216 {
1217         cleanup();
1218 }
1219
1220
1221 ATF_TC_WITH_CLEANUP(extattr_delete_fd_success);
1222 ATF_TC_HEAD(extattr_delete_fd_success, tc)
1223 {
1224         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1225                                         "extattr_delete_fd(2) call");
1226 }
1227
1228 ATF_TC_BODY(extattr_delete_fd_success, tc)
1229 {
1230         /* File needs to exist to call extattr_delete_fd(2) */
1231         ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
1232         skip_if_extattr_not_supported(path);
1233
1234         REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_file(path,
1235                 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1236
1237         FILE *pipefd = setup(fds, auclass);
1238         retval = REQUIRE_EXTATTR_SUCCESS(extattr_delete_fd(filedesc,
1239                 EXTATTR_NAMESPACE_USER, name));
1240         /* Prepare the regex to be checked in the audit record */
1241         snprintf(extregex, sizeof(extregex),
1242                 "extattr_delete_fd.*return,success,%d", retval);
1243         check_audit(fds, extregex, pipefd);
1244         close(filedesc);
1245 }
1246
1247 ATF_TC_CLEANUP(extattr_delete_fd_success, tc)
1248 {
1249         cleanup();
1250 }
1251
1252
1253 ATF_TC_WITH_CLEANUP(extattr_delete_fd_failure);
1254 ATF_TC_HEAD(extattr_delete_fd_failure, tc)
1255 {
1256         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1257                                         "extattr_delete_fd(2) call");
1258 }
1259
1260 ATF_TC_BODY(extattr_delete_fd_failure, tc)
1261 {
1262         /* Prepare the regex to be checked in the audit record */
1263         snprintf(extregex, sizeof(extregex),
1264                 "extattr_delete_fd.*return,failure : Bad file descriptor");
1265
1266         FILE *pipefd = setup(fds, auclass);
1267         /* Failure reason: Invalid file descriptor */
1268         ATF_REQUIRE_ERRNO(EBADF,
1269             extattr_delete_fd(-1, EXTATTR_NAMESPACE_USER, name) == -1);
1270         check_audit(fds, extregex, pipefd);
1271 }
1272
1273 ATF_TC_CLEANUP(extattr_delete_fd_failure, tc)
1274 {
1275         cleanup();
1276 }
1277
1278
1279 ATF_TC_WITH_CLEANUP(extattr_delete_link_success);
1280 ATF_TC_HEAD(extattr_delete_link_success, tc)
1281 {
1282         atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1283                                         "extattr_delete_link(2) call");
1284 }
1285
1286 ATF_TC_BODY(extattr_delete_link_success, tc)
1287 {
1288         /* Symbolic link needs to exist to call extattr_delete_link(2) */
1289         ATF_REQUIRE_EQ(0, symlink("symlink", path));
1290         skip_if_extattr_not_supported(".");
1291
1292         REQUIRE_EXTATTR_RESULT(sizeof(buff), extattr_set_link(path,
1293                 EXTATTR_NAMESPACE_USER, name, buff, sizeof(buff)));
1294
1295         FILE *pipefd = setup(fds, auclass);
1296         retval = REQUIRE_EXTATTR_SUCCESS(extattr_delete_link(path,
1297                 EXTATTR_NAMESPACE_USER, name));
1298         /* Prepare the regex to be checked in the audit record */
1299         snprintf(extregex, sizeof(extregex),
1300         "extattr_delete_link.*%s.*return,success,%d", path, retval);
1301         check_audit(fds, extregex, pipefd);
1302 }
1303
1304 ATF_TC_CLEANUP(extattr_delete_link_success, tc)
1305 {
1306         cleanup();
1307 }
1308
1309
1310 ATF_TC_WITH_CLEANUP(extattr_delete_link_failure);
1311 ATF_TC_HEAD(extattr_delete_link_failure, tc)
1312 {
1313         atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1314                                         "extattr_delete_link(2) call");
1315 }
1316
1317 ATF_TC_BODY(extattr_delete_link_failure, tc)
1318 {
1319         /* Prepare the regex to be checked in the audit record */
1320         snprintf(extregex, sizeof(extregex),
1321                 "extattr_delete_link.*%s.*failure", path);
1322         FILE *pipefd = setup(fds, auclass);
1323         /* Failure reason: symbolic link does not exist */
1324         ATF_REQUIRE_ERRNO(ENOENT,
1325             extattr_delete_link(path, EXTATTR_NAMESPACE_USER, name) == -1);
1326         check_audit(fds, extregex, pipefd);
1327 }
1328
1329 ATF_TC_CLEANUP(extattr_delete_link_failure, tc)
1330 {
1331         cleanup();
1332 }
1333
1334
1335 ATF_TP_ADD_TCS(tp)
1336 {
1337         ATF_TP_ADD_TC(tp, flock_success);
1338         ATF_TP_ADD_TC(tp, flock_failure);
1339         ATF_TP_ADD_TC(tp, fcntl_success);
1340         ATF_TP_ADD_TC(tp, fcntl_failure);
1341         ATF_TP_ADD_TC(tp, fsync_success);
1342         ATF_TP_ADD_TC(tp, fsync_failure);
1343
1344         ATF_TP_ADD_TC(tp, chmod_success);
1345         ATF_TP_ADD_TC(tp, chmod_failure);
1346         ATF_TP_ADD_TC(tp, fchmod_success);
1347         ATF_TP_ADD_TC(tp, fchmod_failure);
1348         ATF_TP_ADD_TC(tp, lchmod_success);
1349         ATF_TP_ADD_TC(tp, lchmod_failure);
1350         ATF_TP_ADD_TC(tp, fchmodat_success);
1351         ATF_TP_ADD_TC(tp, fchmodat_failure);
1352
1353         ATF_TP_ADD_TC(tp, chown_success);
1354         ATF_TP_ADD_TC(tp, chown_failure);
1355         ATF_TP_ADD_TC(tp, fchown_success);
1356         ATF_TP_ADD_TC(tp, fchown_failure);
1357         ATF_TP_ADD_TC(tp, lchown_success);
1358         ATF_TP_ADD_TC(tp, lchown_failure);
1359         ATF_TP_ADD_TC(tp, fchownat_success);
1360         ATF_TP_ADD_TC(tp, fchownat_failure);
1361
1362         ATF_TP_ADD_TC(tp, chflags_success);
1363         ATF_TP_ADD_TC(tp, chflags_failure);
1364         ATF_TP_ADD_TC(tp, fchflags_success);
1365         ATF_TP_ADD_TC(tp, fchflags_failure);
1366         ATF_TP_ADD_TC(tp, lchflags_success);
1367         ATF_TP_ADD_TC(tp, lchflags_failure);
1368         ATF_TP_ADD_TC(tp, chflagsat_success);
1369         ATF_TP_ADD_TC(tp, chflagsat_failure);
1370
1371         ATF_TP_ADD_TC(tp, utimes_success);
1372         ATF_TP_ADD_TC(tp, utimes_failure);
1373         ATF_TP_ADD_TC(tp, futimes_success);
1374         ATF_TP_ADD_TC(tp, futimes_failure);
1375         ATF_TP_ADD_TC(tp, lutimes_success);
1376         ATF_TP_ADD_TC(tp, lutimes_failure);
1377         ATF_TP_ADD_TC(tp, futimesat_success);
1378         ATF_TP_ADD_TC(tp, futimesat_failure);
1379
1380         ATF_TP_ADD_TC(tp, mprotect_success);
1381         ATF_TP_ADD_TC(tp, mprotect_failure);
1382         ATF_TP_ADD_TC(tp, undelete_failure);
1383
1384         ATF_TP_ADD_TC(tp, extattr_set_file_success);
1385         ATF_TP_ADD_TC(tp, extattr_set_file_failure);
1386         ATF_TP_ADD_TC(tp, extattr_set_fd_success);
1387         ATF_TP_ADD_TC(tp, extattr_set_fd_failure);
1388         ATF_TP_ADD_TC(tp, extattr_set_link_success);
1389         ATF_TP_ADD_TC(tp, extattr_set_link_failure);
1390
1391         ATF_TP_ADD_TC(tp, extattr_delete_file_success);
1392         ATF_TP_ADD_TC(tp, extattr_delete_file_failure);
1393         ATF_TP_ADD_TC(tp, extattr_delete_fd_success);
1394         ATF_TP_ADD_TC(tp, extattr_delete_fd_failure);
1395         ATF_TP_ADD_TC(tp, extattr_delete_link_success);
1396         ATF_TP_ADD_TC(tp, extattr_delete_link_failure);
1397
1398         return (atf_no_error());
1399 }