xref: /freebsd/tests/sys/audit/file-attribute-modify.c (revision cd9cc48b9affbd920825c1b2d26a1eae151249b8)
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/file.h>
29 #include <sys/stat.h>
30 
31 #include <atf-c.h>
32 #include <fcntl.h>
33 #include <unistd.h>
34 
35 #include "utils.h"
36 
37 static pid_t pid;
38 static uid_t uid = -1;
39 static gid_t gid = -1;
40 static int filedesc;
41 static struct pollfd fds[1];
42 static mode_t mode = 0777;
43 static char extregex[80];
44 static const char *auclass = "fm";
45 static const char *path = "fileforaudit";
46 static const char *errpath = "adirhasnoname/fileforaudit";
47 static const char *successreg = "fileforaudit.*return,success";
48 static const char *failurereg = "fileforaudit.*return,failure";
49 
50 
51 ATF_TC_WITH_CLEANUP(flock_success);
52 ATF_TC_HEAD(flock_success, tc)
53 {
54 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
55 					"flock(2) call");
56 }
57 
58 ATF_TC_BODY(flock_success, tc)
59 {
60 	pid = getpid();
61 	snprintf(extregex, sizeof(extregex), "flock.*%d.*return,success", pid);
62 
63 	/* File needs to exist to call flock(2) */
64 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
65 	FILE *pipefd = setup(fds, auclass);
66 	ATF_REQUIRE_EQ(0, flock(filedesc, LOCK_SH));
67 	check_audit(fds, extregex, pipefd);
68 	close(filedesc);
69 }
70 
71 ATF_TC_CLEANUP(flock_success, tc)
72 {
73 	cleanup();
74 }
75 
76 
77 ATF_TC_WITH_CLEANUP(flock_failure);
78 ATF_TC_HEAD(flock_failure, tc)
79 {
80 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
81 					"flock(2) call");
82 }
83 
84 ATF_TC_BODY(flock_failure, tc)
85 {
86 	const char *regex = "flock.*return,failure : Bad file descriptor";
87 	FILE *pipefd = setup(fds, auclass);
88 	ATF_REQUIRE_EQ(-1, flock(-1, LOCK_SH));
89 	check_audit(fds, regex, pipefd);
90 }
91 
92 ATF_TC_CLEANUP(flock_failure, tc)
93 {
94 	cleanup();
95 }
96 
97 
98 ATF_TC_WITH_CLEANUP(fcntl_success);
99 ATF_TC_HEAD(fcntl_success, tc)
100 {
101 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
102 					"fcntl(2) call");
103 }
104 
105 ATF_TC_BODY(fcntl_success, tc)
106 {
107 	int flagstatus;
108 	/* File needs to exist to call fcntl(2) */
109 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
110 	FILE *pipefd = setup(fds, auclass);
111 
112 	/* Retrieve the status flags of 'filedesc' and store it in flagstatus */
113 	ATF_REQUIRE((flagstatus = fcntl(filedesc, F_GETFL, 0)) != -1);
114 	snprintf(extregex, sizeof(extregex),
115 			"fcntl.*return,success,%d", flagstatus);
116 	check_audit(fds, extregex, pipefd);
117 	close(filedesc);
118 }
119 
120 ATF_TC_CLEANUP(fcntl_success, tc)
121 {
122 	cleanup();
123 }
124 
125 
126 ATF_TC_WITH_CLEANUP(fcntl_failure);
127 ATF_TC_HEAD(fcntl_failure, tc)
128 {
129 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
130 					"fcntl(2) call");
131 }
132 
133 ATF_TC_BODY(fcntl_failure, tc)
134 {
135 	const char *regex = "fcntl.*return,failure : Bad file descriptor";
136 	FILE *pipefd = setup(fds, auclass);
137 	ATF_REQUIRE_EQ(-1, fcntl(-1, F_GETFL, 0));
138 	check_audit(fds, regex, pipefd);
139 }
140 
141 ATF_TC_CLEANUP(fcntl_failure, tc)
142 {
143 	cleanup();
144 }
145 
146 
147 ATF_TC_WITH_CLEANUP(fsync_success);
148 ATF_TC_HEAD(fsync_success, tc)
149 {
150 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
151 					"fsync(2) call");
152 }
153 
154 ATF_TC_BODY(fsync_success, tc)
155 {
156 	pid = getpid();
157 	snprintf(extregex, sizeof(extregex), "fsync.*%d.*return,success", pid);
158 
159 	/* File needs to exist to call fsync(2) */
160 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
161 	FILE *pipefd = setup(fds, auclass);
162 	ATF_REQUIRE_EQ(0, fsync(filedesc));
163 	check_audit(fds, extregex, pipefd);
164 	close(filedesc);
165 }
166 
167 ATF_TC_CLEANUP(fsync_success, tc)
168 {
169 	cleanup();
170 }
171 
172 
173 ATF_TC_WITH_CLEANUP(fsync_failure);
174 ATF_TC_HEAD(fsync_failure, tc)
175 {
176 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
177 					"fsync(2) call");
178 }
179 
180 ATF_TC_BODY(fsync_failure, tc)
181 {
182 	const char *regex = "fsync.*return,failure : Bad file descriptor";
183 	FILE *pipefd = setup(fds, auclass);
184 	/* Failure reason: Invalid file descriptor */
185 	ATF_REQUIRE_EQ(-1, fsync(-1));
186 	check_audit(fds, regex, pipefd);
187 }
188 
189 ATF_TC_CLEANUP(fsync_failure, tc)
190 {
191 	cleanup();
192 }
193 
194 
195 ATF_TC_WITH_CLEANUP(chmod_success);
196 ATF_TC_HEAD(chmod_success, tc)
197 {
198 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
199 					"chmod(2) call");
200 }
201 
202 ATF_TC_BODY(chmod_success, tc)
203 {
204 	/* File needs to exist to call chmod(2) */
205 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
206 	FILE *pipefd = setup(fds, auclass);
207 	ATF_REQUIRE_EQ(0, chmod(path, mode));
208 	check_audit(fds, successreg, pipefd);
209 	close(filedesc);
210 }
211 
212 ATF_TC_CLEANUP(chmod_success, tc)
213 {
214 	cleanup();
215 }
216 
217 
218 ATF_TC_WITH_CLEANUP(chmod_failure);
219 ATF_TC_HEAD(chmod_failure, tc)
220 {
221 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
222 					"chmod(2) call");
223 }
224 
225 ATF_TC_BODY(chmod_failure, tc)
226 {
227 	FILE *pipefd = setup(fds, auclass);
228 	/* Failure reason: file does not exist */
229 	ATF_REQUIRE_EQ(-1, chmod(errpath, mode));
230 	check_audit(fds, failurereg, pipefd);
231 }
232 
233 ATF_TC_CLEANUP(chmod_failure, tc)
234 {
235 	cleanup();
236 }
237 
238 
239 ATF_TC_WITH_CLEANUP(fchmod_success);
240 ATF_TC_HEAD(fchmod_success, tc)
241 {
242 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
243 					"fchmod(2) call");
244 }
245 
246 ATF_TC_BODY(fchmod_success, tc)
247 {
248 	pid = getpid();
249 	snprintf(extregex, sizeof(extregex), "fchmod.*%d.*return,success", pid);
250 
251 	/* File needs to exist to call fchmod(2) */
252 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
253 	FILE *pipefd = setup(fds, auclass);
254 	ATF_REQUIRE_EQ(0, fchmod(filedesc, mode));
255 	check_audit(fds, extregex, pipefd);
256 	close(filedesc);
257 }
258 
259 ATF_TC_CLEANUP(fchmod_success, tc)
260 {
261 	cleanup();
262 }
263 
264 
265 ATF_TC_WITH_CLEANUP(fchmod_failure);
266 ATF_TC_HEAD(fchmod_failure, tc)
267 {
268 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
269 					"fchmod(2) call");
270 }
271 
272 ATF_TC_BODY(fchmod_failure, tc)
273 {
274 	const char *regex = "fchmod.*return,failure : Bad file descriptor";
275 	FILE *pipefd = setup(fds, auclass);
276 	/* Failure reason: Invalid file descriptor */
277 	ATF_REQUIRE_EQ(-1, fchmod(-1, mode));
278 	check_audit(fds, regex, pipefd);
279 }
280 
281 ATF_TC_CLEANUP(fchmod_failure, tc)
282 {
283 	cleanup();
284 }
285 
286 
287 ATF_TC_WITH_CLEANUP(lchmod_success);
288 ATF_TC_HEAD(lchmod_success, tc)
289 {
290 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
291 					"lchmod(2) call");
292 }
293 
294 ATF_TC_BODY(lchmod_success, tc)
295 {
296 	/* Symbolic link needs to exist to call lchmod(2) */
297 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
298 	FILE *pipefd = setup(fds, auclass);
299 	ATF_REQUIRE_EQ(0, lchmod(path, mode));
300 	check_audit(fds, successreg, pipefd);
301 }
302 
303 ATF_TC_CLEANUP(lchmod_success, tc)
304 {
305 	cleanup();
306 }
307 
308 
309 ATF_TC_WITH_CLEANUP(lchmod_failure);
310 ATF_TC_HEAD(lchmod_failure, tc)
311 {
312 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
313 					"lchmod(2) call");
314 }
315 
316 ATF_TC_BODY(lchmod_failure, tc)
317 {
318 	FILE *pipefd = setup(fds, auclass);
319 	/* Failure reason: file does not exist */
320 	ATF_REQUIRE_EQ(-1, lchmod(errpath, mode));
321 	check_audit(fds, failurereg, pipefd);
322 }
323 
324 ATF_TC_CLEANUP(lchmod_failure, tc)
325 {
326 	cleanup();
327 }
328 
329 
330 ATF_TC_WITH_CLEANUP(fchmodat_success);
331 ATF_TC_HEAD(fchmodat_success, tc)
332 {
333 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
334 					"fchmodat(2) call");
335 }
336 
337 ATF_TC_BODY(fchmodat_success, tc)
338 {
339 	/* File needs to exist to call fchmodat(2) */
340 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
341 	FILE *pipefd = setup(fds, auclass);
342 	ATF_REQUIRE_EQ(0, fchmodat(AT_FDCWD, path, mode, 0));
343 	check_audit(fds, successreg, pipefd);
344 	close(filedesc);
345 }
346 
347 ATF_TC_CLEANUP(fchmodat_success, tc)
348 {
349 	cleanup();
350 }
351 
352 
353 ATF_TC_WITH_CLEANUP(fchmodat_failure);
354 ATF_TC_HEAD(fchmodat_failure, tc)
355 {
356 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
357 					"fchmodat(2) call");
358 }
359 
360 ATF_TC_BODY(fchmodat_failure, tc)
361 {
362 	FILE *pipefd = setup(fds, auclass);
363 	/* Failure reason: file does not exist */
364 	ATF_REQUIRE_EQ(-1, fchmodat(AT_FDCWD, errpath, mode, 0));
365 	check_audit(fds, failurereg, pipefd);
366 }
367 
368 ATF_TC_CLEANUP(fchmodat_failure, tc)
369 {
370 	cleanup();
371 }
372 
373 
374 ATF_TC_WITH_CLEANUP(chown_success);
375 ATF_TC_HEAD(chown_success, tc)
376 {
377 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
378 					"chown(2) call");
379 }
380 
381 ATF_TC_BODY(chown_success, tc)
382 {
383 	/* File needs to exist to call chown(2) */
384 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
385 	FILE *pipefd = setup(fds, auclass);
386 	ATF_REQUIRE_EQ(0, chown(path, uid, gid));
387 	check_audit(fds, successreg, pipefd);
388 	close(filedesc);
389 }
390 
391 ATF_TC_CLEANUP(chown_success, tc)
392 {
393 	cleanup();
394 }
395 
396 
397 ATF_TC_WITH_CLEANUP(chown_failure);
398 ATF_TC_HEAD(chown_failure, tc)
399 {
400 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
401 					"chown(2) call");
402 }
403 
404 ATF_TC_BODY(chown_failure, tc)
405 {
406 	FILE *pipefd = setup(fds, auclass);
407 	/* Failure reason: file does not exist */
408 	ATF_REQUIRE_EQ(-1, chown(errpath, uid, gid));
409 	check_audit(fds, failurereg, pipefd);
410 }
411 
412 ATF_TC_CLEANUP(chown_failure, tc)
413 {
414 	cleanup();
415 }
416 
417 
418 ATF_TC_WITH_CLEANUP(fchown_success);
419 ATF_TC_HEAD(fchown_success, tc)
420 {
421 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
422 					"fchown(2) call");
423 }
424 
425 ATF_TC_BODY(fchown_success, tc)
426 {
427 	pid = getpid();
428 	snprintf(extregex, sizeof(extregex), "fchown.*%d.*return,success", pid);
429 
430 	/* File needs to exist to call fchown(2) */
431 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
432 	FILE *pipefd = setup(fds, auclass);
433 	ATF_REQUIRE_EQ(0, fchown(filedesc, uid, gid));
434 	check_audit(fds, extregex, pipefd);
435 	close(filedesc);
436 }
437 
438 ATF_TC_CLEANUP(fchown_success, tc)
439 {
440 	cleanup();
441 }
442 
443 
444 ATF_TC_WITH_CLEANUP(fchown_failure);
445 ATF_TC_HEAD(fchown_failure, tc)
446 {
447 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
448 					"fchown(2) call");
449 }
450 
451 ATF_TC_BODY(fchown_failure, tc)
452 {
453 	const char *regex = "fchown.*return,failure : Bad file descriptor";
454 	FILE *pipefd = setup(fds, auclass);
455 	/* Failure reason: Invalid file descriptor */
456 	ATF_REQUIRE_EQ(-1, fchown(-1, uid, gid));
457 	check_audit(fds, regex, pipefd);
458 }
459 
460 ATF_TC_CLEANUP(fchown_failure, tc)
461 {
462 	cleanup();
463 }
464 
465 
466 ATF_TC_WITH_CLEANUP(lchown_success);
467 ATF_TC_HEAD(lchown_success, tc)
468 {
469 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
470 					"lchown(2) call");
471 }
472 
473 ATF_TC_BODY(lchown_success, tc)
474 {
475 	/* Symbolic link needs to exist to call lchown(2) */
476 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
477 	FILE *pipefd = setup(fds, auclass);
478 	ATF_REQUIRE_EQ(0, lchown(path, uid, gid));
479 	check_audit(fds, successreg, pipefd);
480 }
481 
482 ATF_TC_CLEANUP(lchown_success, tc)
483 {
484 	cleanup();
485 }
486 
487 
488 ATF_TC_WITH_CLEANUP(lchown_failure);
489 ATF_TC_HEAD(lchown_failure, tc)
490 {
491 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
492 					"lchown(2) call");
493 }
494 
495 ATF_TC_BODY(lchown_failure, tc)
496 {
497 	FILE *pipefd = setup(fds, auclass);
498 	/* Failure reason: Symbolic link does not exist */
499 	ATF_REQUIRE_EQ(-1, lchown(errpath, uid, gid));
500 	check_audit(fds, failurereg, pipefd);
501 }
502 
503 ATF_TC_CLEANUP(lchown_failure, tc)
504 {
505 	cleanup();
506 }
507 
508 
509 ATF_TC_WITH_CLEANUP(fchownat_success);
510 ATF_TC_HEAD(fchownat_success, tc)
511 {
512 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
513 					"fchownat(2) call");
514 }
515 
516 ATF_TC_BODY(fchownat_success, tc)
517 {
518 	/* File needs to exist to call fchownat(2) */
519 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
520 	FILE *pipefd = setup(fds, auclass);
521 	ATF_REQUIRE_EQ(0, fchownat(AT_FDCWD, path, uid, gid, 0));
522 	check_audit(fds, successreg, pipefd);
523 	close(filedesc);
524 }
525 
526 ATF_TC_CLEANUP(fchownat_success, tc)
527 {
528 	cleanup();
529 }
530 
531 
532 ATF_TC_WITH_CLEANUP(fchownat_failure);
533 ATF_TC_HEAD(fchownat_failure, tc)
534 {
535 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
536 					"fchownat(2) call");
537 }
538 
539 ATF_TC_BODY(fchownat_failure, tc)
540 {
541 	FILE *pipefd = setup(fds, auclass);
542 	/* Failure reason: file does not exist */
543 	ATF_REQUIRE_EQ(-1, fchownat(AT_FDCWD, errpath, uid, gid, 0));
544 	check_audit(fds, failurereg, pipefd);
545 }
546 
547 ATF_TC_CLEANUP(fchownat_failure, tc)
548 {
549 	cleanup();
550 }
551 
552 
553 ATF_TC_WITH_CLEANUP(chflags_success);
554 ATF_TC_HEAD(chflags_success, tc)
555 {
556 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
557 					"chflags(2) call");
558 }
559 
560 ATF_TC_BODY(chflags_success, tc)
561 {
562 	/* File needs to exist to call chflags(2) */
563 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
564 	FILE *pipefd = setup(fds, auclass);
565 	ATF_REQUIRE_EQ(0, chflags(path, UF_OFFLINE));
566 	check_audit(fds, successreg, pipefd);
567 	close(filedesc);
568 }
569 
570 ATF_TC_CLEANUP(chflags_success, tc)
571 {
572 	cleanup();
573 }
574 
575 
576 ATF_TC_WITH_CLEANUP(chflags_failure);
577 ATF_TC_HEAD(chflags_failure, tc)
578 {
579 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
580 					"chflags(2) call");
581 }
582 
583 ATF_TC_BODY(chflags_failure, tc)
584 {
585 	FILE *pipefd = setup(fds, auclass);
586 	/* Failure reason: file does not exist */
587 	ATF_REQUIRE_EQ(-1, chflags(errpath, UF_OFFLINE));
588 	check_audit(fds, failurereg, pipefd);
589 }
590 
591 ATF_TC_CLEANUP(chflags_failure, tc)
592 {
593 	cleanup();
594 }
595 
596 
597 ATF_TC_WITH_CLEANUP(fchflags_success);
598 ATF_TC_HEAD(fchflags_success, tc)
599 {
600 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
601 					"fchflags(2) call");
602 }
603 
604 ATF_TC_BODY(fchflags_success, tc)
605 {
606 	pid = getpid();
607 	snprintf(extregex, sizeof(extregex), "fchflags.*%d.*ret.*success", pid);
608 	/* File needs to exist to call fchflags(2) */
609 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
610 
611 	FILE *pipefd = setup(fds, auclass);
612 	ATF_REQUIRE_EQ(0, fchflags(filedesc, UF_OFFLINE));
613 	check_audit(fds, extregex, pipefd);
614 	close(filedesc);
615 }
616 
617 ATF_TC_CLEANUP(fchflags_success, tc)
618 {
619 	cleanup();
620 }
621 
622 
623 ATF_TC_WITH_CLEANUP(fchflags_failure);
624 ATF_TC_HEAD(fchflags_failure, tc)
625 {
626 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
627 					"fchflags(2) call");
628 }
629 
630 ATF_TC_BODY(fchflags_failure, tc)
631 {
632 	const char *regex = "fchflags.*return,failure : Bad file descriptor";
633 	FILE *pipefd = setup(fds, auclass);
634 	/* Failure reason: Invalid file descriptor */
635 	ATF_REQUIRE_EQ(-1, fchflags(-1, UF_OFFLINE));
636 	check_audit(fds, regex, pipefd);
637 }
638 
639 ATF_TC_CLEANUP(fchflags_failure, tc)
640 {
641 	cleanup();
642 }
643 
644 
645 ATF_TC_WITH_CLEANUP(lchflags_success);
646 ATF_TC_HEAD(lchflags_success, tc)
647 {
648 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
649 					"lchflags(2) call");
650 }
651 
652 ATF_TC_BODY(lchflags_success, tc)
653 {
654 	/* Symbolic link needs to exist to call lchflags(2) */
655 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
656 	FILE *pipefd = setup(fds, auclass);
657 	ATF_REQUIRE_EQ(0, lchflags(path, UF_OFFLINE));
658 	check_audit(fds, successreg, pipefd);
659 }
660 
661 ATF_TC_CLEANUP(lchflags_success, tc)
662 {
663 	cleanup();
664 }
665 
666 
667 ATF_TC_WITH_CLEANUP(lchflags_failure);
668 ATF_TC_HEAD(lchflags_failure, tc)
669 {
670 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
671 					"lchflags(2) call");
672 }
673 
674 ATF_TC_BODY(lchflags_failure, tc)
675 {
676 	FILE *pipefd = setup(fds, auclass);
677 	/* Failure reason: Symbolic link does not exist */
678 	ATF_REQUIRE_EQ(-1, lchflags(errpath, UF_OFFLINE));
679 	check_audit(fds, failurereg, pipefd);
680 }
681 
682 ATF_TC_CLEANUP(lchflags_failure, tc)
683 {
684 	cleanup();
685 }
686 
687 
688 ATF_TP_ADD_TCS(tp)
689 {
690 	ATF_TP_ADD_TC(tp, flock_success);
691 	ATF_TP_ADD_TC(tp, flock_failure);
692 	ATF_TP_ADD_TC(tp, fcntl_success);
693 	ATF_TP_ADD_TC(tp, fcntl_failure);
694 	ATF_TP_ADD_TC(tp, fsync_success);
695 	ATF_TP_ADD_TC(tp, fsync_failure);
696 
697 	ATF_TP_ADD_TC(tp, chmod_success);
698 	ATF_TP_ADD_TC(tp, chmod_failure);
699 	ATF_TP_ADD_TC(tp, fchmod_success);
700 	ATF_TP_ADD_TC(tp, fchmod_failure);
701 	ATF_TP_ADD_TC(tp, lchmod_success);
702 	ATF_TP_ADD_TC(tp, lchmod_failure);
703 	ATF_TP_ADD_TC(tp, fchmodat_success);
704 	ATF_TP_ADD_TC(tp, fchmodat_failure);
705 
706 	ATF_TP_ADD_TC(tp, chown_success);
707 	ATF_TP_ADD_TC(tp, chown_failure);
708 	ATF_TP_ADD_TC(tp, fchown_success);
709 	ATF_TP_ADD_TC(tp, fchown_failure);
710 	ATF_TP_ADD_TC(tp, lchown_success);
711 	ATF_TP_ADD_TC(tp, lchown_failure);
712 	ATF_TP_ADD_TC(tp, fchownat_success);
713 	ATF_TP_ADD_TC(tp, fchownat_failure);
714 
715 	ATF_TP_ADD_TC(tp, chflags_success);
716 	ATF_TP_ADD_TC(tp, chflags_failure);
717 	ATF_TP_ADD_TC(tp, fchflags_success);
718 	ATF_TP_ADD_TC(tp, fchflags_failure);
719 	ATF_TP_ADD_TC(tp, lchflags_success);
720 	ATF_TP_ADD_TC(tp, lchflags_failure);
721 
722 	return (atf_no_error());
723 }
724