1f7f4e0f7SAlan Somers /*-
2f7f4e0f7SAlan Somers * Copyright 2018 Aniket Pandey
3f7f4e0f7SAlan Somers *
4f7f4e0f7SAlan Somers * Redistribution and use in source and binary forms, with or without
5f7f4e0f7SAlan Somers * modification, are permitted provided that the following conditions
6f7f4e0f7SAlan Somers * are met:
7f7f4e0f7SAlan Somers * 1. Redistributions of source code must retain the above copyright
8f7f4e0f7SAlan Somers * notice, this list of conditions and the following disclaimer.
9f7f4e0f7SAlan Somers * 2. Redistributions in binary form must reproduce the above copyright
10f7f4e0f7SAlan Somers * notice, this list of conditions and the following disclaimer in the
11f7f4e0f7SAlan Somers * documentation and/or other materials provided with the distribution.
12f7f4e0f7SAlan Somers *
13f7f4e0f7SAlan Somers * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14f7f4e0f7SAlan Somers * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15f7f4e0f7SAlan Somers * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16f7f4e0f7SAlan Somers * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17f7f4e0f7SAlan Somers * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18f7f4e0f7SAlan Somers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19f7f4e0f7SAlan Somers * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
20f7f4e0f7SAlan Somers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21f7f4e0f7SAlan Somers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22f7f4e0f7SAlan Somers * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23f7f4e0f7SAlan Somers * SUCH DAMAGE.
24f7f4e0f7SAlan Somers */
25f7f4e0f7SAlan Somers
26f7f4e0f7SAlan Somers #include <sys/types.h>
27f7f4e0f7SAlan Somers #include <sys/stat.h>
28f7f4e0f7SAlan Somers
29f7f4e0f7SAlan Somers #include <atf-c.h>
30f7f4e0f7SAlan Somers #include <fcntl.h>
31f7f4e0f7SAlan Somers #include <stdlib.h>
32f7f4e0f7SAlan Somers #include <unistd.h>
33f7f4e0f7SAlan Somers
34f7f4e0f7SAlan Somers #include "utils.h"
35f7f4e0f7SAlan Somers
36f7f4e0f7SAlan Somers static struct pollfd fds[1];
37f7f4e0f7SAlan Somers static mode_t mode = 0777;
38*b13a70d5SAlan Somers static int filedesc;
39f7f4e0f7SAlan Somers static dev_t dev = 0;
40f7f4e0f7SAlan Somers static const char *auclass = "fc";
41f7f4e0f7SAlan Somers static const char *path = "fileforaudit";
42f7f4e0f7SAlan Somers static const char *successreg = "fileforaudit.*return,success";
43f7f4e0f7SAlan Somers static const char *failurereg = "fileforaudit.*return,failure";
44f7f4e0f7SAlan Somers
45f7f4e0f7SAlan Somers
46f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(mkdir_success);
ATF_TC_HEAD(mkdir_success,tc)47f7f4e0f7SAlan Somers ATF_TC_HEAD(mkdir_success, tc)
48f7f4e0f7SAlan Somers {
49f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
50f7f4e0f7SAlan Somers "mkdir(2) call");
51f7f4e0f7SAlan Somers }
52f7f4e0f7SAlan Somers
ATF_TC_BODY(mkdir_success,tc)53f7f4e0f7SAlan Somers ATF_TC_BODY(mkdir_success, tc)
54f7f4e0f7SAlan Somers {
55f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
56f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, mkdir(path, mode));
57f7f4e0f7SAlan Somers check_audit(fds, successreg, pipefd);
58f7f4e0f7SAlan Somers }
59f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(mkdir_success,tc)60f7f4e0f7SAlan Somers ATF_TC_CLEANUP(mkdir_success, tc)
61f7f4e0f7SAlan Somers {
62f7f4e0f7SAlan Somers cleanup();
63f7f4e0f7SAlan Somers }
64f7f4e0f7SAlan Somers
65f7f4e0f7SAlan Somers
66f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(mkdir_failure);
ATF_TC_HEAD(mkdir_failure,tc)67f7f4e0f7SAlan Somers ATF_TC_HEAD(mkdir_failure, tc)
68f7f4e0f7SAlan Somers {
69f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
70f7f4e0f7SAlan Somers "mkdir(2) call");
71f7f4e0f7SAlan Somers }
72f7f4e0f7SAlan Somers
ATF_TC_BODY(mkdir_failure,tc)73f7f4e0f7SAlan Somers ATF_TC_BODY(mkdir_failure, tc)
74f7f4e0f7SAlan Somers {
75f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, mkdir(path, mode));
76f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
77f7f4e0f7SAlan Somers /* Failure reason: directory already exists */
78f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(-1, mkdir(path, mode));
79f7f4e0f7SAlan Somers check_audit(fds, failurereg, pipefd);
80f7f4e0f7SAlan Somers }
81f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(mkdir_failure,tc)82f7f4e0f7SAlan Somers ATF_TC_CLEANUP(mkdir_failure, tc)
83f7f4e0f7SAlan Somers {
84f7f4e0f7SAlan Somers cleanup();
85f7f4e0f7SAlan Somers }
86f7f4e0f7SAlan Somers
87f7f4e0f7SAlan Somers
88f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(mkdirat_success);
ATF_TC_HEAD(mkdirat_success,tc)89f7f4e0f7SAlan Somers ATF_TC_HEAD(mkdirat_success, tc)
90f7f4e0f7SAlan Somers {
91f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
92f7f4e0f7SAlan Somers "mkdirat(2) call");
93f7f4e0f7SAlan Somers }
94f7f4e0f7SAlan Somers
ATF_TC_BODY(mkdirat_success,tc)95f7f4e0f7SAlan Somers ATF_TC_BODY(mkdirat_success, tc)
96f7f4e0f7SAlan Somers {
97f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
98f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, mkdirat(AT_FDCWD, path, mode));
99f7f4e0f7SAlan Somers check_audit(fds, successreg, pipefd);
100f7f4e0f7SAlan Somers }
101f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(mkdirat_success,tc)102f7f4e0f7SAlan Somers ATF_TC_CLEANUP(mkdirat_success, tc)
103f7f4e0f7SAlan Somers {
104f7f4e0f7SAlan Somers cleanup();
105f7f4e0f7SAlan Somers }
106f7f4e0f7SAlan Somers
107f7f4e0f7SAlan Somers
108f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(mkdirat_failure);
ATF_TC_HEAD(mkdirat_failure,tc)109f7f4e0f7SAlan Somers ATF_TC_HEAD(mkdirat_failure, tc)
110f7f4e0f7SAlan Somers {
111f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
112f7f4e0f7SAlan Somers "mkdirat(2) call");
113f7f4e0f7SAlan Somers }
114f7f4e0f7SAlan Somers
ATF_TC_BODY(mkdirat_failure,tc)115f7f4e0f7SAlan Somers ATF_TC_BODY(mkdirat_failure, tc)
116f7f4e0f7SAlan Somers {
117f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, mkdirat(AT_FDCWD, path, mode));
118f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
119f7f4e0f7SAlan Somers /* Failure reason: directory already exists */
120f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(-1, mkdirat(AT_FDCWD, path, mode));
121f7f4e0f7SAlan Somers check_audit(fds, failurereg, pipefd);
122f7f4e0f7SAlan Somers }
123f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(mkdirat_failure,tc)124f7f4e0f7SAlan Somers ATF_TC_CLEANUP(mkdirat_failure, tc)
125f7f4e0f7SAlan Somers {
126f7f4e0f7SAlan Somers cleanup();
127f7f4e0f7SAlan Somers }
128f7f4e0f7SAlan Somers
129f7f4e0f7SAlan Somers
130f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(mkfifo_success);
ATF_TC_HEAD(mkfifo_success,tc)131f7f4e0f7SAlan Somers ATF_TC_HEAD(mkfifo_success, tc)
132f7f4e0f7SAlan Somers {
133f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
134f7f4e0f7SAlan Somers "mkfifo(2) call");
135f7f4e0f7SAlan Somers }
136f7f4e0f7SAlan Somers
ATF_TC_BODY(mkfifo_success,tc)137f7f4e0f7SAlan Somers ATF_TC_BODY(mkfifo_success, tc)
138f7f4e0f7SAlan Somers {
139f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
140f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, mkfifo(path, mode));
141f7f4e0f7SAlan Somers check_audit(fds, successreg, pipefd);
142f7f4e0f7SAlan Somers }
143f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(mkfifo_success,tc)144f7f4e0f7SAlan Somers ATF_TC_CLEANUP(mkfifo_success, tc)
145f7f4e0f7SAlan Somers {
146f7f4e0f7SAlan Somers cleanup();
147f7f4e0f7SAlan Somers }
148f7f4e0f7SAlan Somers
149f7f4e0f7SAlan Somers
150f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(mkfifo_failure);
ATF_TC_HEAD(mkfifo_failure,tc)151f7f4e0f7SAlan Somers ATF_TC_HEAD(mkfifo_failure, tc)
152f7f4e0f7SAlan Somers {
153f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
154f7f4e0f7SAlan Somers "mkfifo(2) call");
155f7f4e0f7SAlan Somers }
156f7f4e0f7SAlan Somers
ATF_TC_BODY(mkfifo_failure,tc)157f7f4e0f7SAlan Somers ATF_TC_BODY(mkfifo_failure, tc)
158f7f4e0f7SAlan Somers {
159f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, mkfifo(path, mode));
160f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
161f7f4e0f7SAlan Somers /* Failure reason: FIFO already exists */
162f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(-1, mkfifo(path, mode));
163f7f4e0f7SAlan Somers check_audit(fds, failurereg, pipefd);
164f7f4e0f7SAlan Somers }
165f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(mkfifo_failure,tc)166f7f4e0f7SAlan Somers ATF_TC_CLEANUP(mkfifo_failure, tc)
167f7f4e0f7SAlan Somers {
168f7f4e0f7SAlan Somers cleanup();
169f7f4e0f7SAlan Somers }
170f7f4e0f7SAlan Somers
171f7f4e0f7SAlan Somers
172f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(mkfifoat_success);
ATF_TC_HEAD(mkfifoat_success,tc)173f7f4e0f7SAlan Somers ATF_TC_HEAD(mkfifoat_success, tc)
174f7f4e0f7SAlan Somers {
175f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
176f7f4e0f7SAlan Somers "mkfifoat(2) call");
177f7f4e0f7SAlan Somers }
178f7f4e0f7SAlan Somers
ATF_TC_BODY(mkfifoat_success,tc)179f7f4e0f7SAlan Somers ATF_TC_BODY(mkfifoat_success, tc)
180f7f4e0f7SAlan Somers {
181f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
182f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, mkfifoat(AT_FDCWD, path, mode));
183f7f4e0f7SAlan Somers check_audit(fds, successreg, pipefd);
184f7f4e0f7SAlan Somers }
185f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(mkfifoat_success,tc)186f7f4e0f7SAlan Somers ATF_TC_CLEANUP(mkfifoat_success, tc)
187f7f4e0f7SAlan Somers {
188f7f4e0f7SAlan Somers cleanup();
189f7f4e0f7SAlan Somers }
190f7f4e0f7SAlan Somers
191f7f4e0f7SAlan Somers
192f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(mkfifoat_failure);
ATF_TC_HEAD(mkfifoat_failure,tc)193f7f4e0f7SAlan Somers ATF_TC_HEAD(mkfifoat_failure, tc)
194f7f4e0f7SAlan Somers {
195f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
196f7f4e0f7SAlan Somers "mkfifoat(2) call");
197f7f4e0f7SAlan Somers }
198f7f4e0f7SAlan Somers
ATF_TC_BODY(mkfifoat_failure,tc)199f7f4e0f7SAlan Somers ATF_TC_BODY(mkfifoat_failure, tc)
200f7f4e0f7SAlan Somers {
201f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, mkfifoat(AT_FDCWD, path, mode));
202f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
203f7f4e0f7SAlan Somers /* Failure reason: FIFO already exists */
204f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(-1, mkfifoat(AT_FDCWD, path, mode));
205f7f4e0f7SAlan Somers check_audit(fds, failurereg, pipefd);
206f7f4e0f7SAlan Somers }
207f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(mkfifoat_failure,tc)208f7f4e0f7SAlan Somers ATF_TC_CLEANUP(mkfifoat_failure, tc)
209f7f4e0f7SAlan Somers {
210f7f4e0f7SAlan Somers cleanup();
211f7f4e0f7SAlan Somers }
212f7f4e0f7SAlan Somers
213f7f4e0f7SAlan Somers
214f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(mknod_success);
ATF_TC_HEAD(mknod_success,tc)215f7f4e0f7SAlan Somers ATF_TC_HEAD(mknod_success, tc)
216f7f4e0f7SAlan Somers {
217f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
218f7f4e0f7SAlan Somers "mknod(2) call");
219f7f4e0f7SAlan Somers }
220f7f4e0f7SAlan Somers
ATF_TC_BODY(mknod_success,tc)221f7f4e0f7SAlan Somers ATF_TC_BODY(mknod_success, tc)
222f7f4e0f7SAlan Somers {
223f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
224f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, mknod(path, S_IFIFO | S_IRWXO, dev));
225f7f4e0f7SAlan Somers check_audit(fds, successreg, pipefd);
226f7f4e0f7SAlan Somers }
227f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(mknod_success,tc)228f7f4e0f7SAlan Somers ATF_TC_CLEANUP(mknod_success, tc)
229f7f4e0f7SAlan Somers {
230f7f4e0f7SAlan Somers cleanup();
231f7f4e0f7SAlan Somers }
232f7f4e0f7SAlan Somers
233f7f4e0f7SAlan Somers
234f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(mknod_failure);
ATF_TC_HEAD(mknod_failure,tc)235f7f4e0f7SAlan Somers ATF_TC_HEAD(mknod_failure, tc)
236f7f4e0f7SAlan Somers {
237f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
238f7f4e0f7SAlan Somers "mknod(2) call");
239f7f4e0f7SAlan Somers }
240f7f4e0f7SAlan Somers
ATF_TC_BODY(mknod_failure,tc)241f7f4e0f7SAlan Somers ATF_TC_BODY(mknod_failure, tc)
242f7f4e0f7SAlan Somers {
243f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, mknod(path, S_IFIFO | S_IRWXO, dev));
244f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
245f7f4e0f7SAlan Somers /* Failure reason: FIFO node already exists */
246f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(-1, mknod(path, S_IFIFO | S_IRWXO, dev));
247f7f4e0f7SAlan Somers check_audit(fds, failurereg, pipefd);
248f7f4e0f7SAlan Somers }
249f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(mknod_failure,tc)250f7f4e0f7SAlan Somers ATF_TC_CLEANUP(mknod_failure, tc)
251f7f4e0f7SAlan Somers {
252f7f4e0f7SAlan Somers cleanup();
253f7f4e0f7SAlan Somers }
254f7f4e0f7SAlan Somers
255f7f4e0f7SAlan Somers
256f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(mknodat_success);
ATF_TC_HEAD(mknodat_success,tc)257f7f4e0f7SAlan Somers ATF_TC_HEAD(mknodat_success, tc)
258f7f4e0f7SAlan Somers {
259f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
260f7f4e0f7SAlan Somers "mknodat(2) call");
261f7f4e0f7SAlan Somers }
262f7f4e0f7SAlan Somers
ATF_TC_BODY(mknodat_success,tc)263f7f4e0f7SAlan Somers ATF_TC_BODY(mknodat_success, tc)
264f7f4e0f7SAlan Somers {
265f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
266f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, mknodat(AT_FDCWD, path, S_IFIFO | S_IRWXO, dev));
267f7f4e0f7SAlan Somers check_audit(fds, successreg, pipefd);
268f7f4e0f7SAlan Somers }
269f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(mknodat_success,tc)270f7f4e0f7SAlan Somers ATF_TC_CLEANUP(mknodat_success, tc)
271f7f4e0f7SAlan Somers {
272f7f4e0f7SAlan Somers cleanup();
273f7f4e0f7SAlan Somers }
274f7f4e0f7SAlan Somers
275f7f4e0f7SAlan Somers
276f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(mknodat_failure);
ATF_TC_HEAD(mknodat_failure,tc)277f7f4e0f7SAlan Somers ATF_TC_HEAD(mknodat_failure, tc)
278f7f4e0f7SAlan Somers {
279f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
280f7f4e0f7SAlan Somers "mknodat(2) call");
281f7f4e0f7SAlan Somers }
282f7f4e0f7SAlan Somers
ATF_TC_BODY(mknodat_failure,tc)283f7f4e0f7SAlan Somers ATF_TC_BODY(mknodat_failure, tc)
284f7f4e0f7SAlan Somers {
285f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, mknodat(AT_FDCWD, path, S_IFIFO | S_IRWXO, dev));
286f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
287f7f4e0f7SAlan Somers /* Failure reason: FIFO node already exists */
288f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(-1, mknodat(AT_FDCWD, path, S_IFIFO | S_IRWXO, dev));
289f7f4e0f7SAlan Somers check_audit(fds, failurereg, pipefd);
290f7f4e0f7SAlan Somers }
291f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(mknodat_failure,tc)292f7f4e0f7SAlan Somers ATF_TC_CLEANUP(mknodat_failure, tc)
293f7f4e0f7SAlan Somers {
294f7f4e0f7SAlan Somers cleanup();
295f7f4e0f7SAlan Somers }
296f7f4e0f7SAlan Somers
297f7f4e0f7SAlan Somers
298f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(rename_success);
ATF_TC_HEAD(rename_success,tc)299f7f4e0f7SAlan Somers ATF_TC_HEAD(rename_success, tc)
300f7f4e0f7SAlan Somers {
301f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
302f7f4e0f7SAlan Somers "rename(2) call");
303f7f4e0f7SAlan Somers }
304f7f4e0f7SAlan Somers
ATF_TC_BODY(rename_success,tc)305f7f4e0f7SAlan Somers ATF_TC_BODY(rename_success, tc)
306f7f4e0f7SAlan Somers {
307*b13a70d5SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
308f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
309f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, rename(path, "renamed"));
310f7f4e0f7SAlan Somers check_audit(fds, successreg, pipefd);
311*b13a70d5SAlan Somers close(filedesc);
312f7f4e0f7SAlan Somers }
313f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(rename_success,tc)314f7f4e0f7SAlan Somers ATF_TC_CLEANUP(rename_success, tc)
315f7f4e0f7SAlan Somers {
316f7f4e0f7SAlan Somers cleanup();
317f7f4e0f7SAlan Somers }
318f7f4e0f7SAlan Somers
319f7f4e0f7SAlan Somers
320f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(rename_failure);
ATF_TC_HEAD(rename_failure,tc)321f7f4e0f7SAlan Somers ATF_TC_HEAD(rename_failure, tc)
322f7f4e0f7SAlan Somers {
323f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
324f7f4e0f7SAlan Somers "rename(2) call");
325f7f4e0f7SAlan Somers }
326f7f4e0f7SAlan Somers
ATF_TC_BODY(rename_failure,tc)327f7f4e0f7SAlan Somers ATF_TC_BODY(rename_failure, tc)
328f7f4e0f7SAlan Somers {
329f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
330f7f4e0f7SAlan Somers /* Failure reason: file does not exist */
331f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(-1, rename(path, "renamed"));
332f7f4e0f7SAlan Somers check_audit(fds, failurereg, pipefd);
333f7f4e0f7SAlan Somers }
334f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(rename_failure,tc)335f7f4e0f7SAlan Somers ATF_TC_CLEANUP(rename_failure, tc)
336f7f4e0f7SAlan Somers {
337f7f4e0f7SAlan Somers cleanup();
338f7f4e0f7SAlan Somers }
339f7f4e0f7SAlan Somers
340f7f4e0f7SAlan Somers
341f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(renameat_success);
ATF_TC_HEAD(renameat_success,tc)342f7f4e0f7SAlan Somers ATF_TC_HEAD(renameat_success, tc)
343f7f4e0f7SAlan Somers {
344f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
345f7f4e0f7SAlan Somers "renameat(2) call");
346f7f4e0f7SAlan Somers }
347f7f4e0f7SAlan Somers
ATF_TC_BODY(renameat_success,tc)348f7f4e0f7SAlan Somers ATF_TC_BODY(renameat_success, tc)
349f7f4e0f7SAlan Somers {
350*b13a70d5SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
351f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
352f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, renameat(AT_FDCWD, path, AT_FDCWD, "renamed"));
353f7f4e0f7SAlan Somers check_audit(fds, successreg, pipefd);
354*b13a70d5SAlan Somers close(filedesc);
355f7f4e0f7SAlan Somers }
356f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(renameat_success,tc)357f7f4e0f7SAlan Somers ATF_TC_CLEANUP(renameat_success, tc)
358f7f4e0f7SAlan Somers {
359f7f4e0f7SAlan Somers cleanup();
360f7f4e0f7SAlan Somers }
361f7f4e0f7SAlan Somers
362f7f4e0f7SAlan Somers
363f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(renameat_failure);
ATF_TC_HEAD(renameat_failure,tc)364f7f4e0f7SAlan Somers ATF_TC_HEAD(renameat_failure, tc)
365f7f4e0f7SAlan Somers {
366f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
367f7f4e0f7SAlan Somers "renameat(2) call");
368f7f4e0f7SAlan Somers }
369f7f4e0f7SAlan Somers
ATF_TC_BODY(renameat_failure,tc)370f7f4e0f7SAlan Somers ATF_TC_BODY(renameat_failure, tc)
371f7f4e0f7SAlan Somers {
372f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
373f7f4e0f7SAlan Somers /* Failure reason: file does not exist */
374f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(-1, renameat(AT_FDCWD, path, AT_FDCWD, "renamed"));
375f7f4e0f7SAlan Somers check_audit(fds, failurereg, pipefd);
376f7f4e0f7SAlan Somers }
377f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(renameat_failure,tc)378f7f4e0f7SAlan Somers ATF_TC_CLEANUP(renameat_failure, tc)
379f7f4e0f7SAlan Somers {
380f7f4e0f7SAlan Somers cleanup();
381f7f4e0f7SAlan Somers }
382f7f4e0f7SAlan Somers
383f7f4e0f7SAlan Somers
384f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(link_success);
ATF_TC_HEAD(link_success,tc)385f7f4e0f7SAlan Somers ATF_TC_HEAD(link_success, tc)
386f7f4e0f7SAlan Somers {
387f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
388f7f4e0f7SAlan Somers "link(2) call");
389f7f4e0f7SAlan Somers }
390f7f4e0f7SAlan Somers
ATF_TC_BODY(link_success,tc)391f7f4e0f7SAlan Somers ATF_TC_BODY(link_success, tc)
392f7f4e0f7SAlan Somers {
393*b13a70d5SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
394f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
395f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, link(path, "hardlink"));
396f7f4e0f7SAlan Somers check_audit(fds, successreg, pipefd);
397*b13a70d5SAlan Somers close(filedesc);
398f7f4e0f7SAlan Somers }
399f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(link_success,tc)400f7f4e0f7SAlan Somers ATF_TC_CLEANUP(link_success, tc)
401f7f4e0f7SAlan Somers {
402f7f4e0f7SAlan Somers cleanup();
403f7f4e0f7SAlan Somers }
404f7f4e0f7SAlan Somers
405f7f4e0f7SAlan Somers
406f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(link_failure);
ATF_TC_HEAD(link_failure,tc)407f7f4e0f7SAlan Somers ATF_TC_HEAD(link_failure, tc)
408f7f4e0f7SAlan Somers {
409f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
410f7f4e0f7SAlan Somers "link(2) call");
411f7f4e0f7SAlan Somers }
412f7f4e0f7SAlan Somers
ATF_TC_BODY(link_failure,tc)413f7f4e0f7SAlan Somers ATF_TC_BODY(link_failure, tc)
414f7f4e0f7SAlan Somers {
415f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
416f7f4e0f7SAlan Somers /* Failure reason: file does not exist */
417f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(-1, link(path, "hardlink"));
418f7f4e0f7SAlan Somers check_audit(fds, failurereg, pipefd);
419f7f4e0f7SAlan Somers }
420f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(link_failure,tc)421f7f4e0f7SAlan Somers ATF_TC_CLEANUP(link_failure, tc)
422f7f4e0f7SAlan Somers {
423f7f4e0f7SAlan Somers cleanup();
424f7f4e0f7SAlan Somers }
425f7f4e0f7SAlan Somers
426f7f4e0f7SAlan Somers
427f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(linkat_success);
ATF_TC_HEAD(linkat_success,tc)428f7f4e0f7SAlan Somers ATF_TC_HEAD(linkat_success, tc)
429f7f4e0f7SAlan Somers {
430f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
431f7f4e0f7SAlan Somers "linkat(2) call");
432f7f4e0f7SAlan Somers }
433f7f4e0f7SAlan Somers
ATF_TC_BODY(linkat_success,tc)434f7f4e0f7SAlan Somers ATF_TC_BODY(linkat_success, tc)
435f7f4e0f7SAlan Somers {
436*b13a70d5SAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
437f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
438f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, linkat(AT_FDCWD, path, AT_FDCWD, "hardlink", 0));
439f7f4e0f7SAlan Somers check_audit(fds, successreg, pipefd);
440*b13a70d5SAlan Somers close(filedesc);
441f7f4e0f7SAlan Somers }
442f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(linkat_success,tc)443f7f4e0f7SAlan Somers ATF_TC_CLEANUP(linkat_success, tc)
444f7f4e0f7SAlan Somers {
445f7f4e0f7SAlan Somers cleanup();
446f7f4e0f7SAlan Somers }
447f7f4e0f7SAlan Somers
448f7f4e0f7SAlan Somers
449f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(linkat_failure);
ATF_TC_HEAD(linkat_failure,tc)450f7f4e0f7SAlan Somers ATF_TC_HEAD(linkat_failure, tc)
451f7f4e0f7SAlan Somers {
452f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
453f7f4e0f7SAlan Somers "linkat(2) call");
454f7f4e0f7SAlan Somers }
455f7f4e0f7SAlan Somers
ATF_TC_BODY(linkat_failure,tc)456f7f4e0f7SAlan Somers ATF_TC_BODY(linkat_failure, tc)
457f7f4e0f7SAlan Somers {
458f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
459f7f4e0f7SAlan Somers /* Failure reason: file does not exist */
460f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(-1, linkat(AT_FDCWD, path, AT_FDCWD, "hardlink", 0));
461f7f4e0f7SAlan Somers check_audit(fds, failurereg, pipefd);
462f7f4e0f7SAlan Somers }
463f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(linkat_failure,tc)464f7f4e0f7SAlan Somers ATF_TC_CLEANUP(linkat_failure, tc)
465f7f4e0f7SAlan Somers {
466f7f4e0f7SAlan Somers cleanup();
467f7f4e0f7SAlan Somers }
468f7f4e0f7SAlan Somers
469f7f4e0f7SAlan Somers
470f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(symlink_success);
ATF_TC_HEAD(symlink_success,tc)471f7f4e0f7SAlan Somers ATF_TC_HEAD(symlink_success, tc)
472f7f4e0f7SAlan Somers {
473f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
474f7f4e0f7SAlan Somers "symlink(2) call");
475f7f4e0f7SAlan Somers }
476f7f4e0f7SAlan Somers
ATF_TC_BODY(symlink_success,tc)477f7f4e0f7SAlan Somers ATF_TC_BODY(symlink_success, tc)
478f7f4e0f7SAlan Somers {
479f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
480f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, symlink(path, "symlink"));
481f7f4e0f7SAlan Somers check_audit(fds, successreg, pipefd);
482f7f4e0f7SAlan Somers }
483f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(symlink_success,tc)484f7f4e0f7SAlan Somers ATF_TC_CLEANUP(symlink_success, tc)
485f7f4e0f7SAlan Somers {
486f7f4e0f7SAlan Somers cleanup();
487f7f4e0f7SAlan Somers }
488f7f4e0f7SAlan Somers
489f7f4e0f7SAlan Somers
490f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(symlink_failure);
ATF_TC_HEAD(symlink_failure,tc)491f7f4e0f7SAlan Somers ATF_TC_HEAD(symlink_failure, tc)
492f7f4e0f7SAlan Somers {
493f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
494f7f4e0f7SAlan Somers "symlink(2) call");
495f7f4e0f7SAlan Somers }
496f7f4e0f7SAlan Somers
ATF_TC_BODY(symlink_failure,tc)497f7f4e0f7SAlan Somers ATF_TC_BODY(symlink_failure, tc)
498f7f4e0f7SAlan Somers {
499f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, symlink(path, "symlink"));
500f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
501f7f4e0f7SAlan Somers /* Failure reason: symbolic link already exists */
502f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(-1, symlink(path, "symlink"));
503f7f4e0f7SAlan Somers check_audit(fds, failurereg, pipefd);
504f7f4e0f7SAlan Somers }
505f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(symlink_failure,tc)506f7f4e0f7SAlan Somers ATF_TC_CLEANUP(symlink_failure, tc)
507f7f4e0f7SAlan Somers {
508f7f4e0f7SAlan Somers cleanup();
509f7f4e0f7SAlan Somers }
510f7f4e0f7SAlan Somers
511f7f4e0f7SAlan Somers
512f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(symlinkat_success);
ATF_TC_HEAD(symlinkat_success,tc)513f7f4e0f7SAlan Somers ATF_TC_HEAD(symlinkat_success, tc)
514f7f4e0f7SAlan Somers {
515f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
516f7f4e0f7SAlan Somers "symlinkat(2) call");
517f7f4e0f7SAlan Somers }
518f7f4e0f7SAlan Somers
ATF_TC_BODY(symlinkat_success,tc)519f7f4e0f7SAlan Somers ATF_TC_BODY(symlinkat_success, tc)
520f7f4e0f7SAlan Somers {
521f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
522f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, symlinkat(path, AT_FDCWD, "symlink"));
523f7f4e0f7SAlan Somers check_audit(fds, successreg, pipefd);
524f7f4e0f7SAlan Somers }
525f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(symlinkat_success,tc)526f7f4e0f7SAlan Somers ATF_TC_CLEANUP(symlinkat_success, tc)
527f7f4e0f7SAlan Somers {
528f7f4e0f7SAlan Somers cleanup();
529f7f4e0f7SAlan Somers }
530f7f4e0f7SAlan Somers
531f7f4e0f7SAlan Somers
532f7f4e0f7SAlan Somers ATF_TC_WITH_CLEANUP(symlinkat_failure);
ATF_TC_HEAD(symlinkat_failure,tc)533f7f4e0f7SAlan Somers ATF_TC_HEAD(symlinkat_failure, tc)
534f7f4e0f7SAlan Somers {
535f7f4e0f7SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
536f7f4e0f7SAlan Somers "symlinkat(2) call");
537f7f4e0f7SAlan Somers }
538f7f4e0f7SAlan Somers
ATF_TC_BODY(symlinkat_failure,tc)539f7f4e0f7SAlan Somers ATF_TC_BODY(symlinkat_failure, tc)
540f7f4e0f7SAlan Somers {
541f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(0, symlinkat(path, AT_FDCWD, "symlink"));
542f7f4e0f7SAlan Somers FILE *pipefd = setup(fds, auclass);
543f7f4e0f7SAlan Somers /* Failure reason: symbolic link already exists */
544f7f4e0f7SAlan Somers ATF_REQUIRE_EQ(-1, symlinkat(path, AT_FDCWD, "symlink"));
545f7f4e0f7SAlan Somers check_audit(fds, failurereg, pipefd);
546f7f4e0f7SAlan Somers }
547f7f4e0f7SAlan Somers
ATF_TC_CLEANUP(symlinkat_failure,tc)548f7f4e0f7SAlan Somers ATF_TC_CLEANUP(symlinkat_failure, tc)
549f7f4e0f7SAlan Somers {
550f7f4e0f7SAlan Somers cleanup();
551f7f4e0f7SAlan Somers }
552f7f4e0f7SAlan Somers
553f7f4e0f7SAlan Somers
ATF_TP_ADD_TCS(tp)554f7f4e0f7SAlan Somers ATF_TP_ADD_TCS(tp)
555f7f4e0f7SAlan Somers {
556f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, mkdir_success);
557f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, mkdir_failure);
558f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, mkdirat_success);
559f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, mkdirat_failure);
560f7f4e0f7SAlan Somers
561f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, mkfifo_success);
562f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, mkfifo_failure);
563f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, mkfifoat_success);
564f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, mkfifoat_failure);
565f7f4e0f7SAlan Somers
566f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, mknod_success);
567f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, mknod_failure);
568f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, mknodat_success);
569f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, mknodat_failure);
570f7f4e0f7SAlan Somers
571f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, rename_success);
572f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, rename_failure);
573f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, renameat_success);
574f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, renameat_failure);
575f7f4e0f7SAlan Somers
576f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, link_success);
577f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, link_failure);
578f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, linkat_success);
579f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, linkat_failure);
580f7f4e0f7SAlan Somers
581f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, symlink_success);
582f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, symlink_failure);
583f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, symlinkat_success);
584f7f4e0f7SAlan Somers ATF_TP_ADD_TC(tp, symlinkat_failure);
585f7f4e0f7SAlan Somers
586f7f4e0f7SAlan Somers return (atf_no_error());
587f7f4e0f7SAlan Somers }
588