xref: /freebsd/tests/sys/audit/file-attribute-access.c (revision 2c347e631e8fcc294616e2be8c0f5efaf0be2bd5)
1f86d6517SAlan Somers /*-
2f86d6517SAlan Somers  * Copyright (c) 2018 Aniket Pandey
3f86d6517SAlan Somers  *
4f86d6517SAlan Somers  * Redistribution and use in source and binary forms, with or without
5f86d6517SAlan Somers  * modification, are permitted provided that the following conditions
6f86d6517SAlan Somers  * are met:
7f86d6517SAlan Somers  * 1. Redistributions of source code must retain the above copyright
8f86d6517SAlan Somers  *    notice, this list of conditions and the following disclaimer.
9f86d6517SAlan Somers  * 2. Redistributions in binary form must reproduce the above copyright
10f86d6517SAlan Somers  *    notice, this list of conditions and the following disclaimer in the
11f86d6517SAlan Somers  *    documentation and/or other materials provided with the distribution.
12f86d6517SAlan Somers  *
13f86d6517SAlan Somers  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14f86d6517SAlan Somers  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15f86d6517SAlan Somers  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16f86d6517SAlan Somers  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17f86d6517SAlan Somers  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18f86d6517SAlan Somers  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19f86d6517SAlan Somers  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
20f86d6517SAlan Somers  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21f86d6517SAlan Somers  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22f86d6517SAlan Somers  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23f86d6517SAlan Somers  * SUCH DAMAGE.
24f86d6517SAlan Somers  *
25f86d6517SAlan Somers  * $FreeBSD$
26f86d6517SAlan Somers  */
27f86d6517SAlan Somers 
28ae19b2efSAlan Somers #include <sys/param.h>
29ae19b2efSAlan Somers #include <sys/ucred.h>
30ae19b2efSAlan Somers #include <sys/mount.h>
31f86d6517SAlan Somers #include <sys/stat.h>
32f86d6517SAlan Somers #include <sys/syscall.h>
33f86d6517SAlan Somers 
34f86d6517SAlan Somers #include <atf-c.h>
35f86d6517SAlan Somers #include <fcntl.h>
36f86d6517SAlan Somers #include <unistd.h>
37f86d6517SAlan Somers 
38f86d6517SAlan Somers #include "utils.h"
39f86d6517SAlan Somers 
40f86d6517SAlan Somers static struct pollfd fds[1];
41f86d6517SAlan Somers static mode_t mode = 0777;
42ae19b2efSAlan Somers static pid_t pid;
43a56867b8SAlan Somers static fhandle_t fht;
44a56867b8SAlan Somers static int filedesc, fhdesc;
45f86d6517SAlan Somers static char extregex[80];
46f86d6517SAlan Somers static struct stat statbuff;
47ae19b2efSAlan Somers static struct statfs statfsbuff;
48f86d6517SAlan Somers static const char *auclass = "fa";
49f86d6517SAlan Somers static const char *path = "fileforaudit";
50f86d6517SAlan Somers static const char *errpath = "dirdoesnotexist/fileforaudit";
51f86d6517SAlan Somers static const char *successreg = "fileforaudit.*return,success";
52f86d6517SAlan Somers static const char *failurereg = "fileforaudit.*return,failure";
53f86d6517SAlan Somers 
54f86d6517SAlan Somers 
55f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(stat_success);
56f86d6517SAlan Somers ATF_TC_HEAD(stat_success, tc)
57f86d6517SAlan Somers {
58f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
59f86d6517SAlan Somers 					"stat(2) call");
60f86d6517SAlan Somers }
61f86d6517SAlan Somers 
62f86d6517SAlan Somers ATF_TC_BODY(stat_success, tc)
63f86d6517SAlan Somers {
64f86d6517SAlan Somers 	/* File needs to exist to call stat(2) */
65b13a70d5SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
66f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
67f86d6517SAlan Somers 	ATF_REQUIRE_EQ(0, stat(path, &statbuff));
68f86d6517SAlan Somers 	check_audit(fds, successreg, pipefd);
69b13a70d5SAlan Somers 	close(filedesc);
70f86d6517SAlan Somers }
71f86d6517SAlan Somers 
72f86d6517SAlan Somers ATF_TC_CLEANUP(stat_success, tc)
73f86d6517SAlan Somers {
74f86d6517SAlan Somers 	cleanup();
75f86d6517SAlan Somers }
76f86d6517SAlan Somers 
77f86d6517SAlan Somers 
78f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(stat_failure);
79f86d6517SAlan Somers ATF_TC_HEAD(stat_failure, tc)
80f86d6517SAlan Somers {
81f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
82f86d6517SAlan Somers 					"stat(2) call");
83f86d6517SAlan Somers }
84f86d6517SAlan Somers 
85f86d6517SAlan Somers ATF_TC_BODY(stat_failure, tc)
86f86d6517SAlan Somers {
87f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
88f86d6517SAlan Somers 	/* Failure reason: file does not exist */
89f86d6517SAlan Somers 	ATF_REQUIRE_EQ(-1, stat(errpath, &statbuff));
90f86d6517SAlan Somers 	check_audit(fds, failurereg, pipefd);
91f86d6517SAlan Somers }
92f86d6517SAlan Somers 
93f86d6517SAlan Somers ATF_TC_CLEANUP(stat_failure, tc)
94f86d6517SAlan Somers {
95f86d6517SAlan Somers 	cleanup();
96f86d6517SAlan Somers }
97f86d6517SAlan Somers 
98f86d6517SAlan Somers 
99f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(lstat_success);
100f86d6517SAlan Somers ATF_TC_HEAD(lstat_success, tc)
101f86d6517SAlan Somers {
102f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
103f86d6517SAlan Somers 					"lstat(2) call");
104f86d6517SAlan Somers }
105f86d6517SAlan Somers 
106f86d6517SAlan Somers ATF_TC_BODY(lstat_success, tc)
107f86d6517SAlan Somers {
108f86d6517SAlan Somers 	/* Symbolic link needs to exist to call lstat(2) */
109f86d6517SAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
110f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
111f86d6517SAlan Somers 	ATF_REQUIRE_EQ(0, lstat(path, &statbuff));
112f86d6517SAlan Somers 	check_audit(fds, successreg, pipefd);
113f86d6517SAlan Somers }
114f86d6517SAlan Somers 
115f86d6517SAlan Somers ATF_TC_CLEANUP(lstat_success, tc)
116f86d6517SAlan Somers {
117f86d6517SAlan Somers 	cleanup();
118f86d6517SAlan Somers }
119f86d6517SAlan Somers 
120f86d6517SAlan Somers 
121f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(lstat_failure);
122f86d6517SAlan Somers ATF_TC_HEAD(lstat_failure, tc)
123f86d6517SAlan Somers {
124f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
125f86d6517SAlan Somers 					"lstat(2) call");
126f86d6517SAlan Somers }
127f86d6517SAlan Somers 
128f86d6517SAlan Somers ATF_TC_BODY(lstat_failure, tc)
129f86d6517SAlan Somers {
130f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
131f86d6517SAlan Somers 	/* Failure reason: symbolic link does not exist */
132f86d6517SAlan Somers 	ATF_REQUIRE_EQ(-1, lstat(errpath, &statbuff));
133f86d6517SAlan Somers 	check_audit(fds, failurereg, pipefd);
134f86d6517SAlan Somers }
135f86d6517SAlan Somers 
136f86d6517SAlan Somers ATF_TC_CLEANUP(lstat_failure, tc)
137f86d6517SAlan Somers {
138f86d6517SAlan Somers 	cleanup();
139f86d6517SAlan Somers }
140f86d6517SAlan Somers 
141f86d6517SAlan Somers 
142f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(fstat_success);
143f86d6517SAlan Somers ATF_TC_HEAD(fstat_success, tc)
144f86d6517SAlan Somers {
145f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
146f86d6517SAlan Somers 					"fstat(2) call");
147f86d6517SAlan Somers }
148f86d6517SAlan Somers 
149f86d6517SAlan Somers ATF_TC_BODY(fstat_success, tc)
150f86d6517SAlan Somers {
151f86d6517SAlan Somers 	/* File needs to exist to call fstat(2) */
152f86d6517SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT | O_RDWR, mode)) != -1);
153f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
154f86d6517SAlan Somers 	ATF_REQUIRE_EQ(0, fstat(filedesc, &statbuff));
155f86d6517SAlan Somers 
156f86d6517SAlan Somers 	snprintf(extregex, sizeof(extregex),
157f86d6517SAlan Somers 		"fstat.*%jd.*return,success", (intmax_t)statbuff.st_ino);
158f86d6517SAlan Somers 	check_audit(fds, extregex, pipefd);
159b13a70d5SAlan Somers 	close(filedesc);
160f86d6517SAlan Somers }
161f86d6517SAlan Somers 
162f86d6517SAlan Somers ATF_TC_CLEANUP(fstat_success, tc)
163f86d6517SAlan Somers {
164f86d6517SAlan Somers 	cleanup();
165f86d6517SAlan Somers }
166f86d6517SAlan Somers 
167f86d6517SAlan Somers 
168f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(fstat_failure);
169f86d6517SAlan Somers ATF_TC_HEAD(fstat_failure, tc)
170f86d6517SAlan Somers {
171f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
172f86d6517SAlan Somers 					"fstat(2) call");
173f86d6517SAlan Somers }
174f86d6517SAlan Somers 
175f86d6517SAlan Somers ATF_TC_BODY(fstat_failure, tc)
176f86d6517SAlan Somers {
177f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
178f86d6517SAlan Somers 	const char *regex = "fstat.*return,failure : Bad file descriptor";
179f86d6517SAlan Somers 	/* Failure reason: bad file descriptor */
180f86d6517SAlan Somers 	ATF_REQUIRE_EQ(-1, fstat(-1, &statbuff));
181f86d6517SAlan Somers 	check_audit(fds, regex, pipefd);
182f86d6517SAlan Somers }
183f86d6517SAlan Somers 
184f86d6517SAlan Somers ATF_TC_CLEANUP(fstat_failure, tc)
185f86d6517SAlan Somers {
186f86d6517SAlan Somers 	cleanup();
187f86d6517SAlan Somers }
188f86d6517SAlan Somers 
189f86d6517SAlan Somers 
190f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(fstatat_success);
191f86d6517SAlan Somers ATF_TC_HEAD(fstatat_success, tc)
192f86d6517SAlan Somers {
193f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
194f86d6517SAlan Somers 					"fstatat(2) call");
195f86d6517SAlan Somers }
196f86d6517SAlan Somers 
197f86d6517SAlan Somers ATF_TC_BODY(fstatat_success, tc)
198f86d6517SAlan Somers {
199f86d6517SAlan Somers 	/* File or Symbolic link needs to exist to call lstat(2) */
200f86d6517SAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
201f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
202f86d6517SAlan Somers 	ATF_REQUIRE_EQ(0, fstatat(AT_FDCWD, path, &statbuff,
203f86d6517SAlan Somers 		AT_SYMLINK_NOFOLLOW));
204f86d6517SAlan Somers 	check_audit(fds, successreg, pipefd);
205f86d6517SAlan Somers }
206f86d6517SAlan Somers 
207f86d6517SAlan Somers ATF_TC_CLEANUP(fstatat_success, tc)
208f86d6517SAlan Somers {
209f86d6517SAlan Somers 	cleanup();
210f86d6517SAlan Somers }
211f86d6517SAlan Somers 
212f86d6517SAlan Somers 
213f86d6517SAlan Somers ATF_TC_WITH_CLEANUP(fstatat_failure);
214f86d6517SAlan Somers ATF_TC_HEAD(fstatat_failure, tc)
215f86d6517SAlan Somers {
216f86d6517SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
217f86d6517SAlan Somers 					"fstatat(2) call");
218f86d6517SAlan Somers }
219f86d6517SAlan Somers 
220f86d6517SAlan Somers ATF_TC_BODY(fstatat_failure, tc)
221f86d6517SAlan Somers {
222f86d6517SAlan Somers 	FILE *pipefd = setup(fds, auclass);
223f86d6517SAlan Somers 	/* Failure reason: symbolic link does not exist */
224f86d6517SAlan Somers 	ATF_REQUIRE_EQ(-1, fstatat(AT_FDCWD, path, &statbuff,
225f86d6517SAlan Somers 		AT_SYMLINK_NOFOLLOW));
226f86d6517SAlan Somers 	check_audit(fds, failurereg, pipefd);
227f86d6517SAlan Somers }
228f86d6517SAlan Somers 
229f86d6517SAlan Somers ATF_TC_CLEANUP(fstatat_failure, tc)
230f86d6517SAlan Somers {
231f86d6517SAlan Somers 	cleanup();
232f86d6517SAlan Somers }
233f86d6517SAlan Somers 
234f86d6517SAlan Somers 
235ae19b2efSAlan Somers ATF_TC_WITH_CLEANUP(statfs_success);
236ae19b2efSAlan Somers ATF_TC_HEAD(statfs_success, tc)
237ae19b2efSAlan Somers {
238ae19b2efSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
239ae19b2efSAlan Somers 					"statfs(2) call");
240ae19b2efSAlan Somers }
241ae19b2efSAlan Somers 
242ae19b2efSAlan Somers ATF_TC_BODY(statfs_success, tc)
243ae19b2efSAlan Somers {
244ae19b2efSAlan Somers 	/* File needs to exist to call statfs(2) */
245ae19b2efSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
246ae19b2efSAlan Somers 	FILE *pipefd = setup(fds, auclass);
247ae19b2efSAlan Somers 	ATF_REQUIRE_EQ(0, statfs(path, &statfsbuff));
248ae19b2efSAlan Somers 	check_audit(fds, successreg, pipefd);
249ae19b2efSAlan Somers 	close(filedesc);
250ae19b2efSAlan Somers }
251ae19b2efSAlan Somers 
252ae19b2efSAlan Somers ATF_TC_CLEANUP(statfs_success, tc)
253ae19b2efSAlan Somers {
254ae19b2efSAlan Somers 	cleanup();
255ae19b2efSAlan Somers }
256ae19b2efSAlan Somers 
257ae19b2efSAlan Somers 
258ae19b2efSAlan Somers ATF_TC_WITH_CLEANUP(statfs_failure);
259ae19b2efSAlan Somers ATF_TC_HEAD(statfs_failure, tc)
260ae19b2efSAlan Somers {
261ae19b2efSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
262ae19b2efSAlan Somers 					"statfs(2) call");
263ae19b2efSAlan Somers }
264ae19b2efSAlan Somers 
265ae19b2efSAlan Somers ATF_TC_BODY(statfs_failure, tc)
266ae19b2efSAlan Somers {
267ae19b2efSAlan Somers 	FILE *pipefd = setup(fds, auclass);
268ae19b2efSAlan Somers 	/* Failure reason: file does not exist */
269ae19b2efSAlan Somers 	ATF_REQUIRE_EQ(-1, statfs(errpath, &statfsbuff));
270ae19b2efSAlan Somers 	check_audit(fds, failurereg, pipefd);
271ae19b2efSAlan Somers }
272ae19b2efSAlan Somers 
273ae19b2efSAlan Somers ATF_TC_CLEANUP(statfs_failure, tc)
274ae19b2efSAlan Somers {
275ae19b2efSAlan Somers 	cleanup();
276ae19b2efSAlan Somers }
277ae19b2efSAlan Somers 
278ae19b2efSAlan Somers 
279ae19b2efSAlan Somers ATF_TC_WITH_CLEANUP(fstatfs_success);
280ae19b2efSAlan Somers ATF_TC_HEAD(fstatfs_success, tc)
281ae19b2efSAlan Somers {
282ae19b2efSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
283ae19b2efSAlan Somers 					"fstatfs(2) call");
284ae19b2efSAlan Somers }
285ae19b2efSAlan Somers 
286ae19b2efSAlan Somers ATF_TC_BODY(fstatfs_success, tc)
287ae19b2efSAlan Somers {
288ae19b2efSAlan Somers 	/* File needs to exist to call fstat(2) */
289ae19b2efSAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT | O_RDWR, mode)) != -1);
290ae19b2efSAlan Somers 	/* Call stat(2) to store the Inode number of 'path' */
291ae19b2efSAlan Somers 	ATF_REQUIRE_EQ(0, stat(path, &statbuff));
292ae19b2efSAlan Somers 	FILE *pipefd = setup(fds, auclass);
293ae19b2efSAlan Somers 	ATF_REQUIRE_EQ(0, fstatfs(filedesc, &statfsbuff));
294ae19b2efSAlan Somers 
295ae19b2efSAlan Somers 	snprintf(extregex, sizeof(extregex), "fstatfs.*%jd.*return,success",
296ae19b2efSAlan Somers 			(intmax_t)statbuff.st_ino);
297ae19b2efSAlan Somers 	check_audit(fds, extregex, pipefd);
298ae19b2efSAlan Somers 	close(filedesc);
299ae19b2efSAlan Somers }
300ae19b2efSAlan Somers 
301ae19b2efSAlan Somers ATF_TC_CLEANUP(fstatfs_success, tc)
302ae19b2efSAlan Somers {
303ae19b2efSAlan Somers 	cleanup();
304ae19b2efSAlan Somers }
305ae19b2efSAlan Somers 
306ae19b2efSAlan Somers 
307ae19b2efSAlan Somers ATF_TC_WITH_CLEANUP(fstatfs_failure);
308ae19b2efSAlan Somers ATF_TC_HEAD(fstatfs_failure, tc)
309ae19b2efSAlan Somers {
310ae19b2efSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
311ae19b2efSAlan Somers 					"fstatfs(2) call");
312ae19b2efSAlan Somers }
313ae19b2efSAlan Somers 
314ae19b2efSAlan Somers ATF_TC_BODY(fstatfs_failure, tc)
315ae19b2efSAlan Somers {
316ae19b2efSAlan Somers 	FILE *pipefd = setup(fds, auclass);
317ae19b2efSAlan Somers 	const char *regex = "fstatfs.*return,failure : Bad file descriptor";
318ae19b2efSAlan Somers 	/* Failure reason: bad file descriptor */
319ae19b2efSAlan Somers 	ATF_REQUIRE_EQ(-1, fstatfs(-1, &statfsbuff));
320ae19b2efSAlan Somers 	check_audit(fds, regex, pipefd);
321ae19b2efSAlan Somers }
322ae19b2efSAlan Somers 
323ae19b2efSAlan Somers ATF_TC_CLEANUP(fstatfs_failure, tc)
324ae19b2efSAlan Somers {
325ae19b2efSAlan Somers 	cleanup();
326ae19b2efSAlan Somers }
327ae19b2efSAlan Somers 
328ae19b2efSAlan Somers 
329ae19b2efSAlan Somers ATF_TC_WITH_CLEANUP(getfsstat_success);
330ae19b2efSAlan Somers ATF_TC_HEAD(getfsstat_success, tc)
331ae19b2efSAlan Somers {
332ae19b2efSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
333ae19b2efSAlan Somers 					"getfsstat(2) call");
334ae19b2efSAlan Somers }
335ae19b2efSAlan Somers 
336ae19b2efSAlan Somers ATF_TC_BODY(getfsstat_success, tc)
337ae19b2efSAlan Somers {
338ae19b2efSAlan Somers 	pid = getpid();
339ae19b2efSAlan Somers 	snprintf(extregex, sizeof(extregex), "getfsstat.*%d.*success", pid);
340ae19b2efSAlan Somers 
341ae19b2efSAlan Somers 	FILE *pipefd = setup(fds, auclass);
342ae19b2efSAlan Somers 	ATF_REQUIRE(getfsstat(NULL, 0, MNT_NOWAIT) != -1);
343ae19b2efSAlan Somers 	check_audit(fds, extregex, pipefd);
344ae19b2efSAlan Somers }
345ae19b2efSAlan Somers 
346ae19b2efSAlan Somers ATF_TC_CLEANUP(getfsstat_success, tc)
347ae19b2efSAlan Somers {
348ae19b2efSAlan Somers 	cleanup();
349ae19b2efSAlan Somers }
350ae19b2efSAlan Somers 
351ae19b2efSAlan Somers 
352ae19b2efSAlan Somers ATF_TC_WITH_CLEANUP(getfsstat_failure);
353ae19b2efSAlan Somers ATF_TC_HEAD(getfsstat_failure, tc)
354ae19b2efSAlan Somers {
355ae19b2efSAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
356ae19b2efSAlan Somers 					"getfsstat(2) call");
357ae19b2efSAlan Somers }
358ae19b2efSAlan Somers 
359ae19b2efSAlan Somers ATF_TC_BODY(getfsstat_failure, tc)
360ae19b2efSAlan Somers {
361ae19b2efSAlan Somers 	const char *regex = "getfsstat.*return,failure : Invalid argument";
362ae19b2efSAlan Somers 	FILE *pipefd = setup(fds, auclass);
363ae19b2efSAlan Somers 	/* Failure reason: Invalid value for mode */
364ae19b2efSAlan Somers 	ATF_REQUIRE_EQ(-1, getfsstat(NULL, 0, -1));
365ae19b2efSAlan Somers 	check_audit(fds, regex, pipefd);
366ae19b2efSAlan Somers }
367ae19b2efSAlan Somers 
368ae19b2efSAlan Somers ATF_TC_CLEANUP(getfsstat_failure, tc)
369ae19b2efSAlan Somers {
370ae19b2efSAlan Somers 	cleanup();
371ae19b2efSAlan Somers }
372ae19b2efSAlan Somers 
373ae19b2efSAlan Somers 
374a56867b8SAlan Somers ATF_TC_WITH_CLEANUP(fhopen_success);
375a56867b8SAlan Somers ATF_TC_HEAD(fhopen_success, tc)
376a56867b8SAlan Somers {
377a56867b8SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
378a56867b8SAlan Somers 					"fhopen(2) call");
379a56867b8SAlan Somers }
380a56867b8SAlan Somers 
381a56867b8SAlan Somers ATF_TC_BODY(fhopen_success, tc)
382a56867b8SAlan Somers {
383a56867b8SAlan Somers 	pid = getpid();
384a56867b8SAlan Somers 	snprintf(extregex, sizeof(extregex), "fhopen.*%d.*return,success", pid);
385a56867b8SAlan Somers 
386a56867b8SAlan Somers 	/* File needs to exist to get a file-handle */
387a56867b8SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
388a56867b8SAlan Somers 	/* Get the file handle to be passed to fhopen(2) */
389a56867b8SAlan Somers 	ATF_REQUIRE_EQ(0, getfh(path, &fht));
390a56867b8SAlan Somers 
391a56867b8SAlan Somers 	FILE *pipefd = setup(fds, auclass);
392a56867b8SAlan Somers 	ATF_REQUIRE((fhdesc = fhopen(&fht, O_RDWR)) != -1);
393a56867b8SAlan Somers 	check_audit(fds, extregex, pipefd);
394a56867b8SAlan Somers 
395a56867b8SAlan Somers 	close(fhdesc);
396a56867b8SAlan Somers 	close(filedesc);
397a56867b8SAlan Somers }
398a56867b8SAlan Somers 
399a56867b8SAlan Somers ATF_TC_CLEANUP(fhopen_success, tc)
400a56867b8SAlan Somers {
401a56867b8SAlan Somers 	cleanup();
402a56867b8SAlan Somers }
403a56867b8SAlan Somers 
404a56867b8SAlan Somers 
405a56867b8SAlan Somers ATF_TC_WITH_CLEANUP(fhopen_failure);
406a56867b8SAlan Somers ATF_TC_HEAD(fhopen_failure, tc)
407a56867b8SAlan Somers {
408a56867b8SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
409a56867b8SAlan Somers 					"fhopen(2) call");
410a56867b8SAlan Somers }
411a56867b8SAlan Somers 
412a56867b8SAlan Somers ATF_TC_BODY(fhopen_failure, tc)
413a56867b8SAlan Somers {
414a56867b8SAlan Somers 	const char *regex = "fhopen.*return,failure : Invalid argument";
415a56867b8SAlan Somers 	FILE *pipefd = setup(fds, auclass);
416a56867b8SAlan Somers 	/*
417a56867b8SAlan Somers 	 * Failure reason: NULL does not represent any file handle
418a56867b8SAlan Somers 	 * and O_CREAT is not allowed as the flag for fhopen(2)
419a56867b8SAlan Somers 	 */
420a56867b8SAlan Somers 	ATF_REQUIRE_EQ(-1, fhopen(NULL, O_CREAT));
421a56867b8SAlan Somers 	check_audit(fds, regex, pipefd);
422a56867b8SAlan Somers }
423a56867b8SAlan Somers 
424a56867b8SAlan Somers ATF_TC_CLEANUP(fhopen_failure, tc)
425a56867b8SAlan Somers {
426a56867b8SAlan Somers 	cleanup();
427a56867b8SAlan Somers }
428a56867b8SAlan Somers 
429a56867b8SAlan Somers 
430a56867b8SAlan Somers ATF_TC_WITH_CLEANUP(fhstat_success);
431a56867b8SAlan Somers ATF_TC_HEAD(fhstat_success, tc)
432a56867b8SAlan Somers {
433a56867b8SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
434a56867b8SAlan Somers 					"fstat(2) call");
435a56867b8SAlan Somers }
436a56867b8SAlan Somers 
437a56867b8SAlan Somers ATF_TC_BODY(fhstat_success, tc)
438a56867b8SAlan Somers {
439a56867b8SAlan Somers 	pid = getpid();
440a56867b8SAlan Somers 	snprintf(extregex, sizeof(extregex), "fhstat.*%d.*return,success", pid);
441a56867b8SAlan Somers 
442a56867b8SAlan Somers 	/* File needs to exist to get a file-handle */
443a56867b8SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
444a56867b8SAlan Somers 	/* Get the file handle to be passed to fhstat(2) */
445a56867b8SAlan Somers 	ATF_REQUIRE_EQ(0, getfh(path, &fht));
446a56867b8SAlan Somers 
447a56867b8SAlan Somers 	FILE *pipefd = setup(fds, auclass);
448a56867b8SAlan Somers 	ATF_REQUIRE_EQ(0, fhstat(&fht, &statbuff));
449a56867b8SAlan Somers 	check_audit(fds, extregex, pipefd);
450a56867b8SAlan Somers 	close(filedesc);
451a56867b8SAlan Somers }
452a56867b8SAlan Somers 
453a56867b8SAlan Somers ATF_TC_CLEANUP(fhstat_success, tc)
454a56867b8SAlan Somers {
455a56867b8SAlan Somers 	cleanup();
456a56867b8SAlan Somers }
457a56867b8SAlan Somers 
458a56867b8SAlan Somers 
459a56867b8SAlan Somers ATF_TC_WITH_CLEANUP(fhstat_failure);
460a56867b8SAlan Somers ATF_TC_HEAD(fhstat_failure, tc)
461a56867b8SAlan Somers {
462a56867b8SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
463a56867b8SAlan Somers 					"fhstat(2) call");
464a56867b8SAlan Somers }
465a56867b8SAlan Somers 
466a56867b8SAlan Somers ATF_TC_BODY(fhstat_failure, tc)
467a56867b8SAlan Somers {
468a56867b8SAlan Somers 	const char *regex = "fhstat.*return,failure : Bad address";
469a56867b8SAlan Somers 	FILE *pipefd = setup(fds, auclass);
470a56867b8SAlan Somers 	/* Failure reason: NULL does not represent any file handle */
471a56867b8SAlan Somers 	ATF_REQUIRE_EQ(-1, fhstat(NULL, NULL));
472a56867b8SAlan Somers 	check_audit(fds, regex, pipefd);
473a56867b8SAlan Somers }
474a56867b8SAlan Somers 
475a56867b8SAlan Somers ATF_TC_CLEANUP(fhstat_failure, tc)
476a56867b8SAlan Somers {
477a56867b8SAlan Somers 	cleanup();
478a56867b8SAlan Somers }
479a56867b8SAlan Somers 
480a56867b8SAlan Somers 
481a56867b8SAlan Somers ATF_TC_WITH_CLEANUP(fhstatfs_success);
482a56867b8SAlan Somers ATF_TC_HEAD(fhstatfs_success, tc)
483a56867b8SAlan Somers {
484a56867b8SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
485a56867b8SAlan Somers 					"fstatfs(2) call");
486a56867b8SAlan Somers }
487a56867b8SAlan Somers 
488a56867b8SAlan Somers ATF_TC_BODY(fhstatfs_success, tc)
489a56867b8SAlan Somers {
490a56867b8SAlan Somers 	pid = getpid();
491a56867b8SAlan Somers 	snprintf(extregex, sizeof(extregex), "fhstatfs.*%d.*success", pid);
492a56867b8SAlan Somers 
493a56867b8SAlan Somers 	/* File needs to exist to get a file-handle */
494a56867b8SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
495a56867b8SAlan Somers 	/* Get the file handle to be passed to fhstatfs(2) */
496a56867b8SAlan Somers 	ATF_REQUIRE_EQ(0, getfh(path, &fht));
497a56867b8SAlan Somers 
498a56867b8SAlan Somers 	FILE *pipefd = setup(fds, auclass);
499a56867b8SAlan Somers 	ATF_REQUIRE_EQ(0, fhstatfs(&fht, &statfsbuff));
500a56867b8SAlan Somers 	check_audit(fds, extregex, pipefd);
501a56867b8SAlan Somers 	close(filedesc);
502a56867b8SAlan Somers }
503a56867b8SAlan Somers 
504a56867b8SAlan Somers ATF_TC_CLEANUP(fhstatfs_success, tc)
505a56867b8SAlan Somers {
506a56867b8SAlan Somers 	cleanup();
507a56867b8SAlan Somers }
508a56867b8SAlan Somers 
509a56867b8SAlan Somers 
510a56867b8SAlan Somers ATF_TC_WITH_CLEANUP(fhstatfs_failure);
511a56867b8SAlan Somers ATF_TC_HEAD(fhstatfs_failure, tc)
512a56867b8SAlan Somers {
513a56867b8SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
514a56867b8SAlan Somers 					"fhstatfs(2) call");
515a56867b8SAlan Somers }
516a56867b8SAlan Somers 
517a56867b8SAlan Somers ATF_TC_BODY(fhstatfs_failure, tc)
518a56867b8SAlan Somers {
519a56867b8SAlan Somers 	const char *regex = "fhstatfs.*return,failure : Bad address";
520a56867b8SAlan Somers 	FILE *pipefd = setup(fds, auclass);
521a56867b8SAlan Somers 	/* Failure reason: NULL does not represent any file handle */
522a56867b8SAlan Somers 	ATF_REQUIRE_EQ(-1, fhstatfs(NULL, NULL));
523a56867b8SAlan Somers 	check_audit(fds, regex, pipefd);
524a56867b8SAlan Somers }
525a56867b8SAlan Somers 
526a56867b8SAlan Somers ATF_TC_CLEANUP(fhstatfs_failure, tc)
527a56867b8SAlan Somers {
528a56867b8SAlan Somers 	cleanup();
529a56867b8SAlan Somers }
530a56867b8SAlan Somers 
531a56867b8SAlan Somers 
53228845213SAlan Somers ATF_TC_WITH_CLEANUP(access_success);
53328845213SAlan Somers ATF_TC_HEAD(access_success, tc)
53428845213SAlan Somers {
53528845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
53628845213SAlan Somers 					"access(2) call");
53728845213SAlan Somers }
53828845213SAlan Somers 
53928845213SAlan Somers ATF_TC_BODY(access_success, tc)
54028845213SAlan Somers {
54128845213SAlan Somers 	/* File needs to exist to call access(2) */
54228845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
54328845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
54428845213SAlan Somers 	ATF_REQUIRE_EQ(0, access(path, F_OK));
54528845213SAlan Somers 	check_audit(fds, successreg, pipefd);
54628845213SAlan Somers 	close(filedesc);
54728845213SAlan Somers }
54828845213SAlan Somers 
54928845213SAlan Somers ATF_TC_CLEANUP(access_success, tc)
55028845213SAlan Somers {
55128845213SAlan Somers 	cleanup();
55228845213SAlan Somers }
55328845213SAlan Somers 
55428845213SAlan Somers 
55528845213SAlan Somers ATF_TC_WITH_CLEANUP(access_failure);
55628845213SAlan Somers ATF_TC_HEAD(access_failure, tc)
55728845213SAlan Somers {
55828845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
55928845213SAlan Somers 					"access(2) call");
56028845213SAlan Somers }
56128845213SAlan Somers 
56228845213SAlan Somers ATF_TC_BODY(access_failure, tc)
56328845213SAlan Somers {
56428845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
56528845213SAlan Somers 	/* Failure reason: file does not exist */
56628845213SAlan Somers 	ATF_REQUIRE_EQ(-1, access(errpath, F_OK));
56728845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
56828845213SAlan Somers }
56928845213SAlan Somers 
57028845213SAlan Somers ATF_TC_CLEANUP(access_failure, tc)
57128845213SAlan Somers {
57228845213SAlan Somers 	cleanup();
57328845213SAlan Somers }
57428845213SAlan Somers 
57528845213SAlan Somers 
57628845213SAlan Somers ATF_TC_WITH_CLEANUP(eaccess_success);
57728845213SAlan Somers ATF_TC_HEAD(eaccess_success, tc)
57828845213SAlan Somers {
57928845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
58028845213SAlan Somers 					"eaccess(2) call");
58128845213SAlan Somers }
58228845213SAlan Somers 
58328845213SAlan Somers ATF_TC_BODY(eaccess_success, tc)
58428845213SAlan Somers {
58528845213SAlan Somers 	/* File needs to exist to call eaccess(2) */
58628845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
58728845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
58828845213SAlan Somers 	ATF_REQUIRE_EQ(0, eaccess(path, F_OK));
58928845213SAlan Somers 	check_audit(fds, successreg, pipefd);
59028845213SAlan Somers 	close(filedesc);
59128845213SAlan Somers }
59228845213SAlan Somers 
59328845213SAlan Somers ATF_TC_CLEANUP(eaccess_success, tc)
59428845213SAlan Somers {
59528845213SAlan Somers 	cleanup();
59628845213SAlan Somers }
59728845213SAlan Somers 
59828845213SAlan Somers 
59928845213SAlan Somers ATF_TC_WITH_CLEANUP(eaccess_failure);
60028845213SAlan Somers ATF_TC_HEAD(eaccess_failure, tc)
60128845213SAlan Somers {
60228845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
60328845213SAlan Somers 					"eaccess(2) call");
60428845213SAlan Somers }
60528845213SAlan Somers 
60628845213SAlan Somers ATF_TC_BODY(eaccess_failure, tc)
60728845213SAlan Somers {
60828845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
60928845213SAlan Somers 	/* Failure reason: file does not exist */
61028845213SAlan Somers 	ATF_REQUIRE_EQ(-1, eaccess(errpath, F_OK));
61128845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
61228845213SAlan Somers }
61328845213SAlan Somers 
61428845213SAlan Somers ATF_TC_CLEANUP(eaccess_failure, tc)
61528845213SAlan Somers {
61628845213SAlan Somers 	cleanup();
61728845213SAlan Somers }
61828845213SAlan Somers 
61928845213SAlan Somers 
62028845213SAlan Somers ATF_TC_WITH_CLEANUP(faccessat_success);
62128845213SAlan Somers ATF_TC_HEAD(faccessat_success, tc)
62228845213SAlan Somers {
62328845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
62428845213SAlan Somers 					"faccessat(2) call");
62528845213SAlan Somers }
62628845213SAlan Somers 
62728845213SAlan Somers ATF_TC_BODY(faccessat_success, tc)
62828845213SAlan Somers {
62928845213SAlan Somers 	/* File needs to exist to call faccessat(2) */
63028845213SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
63128845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
63228845213SAlan Somers 	ATF_REQUIRE_EQ(0, faccessat(AT_FDCWD, path, F_OK, AT_EACCESS));
63328845213SAlan Somers 	check_audit(fds, successreg, pipefd);
63428845213SAlan Somers 	close(filedesc);
63528845213SAlan Somers }
63628845213SAlan Somers 
63728845213SAlan Somers ATF_TC_CLEANUP(faccessat_success, tc)
63828845213SAlan Somers {
63928845213SAlan Somers 	cleanup();
64028845213SAlan Somers }
64128845213SAlan Somers 
64228845213SAlan Somers 
64328845213SAlan Somers ATF_TC_WITH_CLEANUP(faccessat_failure);
64428845213SAlan Somers ATF_TC_HEAD(faccessat_failure, tc)
64528845213SAlan Somers {
64628845213SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
64728845213SAlan Somers 					"faccessat(2) call");
64828845213SAlan Somers }
64928845213SAlan Somers 
65028845213SAlan Somers ATF_TC_BODY(faccessat_failure, tc)
65128845213SAlan Somers {
65228845213SAlan Somers 	FILE *pipefd = setup(fds, auclass);
65328845213SAlan Somers 	/* Failure reason: file does not exist */
65428845213SAlan Somers 	ATF_REQUIRE_EQ(-1, faccessat(AT_FDCWD, errpath, F_OK, AT_EACCESS));
65528845213SAlan Somers 	check_audit(fds, failurereg, pipefd);
65628845213SAlan Somers }
65728845213SAlan Somers 
65828845213SAlan Somers ATF_TC_CLEANUP(faccessat_failure, tc)
65928845213SAlan Somers {
66028845213SAlan Somers 	cleanup();
66128845213SAlan Somers }
66228845213SAlan Somers 
66328845213SAlan Somers 
664*2c347e63SAlan Somers ATF_TC_WITH_CLEANUP(pathconf_success);
665*2c347e63SAlan Somers ATF_TC_HEAD(pathconf_success, tc)
666*2c347e63SAlan Somers {
667*2c347e63SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
668*2c347e63SAlan Somers 					"pathconf(2) call");
669*2c347e63SAlan Somers }
670*2c347e63SAlan Somers 
671*2c347e63SAlan Somers ATF_TC_BODY(pathconf_success, tc)
672*2c347e63SAlan Somers {
673*2c347e63SAlan Somers 	/* File needs to exist to call pathconf(2) */
674*2c347e63SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
675*2c347e63SAlan Somers 	FILE *pipefd = setup(fds, auclass);
676*2c347e63SAlan Somers 	/* Get the maximum number of bytes of filename */
677*2c347e63SAlan Somers 	ATF_REQUIRE(pathconf(path, _PC_NAME_MAX) != -1);
678*2c347e63SAlan Somers 	check_audit(fds, successreg, pipefd);
679*2c347e63SAlan Somers 	close(filedesc);
680*2c347e63SAlan Somers }
681*2c347e63SAlan Somers 
682*2c347e63SAlan Somers ATF_TC_CLEANUP(pathconf_success, tc)
683*2c347e63SAlan Somers {
684*2c347e63SAlan Somers 	cleanup();
685*2c347e63SAlan Somers }
686*2c347e63SAlan Somers 
687*2c347e63SAlan Somers 
688*2c347e63SAlan Somers ATF_TC_WITH_CLEANUP(pathconf_failure);
689*2c347e63SAlan Somers ATF_TC_HEAD(pathconf_failure, tc)
690*2c347e63SAlan Somers {
691*2c347e63SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
692*2c347e63SAlan Somers 					"pathconf(2) call");
693*2c347e63SAlan Somers }
694*2c347e63SAlan Somers 
695*2c347e63SAlan Somers ATF_TC_BODY(pathconf_failure, tc)
696*2c347e63SAlan Somers {
697*2c347e63SAlan Somers 	FILE *pipefd = setup(fds, auclass);
698*2c347e63SAlan Somers 	/* Failure reason: file does not exist */
699*2c347e63SAlan Somers 	ATF_REQUIRE_EQ(-1, pathconf(errpath, _PC_NAME_MAX));
700*2c347e63SAlan Somers 	check_audit(fds, failurereg, pipefd);
701*2c347e63SAlan Somers }
702*2c347e63SAlan Somers 
703*2c347e63SAlan Somers ATF_TC_CLEANUP(pathconf_failure, tc)
704*2c347e63SAlan Somers {
705*2c347e63SAlan Somers 	cleanup();
706*2c347e63SAlan Somers }
707*2c347e63SAlan Somers 
708*2c347e63SAlan Somers 
709*2c347e63SAlan Somers ATF_TC_WITH_CLEANUP(lpathconf_success);
710*2c347e63SAlan Somers ATF_TC_HEAD(lpathconf_success, tc)
711*2c347e63SAlan Somers {
712*2c347e63SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
713*2c347e63SAlan Somers 					"lpathconf(2) call");
714*2c347e63SAlan Somers }
715*2c347e63SAlan Somers 
716*2c347e63SAlan Somers ATF_TC_BODY(lpathconf_success, tc)
717*2c347e63SAlan Somers {
718*2c347e63SAlan Somers 	/* Symbolic link needs to exist to call lpathconf(2) */
719*2c347e63SAlan Somers 	ATF_REQUIRE_EQ(0, symlink("symlink", path));
720*2c347e63SAlan Somers 	FILE *pipefd = setup(fds, auclass);
721*2c347e63SAlan Somers 	/* Get the maximum number of bytes of symlink's name */
722*2c347e63SAlan Somers 	ATF_REQUIRE(lpathconf(path, _PC_SYMLINK_MAX) != -1);
723*2c347e63SAlan Somers 	check_audit(fds, successreg, pipefd);
724*2c347e63SAlan Somers }
725*2c347e63SAlan Somers 
726*2c347e63SAlan Somers ATF_TC_CLEANUP(lpathconf_success, tc)
727*2c347e63SAlan Somers {
728*2c347e63SAlan Somers 	cleanup();
729*2c347e63SAlan Somers }
730*2c347e63SAlan Somers 
731*2c347e63SAlan Somers 
732*2c347e63SAlan Somers ATF_TC_WITH_CLEANUP(lpathconf_failure);
733*2c347e63SAlan Somers ATF_TC_HEAD(lpathconf_failure, tc)
734*2c347e63SAlan Somers {
735*2c347e63SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
736*2c347e63SAlan Somers 					"lpathconf(2) call");
737*2c347e63SAlan Somers }
738*2c347e63SAlan Somers 
739*2c347e63SAlan Somers ATF_TC_BODY(lpathconf_failure, tc)
740*2c347e63SAlan Somers {
741*2c347e63SAlan Somers 	FILE *pipefd = setup(fds, auclass);
742*2c347e63SAlan Somers 	/* Failure reason: symbolic link does not exist */
743*2c347e63SAlan Somers 	ATF_REQUIRE_EQ(-1, lpathconf(errpath, _PC_SYMLINK_MAX));
744*2c347e63SAlan Somers 	check_audit(fds, failurereg, pipefd);
745*2c347e63SAlan Somers }
746*2c347e63SAlan Somers 
747*2c347e63SAlan Somers ATF_TC_CLEANUP(lpathconf_failure, tc)
748*2c347e63SAlan Somers {
749*2c347e63SAlan Somers 	cleanup();
750*2c347e63SAlan Somers }
751*2c347e63SAlan Somers 
752*2c347e63SAlan Somers 
753*2c347e63SAlan Somers ATF_TC_WITH_CLEANUP(fpathconf_success);
754*2c347e63SAlan Somers ATF_TC_HEAD(fpathconf_success, tc)
755*2c347e63SAlan Somers {
756*2c347e63SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
757*2c347e63SAlan Somers 					"fpathconf(2) call");
758*2c347e63SAlan Somers }
759*2c347e63SAlan Somers 
760*2c347e63SAlan Somers ATF_TC_BODY(fpathconf_success, tc)
761*2c347e63SAlan Somers {
762*2c347e63SAlan Somers 	pid = getpid();
763*2c347e63SAlan Somers 	snprintf(extregex, sizeof(extregex), "fpathconf.*%d.*success", pid);
764*2c347e63SAlan Somers 
765*2c347e63SAlan Somers 	/* File needs to exist to call fpathconf(2) */
766*2c347e63SAlan Somers 	ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
767*2c347e63SAlan Somers 	FILE *pipefd = setup(fds, auclass);
768*2c347e63SAlan Somers 	/* Get the maximum number of bytes of filename */
769*2c347e63SAlan Somers 	ATF_REQUIRE(fpathconf(filedesc, _PC_NAME_MAX) != -1);
770*2c347e63SAlan Somers 	check_audit(fds, extregex, pipefd);
771*2c347e63SAlan Somers 	close(filedesc);
772*2c347e63SAlan Somers }
773*2c347e63SAlan Somers 
774*2c347e63SAlan Somers ATF_TC_CLEANUP(fpathconf_success, tc)
775*2c347e63SAlan Somers {
776*2c347e63SAlan Somers 	cleanup();
777*2c347e63SAlan Somers }
778*2c347e63SAlan Somers 
779*2c347e63SAlan Somers 
780*2c347e63SAlan Somers ATF_TC_WITH_CLEANUP(fpathconf_failure);
781*2c347e63SAlan Somers ATF_TC_HEAD(fpathconf_failure, tc)
782*2c347e63SAlan Somers {
783*2c347e63SAlan Somers 	atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
784*2c347e63SAlan Somers 					"fpathconf(2) call");
785*2c347e63SAlan Somers }
786*2c347e63SAlan Somers 
787*2c347e63SAlan Somers ATF_TC_BODY(fpathconf_failure, tc)
788*2c347e63SAlan Somers {
789*2c347e63SAlan Somers 	FILE *pipefd = setup(fds, auclass);
790*2c347e63SAlan Somers 	const char *regex = "fpathconf.*return,failure : Bad file descriptor";
791*2c347e63SAlan Somers 	/* Failure reason: Bad file descriptor */
792*2c347e63SAlan Somers 	ATF_REQUIRE_EQ(-1, fpathconf(-1, _PC_NAME_MAX));
793*2c347e63SAlan Somers 	check_audit(fds, regex, pipefd);
794*2c347e63SAlan Somers }
795*2c347e63SAlan Somers 
796*2c347e63SAlan Somers ATF_TC_CLEANUP(fpathconf_failure, tc)
797*2c347e63SAlan Somers {
798*2c347e63SAlan Somers 	cleanup();
799*2c347e63SAlan Somers }
800*2c347e63SAlan Somers 
801*2c347e63SAlan Somers 
802f86d6517SAlan Somers ATF_TP_ADD_TCS(tp)
803f86d6517SAlan Somers {
804f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, stat_success);
805f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, stat_failure);
806f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, lstat_success);
807f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, lstat_failure);
808f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, fstat_success);
809f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, fstat_failure);
810f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, fstatat_success);
811f86d6517SAlan Somers 	ATF_TP_ADD_TC(tp, fstatat_failure);
812f86d6517SAlan Somers 
813ae19b2efSAlan Somers 	ATF_TP_ADD_TC(tp, statfs_success);
814ae19b2efSAlan Somers 	ATF_TP_ADD_TC(tp, statfs_failure);
815ae19b2efSAlan Somers 	ATF_TP_ADD_TC(tp, fstatfs_success);
816ae19b2efSAlan Somers 	ATF_TP_ADD_TC(tp, fstatfs_failure);
817ae19b2efSAlan Somers 
818ae19b2efSAlan Somers 	ATF_TP_ADD_TC(tp, getfsstat_success);
819ae19b2efSAlan Somers 	ATF_TP_ADD_TC(tp, getfsstat_failure);
820ae19b2efSAlan Somers 
821a56867b8SAlan Somers 	ATF_TP_ADD_TC(tp, fhopen_success);
822a56867b8SAlan Somers 	ATF_TP_ADD_TC(tp, fhopen_failure);
823a56867b8SAlan Somers 	ATF_TP_ADD_TC(tp, fhstat_success);
824a56867b8SAlan Somers 	ATF_TP_ADD_TC(tp, fhstat_failure);
825a56867b8SAlan Somers 	ATF_TP_ADD_TC(tp, fhstatfs_success);
826a56867b8SAlan Somers 	ATF_TP_ADD_TC(tp, fhstatfs_failure);
827a56867b8SAlan Somers 
82828845213SAlan Somers 	ATF_TP_ADD_TC(tp, access_success);
82928845213SAlan Somers 	ATF_TP_ADD_TC(tp, access_failure);
83028845213SAlan Somers 	ATF_TP_ADD_TC(tp, eaccess_success);
83128845213SAlan Somers 	ATF_TP_ADD_TC(tp, eaccess_failure);
83228845213SAlan Somers 	ATF_TP_ADD_TC(tp, faccessat_success);
83328845213SAlan Somers 	ATF_TP_ADD_TC(tp, faccessat_failure);
83428845213SAlan Somers 
835*2c347e63SAlan Somers 	ATF_TP_ADD_TC(tp, pathconf_success);
836*2c347e63SAlan Somers 	ATF_TP_ADD_TC(tp, pathconf_failure);
837*2c347e63SAlan Somers 	ATF_TP_ADD_TC(tp, lpathconf_success);
838*2c347e63SAlan Somers 	ATF_TP_ADD_TC(tp, lpathconf_failure);
839*2c347e63SAlan Somers 	ATF_TP_ADD_TC(tp, fpathconf_success);
840*2c347e63SAlan Somers 	ATF_TP_ADD_TC(tp, fpathconf_failure);
841*2c347e63SAlan Somers 
842f86d6517SAlan Somers 	return (atf_no_error());
843f86d6517SAlan Somers }
844