1ad2afa8cSAlan Somers /*-
2ad2afa8cSAlan Somers * Copyright (c) 2018 Aniket Pandey
3ad2afa8cSAlan Somers *
4ad2afa8cSAlan Somers * Redistribution and use in source and binary forms, with or without
5ad2afa8cSAlan Somers * modification, are permitted provided that the following conditions
6ad2afa8cSAlan Somers * are met:
7ad2afa8cSAlan Somers * 1. Redistributions of source code must retain the above copyright
8ad2afa8cSAlan Somers * notice, this list of conditions and the following disclaimer.
9ad2afa8cSAlan Somers * 2. Redistributions in binary form must reproduce the above copyright
10ad2afa8cSAlan Somers * notice, this list of conditions and the following disclaimer in the
11ad2afa8cSAlan Somers * documentation and/or other materials provided with the distribution.
12ad2afa8cSAlan Somers *
13ad2afa8cSAlan Somers * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14ad2afa8cSAlan Somers * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15ad2afa8cSAlan Somers * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16ad2afa8cSAlan Somers * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17ad2afa8cSAlan Somers * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18ad2afa8cSAlan Somers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19ad2afa8cSAlan Somers * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
20ad2afa8cSAlan Somers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21ad2afa8cSAlan Somers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22ad2afa8cSAlan Somers * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23ad2afa8cSAlan Somers * SUCH DAMAGE.
24ad2afa8cSAlan Somers */
25ad2afa8cSAlan Somers
26ad2afa8cSAlan Somers #include <sys/types.h>
27ad2afa8cSAlan Somers #include <sys/socket.h>
28b92435ccSAlan Somers #include <sys/stat.h>
29b92435ccSAlan Somers #include <sys/uio.h>
30babaf5cbSAlan Somers #include <sys/un.h>
31ad2afa8cSAlan Somers
32ad2afa8cSAlan Somers #include <atf-c.h>
33babaf5cbSAlan Somers #include <fcntl.h>
34ad2afa8cSAlan Somers #include <stdarg.h>
35b92435ccSAlan Somers #include <unistd.h>
36ad2afa8cSAlan Somers
37ad2afa8cSAlan Somers #include "utils.h"
38ad2afa8cSAlan Somers
39b92435ccSAlan Somers #define MAX_DATA 128
40babaf5cbSAlan Somers #define SERVER_PATH "server"
41babaf5cbSAlan Somers
42b92435ccSAlan Somers static pid_t pid;
43b92435ccSAlan Somers static mode_t mode = 0777;
44943f585cSAlan Somers static int sockfd, sockfd2, connectfd;
45943f585cSAlan Somers static ssize_t data_bytes;
46b92435ccSAlan Somers static socklen_t len = sizeof(struct sockaddr_un);
47b92435ccSAlan Somers static struct iovec io1, io2;
48ad2afa8cSAlan Somers static struct pollfd fds[1];
49943f585cSAlan Somers static struct sockaddr_un server;
50b92435ccSAlan Somers static struct msghdr sendbuf, recvbuf;
51b92435ccSAlan Somers static char extregex[MAX_DATA];
52943f585cSAlan Somers static char data[MAX_DATA];
53943f585cSAlan Somers static char msgbuff[MAX_DATA] = "This message does not exist";
54ad2afa8cSAlan Somers static const char *auclass = "nt";
55b92435ccSAlan Somers static const char *path = "fileforaudit";
56babaf5cbSAlan Somers static const char *nosupregex = "return,failure : Address family "
57ad2afa8cSAlan Somers "not supported by protocol family";
58b84a044bSAlan Somers static const char *invalregex = "return,failure : Bad file descriptor";
59ad2afa8cSAlan Somers
60ad2afa8cSAlan Somers /*
61b92435ccSAlan Somers * Initialize iovec structure to be used as a field of struct msghdr
62b92435ccSAlan Somers */
63b92435ccSAlan Somers static void
init_iov(struct iovec * io,char msgbuf[],int datalen)64b92435ccSAlan Somers init_iov(struct iovec *io, char msgbuf[], int datalen)
65b92435ccSAlan Somers {
66b92435ccSAlan Somers io->iov_base = msgbuf;
67b92435ccSAlan Somers io->iov_len = datalen;
68b92435ccSAlan Somers }
69b92435ccSAlan Somers
70b92435ccSAlan Somers /*
71b92435ccSAlan Somers * Initialize msghdr structure for communication via datagram sockets
72b92435ccSAlan Somers */
73b92435ccSAlan Somers static void
init_msghdr(struct msghdr * hdrbuf,struct iovec * io,struct sockaddr_un * addr)74b92435ccSAlan Somers init_msghdr(struct msghdr *hdrbuf, struct iovec *io, struct sockaddr_un *addr)
75b92435ccSAlan Somers {
76b92435ccSAlan Somers socklen_t length;
77b92435ccSAlan Somers
78b92435ccSAlan Somers bzero(hdrbuf, sizeof(*hdrbuf));
79b92435ccSAlan Somers length = (socklen_t)sizeof(struct sockaddr_un);
80b92435ccSAlan Somers hdrbuf->msg_name = addr;
81b92435ccSAlan Somers hdrbuf->msg_namelen = length;
82b92435ccSAlan Somers hdrbuf->msg_iov = io;
83b92435ccSAlan Somers hdrbuf->msg_iovlen = 1;
84b92435ccSAlan Somers }
85b92435ccSAlan Somers
86b92435ccSAlan Somers /*
87ad2afa8cSAlan Somers * Variadic function to close socket descriptors
88ad2afa8cSAlan Somers */
89ad2afa8cSAlan Somers static void
close_sockets(int count,...)90ad2afa8cSAlan Somers close_sockets(int count, ...)
91ad2afa8cSAlan Somers {
92ad2afa8cSAlan Somers int sockd;
93ad2afa8cSAlan Somers va_list socklist;
94ad2afa8cSAlan Somers va_start(socklist, count);
95ad2afa8cSAlan Somers for (sockd = 0; sockd < count; sockd++) {
96ad2afa8cSAlan Somers close(va_arg(socklist, int));
97ad2afa8cSAlan Somers }
98ad2afa8cSAlan Somers va_end(socklist);
99ad2afa8cSAlan Somers }
100ad2afa8cSAlan Somers
101babaf5cbSAlan Somers /*
102babaf5cbSAlan Somers * Assign local filesystem address to a Unix domain socket
103babaf5cbSAlan Somers */
104babaf5cbSAlan Somers static void
assign_address(struct sockaddr_un * serveraddr)105943f585cSAlan Somers assign_address(struct sockaddr_un *serveraddr)
106babaf5cbSAlan Somers {
107943f585cSAlan Somers memset(serveraddr, 0, sizeof(*serveraddr));
108943f585cSAlan Somers serveraddr->sun_family = AF_UNIX;
109943f585cSAlan Somers strcpy(serveraddr->sun_path, SERVER_PATH);
110babaf5cbSAlan Somers }
111babaf5cbSAlan Somers
112ad2afa8cSAlan Somers
113ad2afa8cSAlan Somers ATF_TC_WITH_CLEANUP(socket_success);
ATF_TC_HEAD(socket_success,tc)114ad2afa8cSAlan Somers ATF_TC_HEAD(socket_success, tc)
115ad2afa8cSAlan Somers {
116ad2afa8cSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
117ad2afa8cSAlan Somers "socket(2) call");
118ad2afa8cSAlan Somers }
119ad2afa8cSAlan Somers
ATF_TC_BODY(socket_success,tc)120ad2afa8cSAlan Somers ATF_TC_BODY(socket_success, tc)
121ad2afa8cSAlan Somers {
122ad2afa8cSAlan Somers FILE *pipefd = setup(fds, auclass);
123ad2afa8cSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
124ad2afa8cSAlan Somers /* Check the presence of sockfd in audit record */
125ad2afa8cSAlan Somers snprintf(extregex, sizeof(extregex), "socket.*ret.*success,%d", sockfd);
126ad2afa8cSAlan Somers check_audit(fds, extregex, pipefd);
127ad2afa8cSAlan Somers close(sockfd);
128ad2afa8cSAlan Somers }
129ad2afa8cSAlan Somers
ATF_TC_CLEANUP(socket_success,tc)130ad2afa8cSAlan Somers ATF_TC_CLEANUP(socket_success, tc)
131ad2afa8cSAlan Somers {
132ad2afa8cSAlan Somers cleanup();
133ad2afa8cSAlan Somers }
134ad2afa8cSAlan Somers
135ad2afa8cSAlan Somers
136ad2afa8cSAlan Somers ATF_TC_WITH_CLEANUP(socket_failure);
ATF_TC_HEAD(socket_failure,tc)137ad2afa8cSAlan Somers ATF_TC_HEAD(socket_failure, tc)
138ad2afa8cSAlan Somers {
139ad2afa8cSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
140ad2afa8cSAlan Somers "socket(2) call");
141ad2afa8cSAlan Somers }
142ad2afa8cSAlan Somers
ATF_TC_BODY(socket_failure,tc)143ad2afa8cSAlan Somers ATF_TC_BODY(socket_failure, tc)
144ad2afa8cSAlan Somers {
145babaf5cbSAlan Somers snprintf(extregex, sizeof(extregex), "socket.*%s", nosupregex);
146ad2afa8cSAlan Somers FILE *pipefd = setup(fds, auclass);
147ad2afa8cSAlan Somers /* Failure reason: Unsupported value of 'domain' argument: 0 */
148ad2afa8cSAlan Somers ATF_REQUIRE_EQ(-1, socket(0, SOCK_STREAM, 0));
149ad2afa8cSAlan Somers check_audit(fds, extregex, pipefd);
150ad2afa8cSAlan Somers }
151ad2afa8cSAlan Somers
ATF_TC_CLEANUP(socket_failure,tc)152ad2afa8cSAlan Somers ATF_TC_CLEANUP(socket_failure, tc)
153ad2afa8cSAlan Somers {
154ad2afa8cSAlan Somers cleanup();
155ad2afa8cSAlan Somers }
156ad2afa8cSAlan Somers
157ad2afa8cSAlan Somers
158ad2afa8cSAlan Somers ATF_TC_WITH_CLEANUP(socketpair_success);
ATF_TC_HEAD(socketpair_success,tc)159ad2afa8cSAlan Somers ATF_TC_HEAD(socketpair_success, tc)
160ad2afa8cSAlan Somers {
161ad2afa8cSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
162ad2afa8cSAlan Somers "socketpair(2) call");
163ad2afa8cSAlan Somers }
164ad2afa8cSAlan Somers
ATF_TC_BODY(socketpair_success,tc)165ad2afa8cSAlan Somers ATF_TC_BODY(socketpair_success, tc)
166ad2afa8cSAlan Somers {
167ad2afa8cSAlan Somers int sv[2];
168ad2afa8cSAlan Somers FILE *pipefd = setup(fds, auclass);
169ad2afa8cSAlan Somers ATF_REQUIRE_EQ(0, socketpair(PF_UNIX, SOCK_STREAM, 0, sv));
170ad2afa8cSAlan Somers
171ad2afa8cSAlan Somers /* Check for 0x0 (argument 3: default protocol) in the audit record */
172ad2afa8cSAlan Somers snprintf(extregex, sizeof(extregex), "socketpair.*0x0.*return,success");
173ad2afa8cSAlan Somers check_audit(fds, extregex, pipefd);
174ad2afa8cSAlan Somers close_sockets(2, sv[0], sv[1]);
175ad2afa8cSAlan Somers }
176ad2afa8cSAlan Somers
ATF_TC_CLEANUP(socketpair_success,tc)177ad2afa8cSAlan Somers ATF_TC_CLEANUP(socketpair_success, tc)
178ad2afa8cSAlan Somers {
179ad2afa8cSAlan Somers cleanup();
180ad2afa8cSAlan Somers }
181ad2afa8cSAlan Somers
182ad2afa8cSAlan Somers
183ad2afa8cSAlan Somers ATF_TC_WITH_CLEANUP(socketpair_failure);
ATF_TC_HEAD(socketpair_failure,tc)184ad2afa8cSAlan Somers ATF_TC_HEAD(socketpair_failure, tc)
185ad2afa8cSAlan Somers {
186ad2afa8cSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
187ad2afa8cSAlan Somers "socketpair(2) call");
188ad2afa8cSAlan Somers }
189ad2afa8cSAlan Somers
ATF_TC_BODY(socketpair_failure,tc)190ad2afa8cSAlan Somers ATF_TC_BODY(socketpair_failure, tc)
191ad2afa8cSAlan Somers {
192babaf5cbSAlan Somers snprintf(extregex, sizeof(extregex), "socketpair.*%s", nosupregex);
193ad2afa8cSAlan Somers FILE *pipefd = setup(fds, auclass);
194ad2afa8cSAlan Somers /* Failure reason: Unsupported value of 'domain' argument: 0 */
195ad2afa8cSAlan Somers ATF_REQUIRE_EQ(-1, socketpair(0, SOCK_STREAM, 0, NULL));
196ad2afa8cSAlan Somers check_audit(fds, extregex, pipefd);
197ad2afa8cSAlan Somers }
198ad2afa8cSAlan Somers
ATF_TC_CLEANUP(socketpair_failure,tc)199ad2afa8cSAlan Somers ATF_TC_CLEANUP(socketpair_failure, tc)
200ad2afa8cSAlan Somers {
201ad2afa8cSAlan Somers cleanup();
202ad2afa8cSAlan Somers }
203ad2afa8cSAlan Somers
204ad2afa8cSAlan Somers
205ad2afa8cSAlan Somers ATF_TC_WITH_CLEANUP(setsockopt_success);
ATF_TC_HEAD(setsockopt_success,tc)206ad2afa8cSAlan Somers ATF_TC_HEAD(setsockopt_success, tc)
207ad2afa8cSAlan Somers {
208ad2afa8cSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
209ad2afa8cSAlan Somers "setsockopt(2) call");
210ad2afa8cSAlan Somers }
211ad2afa8cSAlan Somers
ATF_TC_BODY(setsockopt_success,tc)212ad2afa8cSAlan Somers ATF_TC_BODY(setsockopt_success, tc)
213ad2afa8cSAlan Somers {
214ad2afa8cSAlan Somers int tr = 1;
215ad2afa8cSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
216ad2afa8cSAlan Somers /* Check the presence of sockfd in audit record */
217ad2afa8cSAlan Somers snprintf(extregex, sizeof(extregex),
218ad2afa8cSAlan Somers "setsockopt.*0x%x.*return,success", sockfd);
219ad2afa8cSAlan Somers
220ad2afa8cSAlan Somers FILE *pipefd = setup(fds, auclass);
221ad2afa8cSAlan Somers ATF_REQUIRE_EQ(0, setsockopt(sockfd, SOL_SOCKET,
222ad2afa8cSAlan Somers SO_REUSEADDR, &tr, sizeof(int)));
223ad2afa8cSAlan Somers check_audit(fds, extregex, pipefd);
224ad2afa8cSAlan Somers close(sockfd);
225ad2afa8cSAlan Somers }
226ad2afa8cSAlan Somers
ATF_TC_CLEANUP(setsockopt_success,tc)227ad2afa8cSAlan Somers ATF_TC_CLEANUP(setsockopt_success, tc)
228ad2afa8cSAlan Somers {
229ad2afa8cSAlan Somers cleanup();
230ad2afa8cSAlan Somers }
231ad2afa8cSAlan Somers
232ad2afa8cSAlan Somers
233ad2afa8cSAlan Somers ATF_TC_WITH_CLEANUP(setsockopt_failure);
ATF_TC_HEAD(setsockopt_failure,tc)234ad2afa8cSAlan Somers ATF_TC_HEAD(setsockopt_failure, tc)
235ad2afa8cSAlan Somers {
236ad2afa8cSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
237ad2afa8cSAlan Somers "setsockopt(2) call");
238ad2afa8cSAlan Somers }
239ad2afa8cSAlan Somers
ATF_TC_BODY(setsockopt_failure,tc)240ad2afa8cSAlan Somers ATF_TC_BODY(setsockopt_failure, tc)
241ad2afa8cSAlan Somers {
242babaf5cbSAlan Somers snprintf(extregex, sizeof(extregex), "setsockopt.*%s", invalregex);
243ad2afa8cSAlan Somers FILE *pipefd = setup(fds, auclass);
244babaf5cbSAlan Somers /* Failure reason: Invalid socket descriptor */
245943f585cSAlan Somers ATF_REQUIRE_EQ(-1, setsockopt(-1, SOL_SOCKET, 0, NULL, 0));
246babaf5cbSAlan Somers check_audit(fds, extregex, pipefd);
247ad2afa8cSAlan Somers }
248ad2afa8cSAlan Somers
ATF_TC_CLEANUP(setsockopt_failure,tc)249ad2afa8cSAlan Somers ATF_TC_CLEANUP(setsockopt_failure, tc)
250ad2afa8cSAlan Somers {
251ad2afa8cSAlan Somers cleanup();
252ad2afa8cSAlan Somers }
253ad2afa8cSAlan Somers
254ad2afa8cSAlan Somers
255babaf5cbSAlan Somers ATF_TC_WITH_CLEANUP(bind_success);
ATF_TC_HEAD(bind_success,tc)256babaf5cbSAlan Somers ATF_TC_HEAD(bind_success, tc)
257babaf5cbSAlan Somers {
258babaf5cbSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
259babaf5cbSAlan Somers "bind(2) call");
260babaf5cbSAlan Somers }
261babaf5cbSAlan Somers
ATF_TC_BODY(bind_success,tc)262babaf5cbSAlan Somers ATF_TC_BODY(bind_success, tc)
263babaf5cbSAlan Somers {
264babaf5cbSAlan Somers assign_address(&server);
265babaf5cbSAlan Somers /* Preliminary socket setup */
266babaf5cbSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
267babaf5cbSAlan Somers /* Check the presence of AF_UNIX address path in audit record */
268babaf5cbSAlan Somers snprintf(extregex, sizeof(extregex),
269babaf5cbSAlan Somers "bind.*unix.*%s.*return,success", SERVER_PATH);
270babaf5cbSAlan Somers
271babaf5cbSAlan Somers FILE *pipefd = setup(fds, auclass);
272babaf5cbSAlan Somers ATF_REQUIRE_EQ(0, bind(sockfd, (struct sockaddr *)&server, len));
273babaf5cbSAlan Somers check_audit(fds, extregex, pipefd);
274babaf5cbSAlan Somers close(sockfd);
275babaf5cbSAlan Somers }
276babaf5cbSAlan Somers
ATF_TC_CLEANUP(bind_success,tc)277babaf5cbSAlan Somers ATF_TC_CLEANUP(bind_success, tc)
278babaf5cbSAlan Somers {
279babaf5cbSAlan Somers cleanup();
280babaf5cbSAlan Somers }
281babaf5cbSAlan Somers
282babaf5cbSAlan Somers
283babaf5cbSAlan Somers ATF_TC_WITH_CLEANUP(bind_failure);
ATF_TC_HEAD(bind_failure,tc)284babaf5cbSAlan Somers ATF_TC_HEAD(bind_failure, tc)
285babaf5cbSAlan Somers {
286babaf5cbSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
287babaf5cbSAlan Somers "bind(2) call");
288babaf5cbSAlan Somers }
289babaf5cbSAlan Somers
ATF_TC_BODY(bind_failure,tc)290babaf5cbSAlan Somers ATF_TC_BODY(bind_failure, tc)
291babaf5cbSAlan Somers {
292babaf5cbSAlan Somers assign_address(&server);
293babaf5cbSAlan Somers /* Check the presence of AF_UNIX path in audit record */
294babaf5cbSAlan Somers snprintf(extregex, sizeof(extregex),
295babaf5cbSAlan Somers "bind.*%s.*return,failure", SERVER_PATH);
296babaf5cbSAlan Somers
297babaf5cbSAlan Somers FILE *pipefd = setup(fds, auclass);
298babaf5cbSAlan Somers /* Failure reason: Invalid socket descriptor */
299babaf5cbSAlan Somers ATF_REQUIRE_EQ(-1, bind(0, (struct sockaddr *)&server, len));
300babaf5cbSAlan Somers check_audit(fds, extregex, pipefd);
301babaf5cbSAlan Somers }
302babaf5cbSAlan Somers
ATF_TC_CLEANUP(bind_failure,tc)303babaf5cbSAlan Somers ATF_TC_CLEANUP(bind_failure, tc)
304babaf5cbSAlan Somers {
305babaf5cbSAlan Somers cleanup();
306babaf5cbSAlan Somers }
307babaf5cbSAlan Somers
308babaf5cbSAlan Somers
309babaf5cbSAlan Somers ATF_TC_WITH_CLEANUP(bindat_success);
ATF_TC_HEAD(bindat_success,tc)310babaf5cbSAlan Somers ATF_TC_HEAD(bindat_success, tc)
311babaf5cbSAlan Somers {
312babaf5cbSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
313babaf5cbSAlan Somers "bindat(2) call");
314babaf5cbSAlan Somers }
315babaf5cbSAlan Somers
ATF_TC_BODY(bindat_success,tc)316babaf5cbSAlan Somers ATF_TC_BODY(bindat_success, tc)
317babaf5cbSAlan Somers {
318babaf5cbSAlan Somers assign_address(&server);
319babaf5cbSAlan Somers /* Preliminary socket setup */
320babaf5cbSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
321babaf5cbSAlan Somers /* Check the presence of socket descriptor in audit record */
322babaf5cbSAlan Somers snprintf(extregex, sizeof(extregex),
323babaf5cbSAlan Somers "bindat.*0x%x.*return,success", sockfd);
324babaf5cbSAlan Somers
325babaf5cbSAlan Somers FILE *pipefd = setup(fds, auclass);
326babaf5cbSAlan Somers ATF_REQUIRE_EQ(0, bindat(AT_FDCWD, sockfd,
327babaf5cbSAlan Somers (struct sockaddr *)&server, len));
328babaf5cbSAlan Somers check_audit(fds, extregex, pipefd);
329babaf5cbSAlan Somers close(sockfd);
330babaf5cbSAlan Somers }
331babaf5cbSAlan Somers
ATF_TC_CLEANUP(bindat_success,tc)332babaf5cbSAlan Somers ATF_TC_CLEANUP(bindat_success, tc)
333babaf5cbSAlan Somers {
334babaf5cbSAlan Somers cleanup();
335babaf5cbSAlan Somers }
336babaf5cbSAlan Somers
337babaf5cbSAlan Somers
338babaf5cbSAlan Somers ATF_TC_WITH_CLEANUP(bindat_failure);
ATF_TC_HEAD(bindat_failure,tc)339babaf5cbSAlan Somers ATF_TC_HEAD(bindat_failure, tc)
340babaf5cbSAlan Somers {
341babaf5cbSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
342babaf5cbSAlan Somers "bindat(2) call");
343babaf5cbSAlan Somers }
344babaf5cbSAlan Somers
ATF_TC_BODY(bindat_failure,tc)345babaf5cbSAlan Somers ATF_TC_BODY(bindat_failure, tc)
346babaf5cbSAlan Somers {
347babaf5cbSAlan Somers assign_address(&server);
348babaf5cbSAlan Somers snprintf(extregex, sizeof(extregex), "bindat.*%s", invalregex);
349babaf5cbSAlan Somers
350babaf5cbSAlan Somers FILE *pipefd = setup(fds, auclass);
351babaf5cbSAlan Somers /* Failure reason: Invalid socket descriptor */
352b84a044bSAlan Somers ATF_REQUIRE_EQ(-1, bindat(AT_FDCWD, -1,
353babaf5cbSAlan Somers (struct sockaddr *)&server, len));
354babaf5cbSAlan Somers check_audit(fds, extregex, pipefd);
355babaf5cbSAlan Somers }
356babaf5cbSAlan Somers
ATF_TC_CLEANUP(bindat_failure,tc)357babaf5cbSAlan Somers ATF_TC_CLEANUP(bindat_failure, tc)
358babaf5cbSAlan Somers {
359babaf5cbSAlan Somers cleanup();
360babaf5cbSAlan Somers }
361babaf5cbSAlan Somers
362babaf5cbSAlan Somers
363babaf5cbSAlan Somers ATF_TC_WITH_CLEANUP(listen_success);
ATF_TC_HEAD(listen_success,tc)364babaf5cbSAlan Somers ATF_TC_HEAD(listen_success, tc)
365babaf5cbSAlan Somers {
366babaf5cbSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
367babaf5cbSAlan Somers "listen(2) call");
368babaf5cbSAlan Somers }
369babaf5cbSAlan Somers
ATF_TC_BODY(listen_success,tc)370babaf5cbSAlan Somers ATF_TC_BODY(listen_success, tc)
371babaf5cbSAlan Somers {
372babaf5cbSAlan Somers assign_address(&server);
373babaf5cbSAlan Somers /* Preliminary socket setup */
374babaf5cbSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
375babaf5cbSAlan Somers ATF_REQUIRE_EQ(0, bind(sockfd, (struct sockaddr *)&server, len));
376babaf5cbSAlan Somers /* Check the presence of socket descriptor in the audit record */
377babaf5cbSAlan Somers snprintf(extregex, sizeof(extregex),
378babaf5cbSAlan Somers "listen.*0x%x.*return,success", sockfd);
379babaf5cbSAlan Somers
380babaf5cbSAlan Somers FILE *pipefd = setup(fds, auclass);
381babaf5cbSAlan Somers ATF_REQUIRE_EQ(0, listen(sockfd, 1));
382babaf5cbSAlan Somers check_audit(fds, extregex, pipefd);
383babaf5cbSAlan Somers close(sockfd);
384babaf5cbSAlan Somers }
385babaf5cbSAlan Somers
ATF_TC_CLEANUP(listen_success,tc)386babaf5cbSAlan Somers ATF_TC_CLEANUP(listen_success, tc)
387babaf5cbSAlan Somers {
388babaf5cbSAlan Somers cleanup();
389babaf5cbSAlan Somers }
390babaf5cbSAlan Somers
391babaf5cbSAlan Somers
392babaf5cbSAlan Somers ATF_TC_WITH_CLEANUP(listen_failure);
ATF_TC_HEAD(listen_failure,tc)393babaf5cbSAlan Somers ATF_TC_HEAD(listen_failure, tc)
394babaf5cbSAlan Somers {
395babaf5cbSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
396babaf5cbSAlan Somers "listen(2) call");
397babaf5cbSAlan Somers }
398babaf5cbSAlan Somers
ATF_TC_BODY(listen_failure,tc)399babaf5cbSAlan Somers ATF_TC_BODY(listen_failure, tc)
400babaf5cbSAlan Somers {
401babaf5cbSAlan Somers snprintf(extregex, sizeof(extregex), "listen.*%s", invalregex);
402babaf5cbSAlan Somers FILE *pipefd = setup(fds, auclass);
403babaf5cbSAlan Somers /* Failure reason: Invalid socket descriptor */
404b84a044bSAlan Somers ATF_REQUIRE_EQ(-1, listen(-1, 1));
405babaf5cbSAlan Somers check_audit(fds, extregex, pipefd);
406babaf5cbSAlan Somers }
407babaf5cbSAlan Somers
ATF_TC_CLEANUP(listen_failure,tc)408babaf5cbSAlan Somers ATF_TC_CLEANUP(listen_failure, tc)
409babaf5cbSAlan Somers {
410babaf5cbSAlan Somers cleanup();
411babaf5cbSAlan Somers }
412babaf5cbSAlan Somers
413babaf5cbSAlan Somers
414b84a044bSAlan Somers ATF_TC_WITH_CLEANUP(connect_success);
ATF_TC_HEAD(connect_success,tc)415b84a044bSAlan Somers ATF_TC_HEAD(connect_success, tc)
416b84a044bSAlan Somers {
417b84a044bSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
418b84a044bSAlan Somers "connect(2) call");
419b84a044bSAlan Somers }
420b84a044bSAlan Somers
ATF_TC_BODY(connect_success,tc)421b84a044bSAlan Somers ATF_TC_BODY(connect_success, tc)
422b84a044bSAlan Somers {
423b84a044bSAlan Somers assign_address(&server);
424943f585cSAlan Somers /* Setup a server socket and bind to the specified address */
425943f585cSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
426b84a044bSAlan Somers ATF_REQUIRE_EQ(0, bind(sockfd, (struct sockaddr *)&server, len));
427b84a044bSAlan Somers ATF_REQUIRE_EQ(0, listen(sockfd, 1));
428b84a044bSAlan Somers
429b84a044bSAlan Somers /* Set up "blocking" client socket */
430b84a044bSAlan Somers ATF_REQUIRE((sockfd2 = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
431b84a044bSAlan Somers
432b84a044bSAlan Somers /* Audit record must contain AF_UNIX address path & sockfd2 */
433b84a044bSAlan Somers snprintf(extregex, sizeof(extregex),
434b84a044bSAlan Somers "connect.*0x%x.*%s.*success", sockfd2, SERVER_PATH);
435b84a044bSAlan Somers
436b84a044bSAlan Somers FILE *pipefd = setup(fds, auclass);
437b84a044bSAlan Somers ATF_REQUIRE_EQ(0, connect(sockfd2, (struct sockaddr *)&server, len));
438b84a044bSAlan Somers check_audit(fds, extregex, pipefd);
439b84a044bSAlan Somers
440b84a044bSAlan Somers /* Close all socket descriptors */
441b84a044bSAlan Somers close_sockets(2, sockfd, sockfd2);
442b84a044bSAlan Somers }
443b84a044bSAlan Somers
ATF_TC_CLEANUP(connect_success,tc)444b84a044bSAlan Somers ATF_TC_CLEANUP(connect_success, tc)
445b84a044bSAlan Somers {
446b84a044bSAlan Somers cleanup();
447b84a044bSAlan Somers }
448b84a044bSAlan Somers
449b84a044bSAlan Somers
450b84a044bSAlan Somers ATF_TC_WITH_CLEANUP(connect_failure);
ATF_TC_HEAD(connect_failure,tc)451b84a044bSAlan Somers ATF_TC_HEAD(connect_failure, tc)
452b84a044bSAlan Somers {
453b84a044bSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
454b84a044bSAlan Somers "connect(2) call");
455b84a044bSAlan Somers }
456b84a044bSAlan Somers
ATF_TC_BODY(connect_failure,tc)457b84a044bSAlan Somers ATF_TC_BODY(connect_failure, tc)
458b84a044bSAlan Somers {
459b84a044bSAlan Somers assign_address(&server);
460b84a044bSAlan Somers /* Audit record must contain AF_UNIX address path */
461b84a044bSAlan Somers snprintf(extregex, sizeof(extregex),
462b84a044bSAlan Somers "connect.*%s.*return,failure", SERVER_PATH);
463b84a044bSAlan Somers
464b84a044bSAlan Somers FILE *pipefd = setup(fds, auclass);
465b84a044bSAlan Somers /* Failure reason: Invalid socket descriptor */
466b84a044bSAlan Somers ATF_REQUIRE_EQ(-1, connect(-1, (struct sockaddr *)&server, len));
467b84a044bSAlan Somers check_audit(fds, extregex, pipefd);
468b84a044bSAlan Somers }
469b84a044bSAlan Somers
ATF_TC_CLEANUP(connect_failure,tc)470b84a044bSAlan Somers ATF_TC_CLEANUP(connect_failure, tc)
471b84a044bSAlan Somers {
472b84a044bSAlan Somers cleanup();
473b84a044bSAlan Somers }
474b84a044bSAlan Somers
475b84a044bSAlan Somers
476b84a044bSAlan Somers ATF_TC_WITH_CLEANUP(connectat_success);
ATF_TC_HEAD(connectat_success,tc)477b84a044bSAlan Somers ATF_TC_HEAD(connectat_success, tc)
478b84a044bSAlan Somers {
479b84a044bSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
480b84a044bSAlan Somers "connectat(2) call");
481b84a044bSAlan Somers }
482b84a044bSAlan Somers
ATF_TC_BODY(connectat_success,tc)483b84a044bSAlan Somers ATF_TC_BODY(connectat_success, tc)
484b84a044bSAlan Somers {
485b84a044bSAlan Somers assign_address(&server);
486943f585cSAlan Somers /* Setup a server socket and bind to the specified address */
487943f585cSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
488b84a044bSAlan Somers ATF_REQUIRE_EQ(0, bind(sockfd, (struct sockaddr *)&server, len));
489b84a044bSAlan Somers ATF_REQUIRE_EQ(0, listen(sockfd, 1));
490b84a044bSAlan Somers
491b84a044bSAlan Somers /* Set up "blocking" client socket */
492b84a044bSAlan Somers ATF_REQUIRE((sockfd2 = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
493b84a044bSAlan Somers
494b84a044bSAlan Somers /* Audit record must contain sockfd2 */
495b84a044bSAlan Somers snprintf(extregex, sizeof(extregex),
496b84a044bSAlan Somers "connectat.*0x%x.*return,success", sockfd2);
497b84a044bSAlan Somers
498b84a044bSAlan Somers FILE *pipefd = setup(fds, auclass);
499b84a044bSAlan Somers ATF_REQUIRE_EQ(0, connectat(AT_FDCWD, sockfd2,
500b84a044bSAlan Somers (struct sockaddr *)&server, len));
501b84a044bSAlan Somers check_audit(fds, extregex, pipefd);
502b84a044bSAlan Somers
503b84a044bSAlan Somers /* Close all socket descriptors */
504b84a044bSAlan Somers close_sockets(2, sockfd, sockfd2);
505b84a044bSAlan Somers }
506b84a044bSAlan Somers
ATF_TC_CLEANUP(connectat_success,tc)507b84a044bSAlan Somers ATF_TC_CLEANUP(connectat_success, tc)
508b84a044bSAlan Somers {
509b84a044bSAlan Somers cleanup();
510b84a044bSAlan Somers }
511b84a044bSAlan Somers
512b84a044bSAlan Somers
513b84a044bSAlan Somers ATF_TC_WITH_CLEANUP(connectat_failure);
ATF_TC_HEAD(connectat_failure,tc)514b84a044bSAlan Somers ATF_TC_HEAD(connectat_failure, tc)
515b84a044bSAlan Somers {
516b84a044bSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
517b84a044bSAlan Somers "connectat(2) call");
518b84a044bSAlan Somers }
519b84a044bSAlan Somers
ATF_TC_BODY(connectat_failure,tc)520b84a044bSAlan Somers ATF_TC_BODY(connectat_failure, tc)
521b84a044bSAlan Somers {
522b84a044bSAlan Somers assign_address(&server);
523b84a044bSAlan Somers snprintf(extregex, sizeof(extregex), "connectat.*%s", invalregex);
524b84a044bSAlan Somers
525b84a044bSAlan Somers FILE *pipefd = setup(fds, auclass);
526b84a044bSAlan Somers /* Failure reason: Invalid socket descriptor */
527b84a044bSAlan Somers ATF_REQUIRE_EQ(-1, connectat(AT_FDCWD, -1,
528b84a044bSAlan Somers (struct sockaddr *)&server, len));
529b84a044bSAlan Somers check_audit(fds, extregex, pipefd);
530b84a044bSAlan Somers }
531b84a044bSAlan Somers
ATF_TC_CLEANUP(connectat_failure,tc)532b84a044bSAlan Somers ATF_TC_CLEANUP(connectat_failure, tc)
533b84a044bSAlan Somers {
534b84a044bSAlan Somers cleanup();
535b84a044bSAlan Somers }
536b84a044bSAlan Somers
537b84a044bSAlan Somers
538b84a044bSAlan Somers ATF_TC_WITH_CLEANUP(accept_success);
ATF_TC_HEAD(accept_success,tc)539b84a044bSAlan Somers ATF_TC_HEAD(accept_success, tc)
540b84a044bSAlan Somers {
541b84a044bSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
542b84a044bSAlan Somers "accept(2) call");
543b84a044bSAlan Somers }
544b84a044bSAlan Somers
ATF_TC_BODY(accept_success,tc)545b84a044bSAlan Somers ATF_TC_BODY(accept_success, tc)
546b84a044bSAlan Somers {
547b84a044bSAlan Somers assign_address(&server);
548943f585cSAlan Somers /* Setup a server socket and bind to the specified address */
549943f585cSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
550b84a044bSAlan Somers ATF_REQUIRE_EQ(0, bind(sockfd, (struct sockaddr *)&server, len));
551b84a044bSAlan Somers ATF_REQUIRE_EQ(0, listen(sockfd, 1));
552b84a044bSAlan Somers
553b84a044bSAlan Somers /* Set up "blocking" client socket */
554b84a044bSAlan Somers ATF_REQUIRE((sockfd2 = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
555b84a044bSAlan Somers ATF_REQUIRE_EQ(0, connect(sockfd2, (struct sockaddr *)&server, len));
556b84a044bSAlan Somers
557b84a044bSAlan Somers FILE *pipefd = setup(fds, auclass);
558943f585cSAlan Somers ATF_REQUIRE((connectfd = accept(sockfd, NULL, &len)) != -1);
559b84a044bSAlan Somers
560943f585cSAlan Somers /* Audit record must contain connectfd & sockfd */
561b84a044bSAlan Somers snprintf(extregex, sizeof(extregex),
562943f585cSAlan Somers "accept.*0x%x.*return,success,%d", sockfd, connectfd);
563b84a044bSAlan Somers check_audit(fds, extregex, pipefd);
564b84a044bSAlan Somers
565b84a044bSAlan Somers /* Close all socket descriptors */
566943f585cSAlan Somers close_sockets(3, sockfd, sockfd2, connectfd);
567b84a044bSAlan Somers }
568b84a044bSAlan Somers
ATF_TC_CLEANUP(accept_success,tc)569b84a044bSAlan Somers ATF_TC_CLEANUP(accept_success, tc)
570b84a044bSAlan Somers {
571b84a044bSAlan Somers cleanup();
572b84a044bSAlan Somers }
573b84a044bSAlan Somers
574b84a044bSAlan Somers
575b84a044bSAlan Somers ATF_TC_WITH_CLEANUP(accept_failure);
ATF_TC_HEAD(accept_failure,tc)576b84a044bSAlan Somers ATF_TC_HEAD(accept_failure, tc)
577b84a044bSAlan Somers {
578b84a044bSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
579b84a044bSAlan Somers "accept(2) call");
580b84a044bSAlan Somers }
581b84a044bSAlan Somers
ATF_TC_BODY(accept_failure,tc)582b84a044bSAlan Somers ATF_TC_BODY(accept_failure, tc)
583b84a044bSAlan Somers {
584b84a044bSAlan Somers snprintf(extregex, sizeof(extregex), "accept.*%s", invalregex);
585b84a044bSAlan Somers FILE *pipefd = setup(fds, auclass);
586b84a044bSAlan Somers /* Failure reason: Invalid socket descriptor */
587943f585cSAlan Somers ATF_REQUIRE_EQ(-1, accept(-1, NULL, NULL));
588b84a044bSAlan Somers check_audit(fds, extregex, pipefd);
589b84a044bSAlan Somers }
590b84a044bSAlan Somers
ATF_TC_CLEANUP(accept_failure,tc)591b84a044bSAlan Somers ATF_TC_CLEANUP(accept_failure, tc)
592b84a044bSAlan Somers {
593b84a044bSAlan Somers cleanup();
594b84a044bSAlan Somers }
595b84a044bSAlan Somers
596b84a044bSAlan Somers
597943f585cSAlan Somers ATF_TC_WITH_CLEANUP(send_success);
ATF_TC_HEAD(send_success,tc)598943f585cSAlan Somers ATF_TC_HEAD(send_success, tc)
599943f585cSAlan Somers {
600943f585cSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
601943f585cSAlan Somers "send(2) call");
602943f585cSAlan Somers }
603943f585cSAlan Somers
ATF_TC_BODY(send_success,tc)604943f585cSAlan Somers ATF_TC_BODY(send_success, tc)
605943f585cSAlan Somers {
606943f585cSAlan Somers assign_address(&server);
607943f585cSAlan Somers /* Setup a server socket and bind to the specified address */
608943f585cSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
609943f585cSAlan Somers ATF_REQUIRE_EQ(0, bind(sockfd, (struct sockaddr *)&server, len));
610943f585cSAlan Somers ATF_REQUIRE_EQ(0, listen(sockfd, 1));
611943f585cSAlan Somers
612943f585cSAlan Somers /* Set up "blocking" client and connect with non-blocking server */
613943f585cSAlan Somers ATF_REQUIRE((sockfd2 = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
614943f585cSAlan Somers ATF_REQUIRE_EQ(0, connect(sockfd2, (struct sockaddr *)&server, len));
615943f585cSAlan Somers ATF_REQUIRE((connectfd = accept(sockfd, NULL, &len)) != -1);
616943f585cSAlan Somers
617943f585cSAlan Somers /* Send a sample message to the connected socket */
618943f585cSAlan Somers FILE *pipefd = setup(fds, auclass);
619943f585cSAlan Somers ATF_REQUIRE((data_bytes =
620943f585cSAlan Somers send(sockfd2, msgbuff, strlen(msgbuff), 0)) != -1);
621943f585cSAlan Somers
622943f585cSAlan Somers /* Audit record must contain sockfd2 and data_bytes */
623943f585cSAlan Somers snprintf(extregex, sizeof(extregex),
624943f585cSAlan Somers "send.*0x%x.*return,success,%zd", sockfd2, data_bytes);
625943f585cSAlan Somers check_audit(fds, extregex, pipefd);
626943f585cSAlan Somers
627943f585cSAlan Somers /* Close all socket descriptors */
628943f585cSAlan Somers close_sockets(3, sockfd, sockfd2, connectfd);
629943f585cSAlan Somers }
630943f585cSAlan Somers
ATF_TC_CLEANUP(send_success,tc)631943f585cSAlan Somers ATF_TC_CLEANUP(send_success, tc)
632943f585cSAlan Somers {
633943f585cSAlan Somers cleanup();
634943f585cSAlan Somers }
635943f585cSAlan Somers
636943f585cSAlan Somers
637943f585cSAlan Somers ATF_TC_WITH_CLEANUP(send_failure);
ATF_TC_HEAD(send_failure,tc)638943f585cSAlan Somers ATF_TC_HEAD(send_failure, tc)
639943f585cSAlan Somers {
640943f585cSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
641943f585cSAlan Somers "send(2) call");
642943f585cSAlan Somers }
643943f585cSAlan Somers
ATF_TC_BODY(send_failure,tc)644943f585cSAlan Somers ATF_TC_BODY(send_failure, tc)
645943f585cSAlan Somers {
646943f585cSAlan Somers snprintf(extregex, sizeof(extregex), "send.*%s", invalregex);
647943f585cSAlan Somers FILE *pipefd = setup(fds, auclass);
648943f585cSAlan Somers /* Failure reason: Invalid socket descriptor */
649943f585cSAlan Somers ATF_REQUIRE_EQ(-1, send(-1, NULL, 0, 0));
650943f585cSAlan Somers check_audit(fds, extregex, pipefd);
651943f585cSAlan Somers }
652943f585cSAlan Somers
ATF_TC_CLEANUP(send_failure,tc)653943f585cSAlan Somers ATF_TC_CLEANUP(send_failure, tc)
654943f585cSAlan Somers {
655943f585cSAlan Somers cleanup();
656943f585cSAlan Somers }
657943f585cSAlan Somers
658943f585cSAlan Somers
659943f585cSAlan Somers ATF_TC_WITH_CLEANUP(recv_success);
ATF_TC_HEAD(recv_success,tc)660943f585cSAlan Somers ATF_TC_HEAD(recv_success, tc)
661943f585cSAlan Somers {
662943f585cSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
663943f585cSAlan Somers "recv(2) call");
664943f585cSAlan Somers }
665943f585cSAlan Somers
ATF_TC_BODY(recv_success,tc)666943f585cSAlan Somers ATF_TC_BODY(recv_success, tc)
667943f585cSAlan Somers {
668943f585cSAlan Somers assign_address(&server);
669943f585cSAlan Somers /* Setup a server socket and bind to the specified address */
670943f585cSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
671943f585cSAlan Somers ATF_REQUIRE_EQ(0, bind(sockfd, (struct sockaddr *)&server, len));
672943f585cSAlan Somers ATF_REQUIRE_EQ(0, listen(sockfd, 1));
673943f585cSAlan Somers
674943f585cSAlan Somers /* Set up "blocking" client and connect with non-blocking server */
675943f585cSAlan Somers ATF_REQUIRE((sockfd2 = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
676943f585cSAlan Somers ATF_REQUIRE_EQ(0, connect(sockfd2, (struct sockaddr *)&server, len));
677943f585cSAlan Somers ATF_REQUIRE((connectfd = accept(sockfd, NULL, &len)) != -1);
678943f585cSAlan Somers /* Send a sample message to the connected socket */
679943f585cSAlan Somers ATF_REQUIRE(send(sockfd2, msgbuff, strlen(msgbuff), 0) != -1);
680943f585cSAlan Somers
681943f585cSAlan Somers /* Receive data once connectfd is ready for reading */
682943f585cSAlan Somers FILE *pipefd = setup(fds, auclass);
683943f585cSAlan Somers ATF_REQUIRE((data_bytes = recv(connectfd, data, MAX_DATA, 0)) != 0);
684943f585cSAlan Somers
685943f585cSAlan Somers /* Audit record must contain connectfd and data_bytes */
686943f585cSAlan Somers snprintf(extregex, sizeof(extregex),
687943f585cSAlan Somers "recv.*0x%x.*return,success,%zd", connectfd, data_bytes);
688943f585cSAlan Somers check_audit(fds, extregex, pipefd);
689943f585cSAlan Somers
690943f585cSAlan Somers /* Close all socket descriptors */
691943f585cSAlan Somers close_sockets(3, sockfd, sockfd2, connectfd);
692943f585cSAlan Somers }
693943f585cSAlan Somers
ATF_TC_CLEANUP(recv_success,tc)694943f585cSAlan Somers ATF_TC_CLEANUP(recv_success, tc)
695943f585cSAlan Somers {
696943f585cSAlan Somers cleanup();
697943f585cSAlan Somers }
698943f585cSAlan Somers
699943f585cSAlan Somers
700943f585cSAlan Somers ATF_TC_WITH_CLEANUP(recv_failure);
ATF_TC_HEAD(recv_failure,tc)701943f585cSAlan Somers ATF_TC_HEAD(recv_failure, tc)
702943f585cSAlan Somers {
703943f585cSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
704943f585cSAlan Somers "recv(2) call");
705943f585cSAlan Somers }
706943f585cSAlan Somers
ATF_TC_BODY(recv_failure,tc)707943f585cSAlan Somers ATF_TC_BODY(recv_failure, tc)
708943f585cSAlan Somers {
709943f585cSAlan Somers snprintf(extregex, sizeof(extregex), "recv.*%s", invalregex);
710943f585cSAlan Somers FILE *pipefd = setup(fds, auclass);
711943f585cSAlan Somers /* Failure reason: Invalid socket descriptor */
712943f585cSAlan Somers ATF_REQUIRE_EQ(-1, recv(-1, NULL, 0, 0));
713943f585cSAlan Somers check_audit(fds, extregex, pipefd);
714943f585cSAlan Somers }
715943f585cSAlan Somers
ATF_TC_CLEANUP(recv_failure,tc)716943f585cSAlan Somers ATF_TC_CLEANUP(recv_failure, tc)
717943f585cSAlan Somers {
718943f585cSAlan Somers cleanup();
719943f585cSAlan Somers }
720943f585cSAlan Somers
721943f585cSAlan Somers
722943f585cSAlan Somers ATF_TC_WITH_CLEANUP(sendto_success);
ATF_TC_HEAD(sendto_success,tc)723943f585cSAlan Somers ATF_TC_HEAD(sendto_success, tc)
724943f585cSAlan Somers {
725943f585cSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
726943f585cSAlan Somers "sendto(2) call");
727943f585cSAlan Somers }
728943f585cSAlan Somers
ATF_TC_BODY(sendto_success,tc)729943f585cSAlan Somers ATF_TC_BODY(sendto_success, tc)
730943f585cSAlan Somers {
731943f585cSAlan Somers assign_address(&server);
732943f585cSAlan Somers /* Setup a server socket and bind to the specified address */
733943f585cSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_DGRAM, 0)) != -1);
734943f585cSAlan Somers ATF_REQUIRE_EQ(0, bind(sockfd, (struct sockaddr *)&server, len));
735943f585cSAlan Somers
736943f585cSAlan Somers /* Set up client socket to be used for sending the data */
737943f585cSAlan Somers ATF_REQUIRE((sockfd2 = socket(PF_UNIX, SOCK_DGRAM, 0)) != -1);
738943f585cSAlan Somers
739943f585cSAlan Somers /* Send a sample message to server's address */
740943f585cSAlan Somers FILE *pipefd = setup(fds, auclass);
741943f585cSAlan Somers ATF_REQUIRE((data_bytes = sendto(sockfd2, msgbuff,
742943f585cSAlan Somers strlen(msgbuff), 0, (struct sockaddr *)&server, len)) != -1);
743943f585cSAlan Somers
744943f585cSAlan Somers /* Audit record must contain sockfd2 and data_bytes */
745943f585cSAlan Somers snprintf(extregex, sizeof(extregex),
746943f585cSAlan Somers "sendto.*0x%x.*return,success,%zd", sockfd2, data_bytes);
747943f585cSAlan Somers check_audit(fds, extregex, pipefd);
748943f585cSAlan Somers
749943f585cSAlan Somers /* Close all socket descriptors */
750943f585cSAlan Somers close_sockets(2, sockfd, sockfd2);
751943f585cSAlan Somers }
752943f585cSAlan Somers
ATF_TC_CLEANUP(sendto_success,tc)753943f585cSAlan Somers ATF_TC_CLEANUP(sendto_success, tc)
754943f585cSAlan Somers {
755943f585cSAlan Somers cleanup();
756943f585cSAlan Somers }
757943f585cSAlan Somers
758943f585cSAlan Somers
759943f585cSAlan Somers ATF_TC_WITH_CLEANUP(sendto_failure);
ATF_TC_HEAD(sendto_failure,tc)760943f585cSAlan Somers ATF_TC_HEAD(sendto_failure, tc)
761943f585cSAlan Somers {
762943f585cSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
763943f585cSAlan Somers "sendto(2) call");
764943f585cSAlan Somers }
765943f585cSAlan Somers
ATF_TC_BODY(sendto_failure,tc)766943f585cSAlan Somers ATF_TC_BODY(sendto_failure, tc)
767943f585cSAlan Somers {
768943f585cSAlan Somers snprintf(extregex, sizeof(extregex), "sendto.*%s", invalregex);
769943f585cSAlan Somers FILE *pipefd = setup(fds, auclass);
770943f585cSAlan Somers /* Failure reason: Invalid socket descriptor */
771943f585cSAlan Somers ATF_REQUIRE_EQ(-1, sendto(-1, NULL, 0, 0, NULL, 0));
772943f585cSAlan Somers check_audit(fds, extregex, pipefd);
773943f585cSAlan Somers }
774943f585cSAlan Somers
ATF_TC_CLEANUP(sendto_failure,tc)775943f585cSAlan Somers ATF_TC_CLEANUP(sendto_failure, tc)
776943f585cSAlan Somers {
777943f585cSAlan Somers cleanup();
778943f585cSAlan Somers }
779943f585cSAlan Somers
780943f585cSAlan Somers
781943f585cSAlan Somers ATF_TC_WITH_CLEANUP(recvfrom_success);
ATF_TC_HEAD(recvfrom_success,tc)782943f585cSAlan Somers ATF_TC_HEAD(recvfrom_success, tc)
783943f585cSAlan Somers {
784943f585cSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
785943f585cSAlan Somers "recvfrom(2) call");
786943f585cSAlan Somers }
787943f585cSAlan Somers
ATF_TC_BODY(recvfrom_success,tc)788943f585cSAlan Somers ATF_TC_BODY(recvfrom_success, tc)
789943f585cSAlan Somers {
790943f585cSAlan Somers assign_address(&server);
791943f585cSAlan Somers /* Setup a server socket and bind to the specified address */
792943f585cSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_DGRAM, 0)) != -1);
793943f585cSAlan Somers ATF_REQUIRE_EQ(0, bind(sockfd, (struct sockaddr *)&server, len));
794943f585cSAlan Somers
795943f585cSAlan Somers /* Set up client socket to be used for sending the data */
796943f585cSAlan Somers ATF_REQUIRE((sockfd2 = socket(PF_UNIX, SOCK_DGRAM, 0)) != -1);
797943f585cSAlan Somers ATF_REQUIRE(sendto(sockfd2, msgbuff, strlen(msgbuff), 0,
798943f585cSAlan Somers (struct sockaddr *)&server, len) != -1);
799943f585cSAlan Somers
800943f585cSAlan Somers /* Receive data once sockfd is ready for reading */
801943f585cSAlan Somers FILE *pipefd = setup(fds, auclass);
802943f585cSAlan Somers ATF_REQUIRE((data_bytes = recvfrom(sockfd, data,
803943f585cSAlan Somers MAX_DATA, 0, NULL, &len)) != 0);
804943f585cSAlan Somers
805943f585cSAlan Somers /* Audit record must contain sockfd and data_bytes */
806943f585cSAlan Somers snprintf(extregex, sizeof(extregex),
807943f585cSAlan Somers "recvfrom.*0x%x.*return,success,%zd", sockfd, data_bytes);
808943f585cSAlan Somers check_audit(fds, extregex, pipefd);
809943f585cSAlan Somers
810943f585cSAlan Somers /* Close all socket descriptors */
811943f585cSAlan Somers close_sockets(2, sockfd, sockfd2);
812943f585cSAlan Somers }
813943f585cSAlan Somers
ATF_TC_CLEANUP(recvfrom_success,tc)814943f585cSAlan Somers ATF_TC_CLEANUP(recvfrom_success, tc)
815943f585cSAlan Somers {
816943f585cSAlan Somers cleanup();
817943f585cSAlan Somers }
818943f585cSAlan Somers
819943f585cSAlan Somers
820943f585cSAlan Somers ATF_TC_WITH_CLEANUP(recvfrom_failure);
ATF_TC_HEAD(recvfrom_failure,tc)821943f585cSAlan Somers ATF_TC_HEAD(recvfrom_failure, tc)
822943f585cSAlan Somers {
823943f585cSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
824943f585cSAlan Somers "recvfrom(2) call");
825943f585cSAlan Somers }
826943f585cSAlan Somers
ATF_TC_BODY(recvfrom_failure,tc)827943f585cSAlan Somers ATF_TC_BODY(recvfrom_failure, tc)
828943f585cSAlan Somers {
829943f585cSAlan Somers snprintf(extregex, sizeof(extregex), "recvfrom.*%s", invalregex);
830943f585cSAlan Somers FILE *pipefd = setup(fds, auclass);
831943f585cSAlan Somers /* Failure reason: Invalid socket descriptor */
832943f585cSAlan Somers ATF_REQUIRE_EQ(-1, recvfrom(-1, NULL, 0, 0, NULL, NULL));
833943f585cSAlan Somers check_audit(fds, extregex, pipefd);
834943f585cSAlan Somers }
835943f585cSAlan Somers
ATF_TC_CLEANUP(recvfrom_failure,tc)836943f585cSAlan Somers ATF_TC_CLEANUP(recvfrom_failure, tc)
837943f585cSAlan Somers {
838943f585cSAlan Somers cleanup();
839943f585cSAlan Somers }
840943f585cSAlan Somers
841943f585cSAlan Somers
842b92435ccSAlan Somers ATF_TC_WITH_CLEANUP(sendmsg_success);
ATF_TC_HEAD(sendmsg_success,tc)843b92435ccSAlan Somers ATF_TC_HEAD(sendmsg_success, tc)
844b92435ccSAlan Somers {
845b92435ccSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
846b92435ccSAlan Somers "recvmsg(2) call");
847b92435ccSAlan Somers }
848b92435ccSAlan Somers
ATF_TC_BODY(sendmsg_success,tc)849b92435ccSAlan Somers ATF_TC_BODY(sendmsg_success, tc)
850b92435ccSAlan Somers {
851b92435ccSAlan Somers assign_address(&server);
852b92435ccSAlan Somers /* Create a datagram server socket & bind to UNIX address family */
853b92435ccSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_DGRAM, 0)) != -1);
854b92435ccSAlan Somers ATF_REQUIRE_EQ(0, bind(sockfd, (struct sockaddr *)&server, len));
855b92435ccSAlan Somers
856b92435ccSAlan Somers /* Message buffer to be sent to the server */
857b92435ccSAlan Somers init_iov(&io1, msgbuff, sizeof(msgbuff));
858b92435ccSAlan Somers init_msghdr(&sendbuf, &io1, &server);
859b92435ccSAlan Somers
860b92435ccSAlan Somers /* Set up UDP client to communicate with the server */
861b92435ccSAlan Somers ATF_REQUIRE((sockfd2 = socket(PF_UNIX, SOCK_DGRAM, 0)) != -1);
862b92435ccSAlan Somers
863b92435ccSAlan Somers /* Send a sample message to the specified client address */
864b92435ccSAlan Somers FILE *pipefd = setup(fds, auclass);
865b92435ccSAlan Somers ATF_REQUIRE((data_bytes = sendmsg(sockfd2, &sendbuf, 0)) != -1);
866b92435ccSAlan Somers
867b92435ccSAlan Somers /* Audit record must contain sockfd2 and data_bytes */
868b92435ccSAlan Somers snprintf(extregex, sizeof(extregex),
869b92435ccSAlan Somers "sendmsg.*0x%x.*return,success,%zd", sockfd2, data_bytes);
870b92435ccSAlan Somers check_audit(fds, extregex, pipefd);
871b92435ccSAlan Somers
872b92435ccSAlan Somers /* Close all socket descriptors */
873b92435ccSAlan Somers close_sockets(2, sockfd, sockfd2);
874b92435ccSAlan Somers }
875b92435ccSAlan Somers
ATF_TC_CLEANUP(sendmsg_success,tc)876b92435ccSAlan Somers ATF_TC_CLEANUP(sendmsg_success, tc)
877b92435ccSAlan Somers {
878b92435ccSAlan Somers cleanup();
879b92435ccSAlan Somers }
880b92435ccSAlan Somers
881b92435ccSAlan Somers
882b92435ccSAlan Somers ATF_TC_WITH_CLEANUP(sendmsg_failure);
ATF_TC_HEAD(sendmsg_failure,tc)883b92435ccSAlan Somers ATF_TC_HEAD(sendmsg_failure, tc)
884b92435ccSAlan Somers {
885b92435ccSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
886b92435ccSAlan Somers "sendmsg(2) call");
887b92435ccSAlan Somers }
888b92435ccSAlan Somers
ATF_TC_BODY(sendmsg_failure,tc)889b92435ccSAlan Somers ATF_TC_BODY(sendmsg_failure, tc)
890b92435ccSAlan Somers {
891b92435ccSAlan Somers snprintf(extregex, sizeof(extregex),
892b92435ccSAlan Somers "sendmsg.*return,failure : Bad address");
893b92435ccSAlan Somers FILE *pipefd = setup(fds, auclass);
894b92435ccSAlan Somers ATF_REQUIRE_EQ(-1, sendmsg(-1, NULL, 0));
895b92435ccSAlan Somers check_audit(fds, extregex, pipefd);
896b92435ccSAlan Somers }
897b92435ccSAlan Somers
ATF_TC_CLEANUP(sendmsg_failure,tc)898b92435ccSAlan Somers ATF_TC_CLEANUP(sendmsg_failure, tc)
899b92435ccSAlan Somers {
900b92435ccSAlan Somers cleanup();
901b92435ccSAlan Somers }
902b92435ccSAlan Somers
903b92435ccSAlan Somers
904b92435ccSAlan Somers ATF_TC_WITH_CLEANUP(recvmsg_success);
ATF_TC_HEAD(recvmsg_success,tc)905b92435ccSAlan Somers ATF_TC_HEAD(recvmsg_success, tc)
906b92435ccSAlan Somers {
907b92435ccSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
908b92435ccSAlan Somers "recvmsg(2) call");
909b92435ccSAlan Somers }
910b92435ccSAlan Somers
ATF_TC_BODY(recvmsg_success,tc)911b92435ccSAlan Somers ATF_TC_BODY(recvmsg_success, tc)
912b92435ccSAlan Somers {
913b92435ccSAlan Somers assign_address(&server);
914b92435ccSAlan Somers /* Create a datagram server socket & bind to UNIX address family */
915b92435ccSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_DGRAM, 0)) != -1);
916b92435ccSAlan Somers ATF_REQUIRE_EQ(0, bind(sockfd, (struct sockaddr *)&server, len));
917b92435ccSAlan Somers
918b92435ccSAlan Somers /* Message buffer to be sent to the server */
919b92435ccSAlan Somers init_iov(&io1, msgbuff, sizeof(msgbuff));
920b92435ccSAlan Somers init_msghdr(&sendbuf, &io1, &server);
921b92435ccSAlan Somers
922b92435ccSAlan Somers /* Prepare buffer to store the received data in */
923b92435ccSAlan Somers init_iov(&io2, data, sizeof(data));
924b92435ccSAlan Somers init_msghdr(&recvbuf, &io2, NULL);
925b92435ccSAlan Somers
926b92435ccSAlan Somers /* Set up UDP client to communicate with the server */
927b92435ccSAlan Somers ATF_REQUIRE((sockfd2 = socket(PF_UNIX, SOCK_DGRAM, 0)) != -1);
928b92435ccSAlan Somers /* Send a sample message to the connected socket */
929b92435ccSAlan Somers ATF_REQUIRE(sendmsg(sockfd2, &sendbuf, 0) != -1);
930b92435ccSAlan Somers
931b92435ccSAlan Somers /* Receive data once clientfd is ready for reading */
932b92435ccSAlan Somers FILE *pipefd = setup(fds, auclass);
933b92435ccSAlan Somers ATF_REQUIRE((data_bytes = recvmsg(sockfd, &recvbuf, 0)) != -1);
934b92435ccSAlan Somers
935b92435ccSAlan Somers /* Audit record must contain sockfd and data_bytes */
936b92435ccSAlan Somers snprintf(extregex, sizeof(extregex),
937b92435ccSAlan Somers "recvmsg.*%#x.*return,success,%zd", sockfd, data_bytes);
938b92435ccSAlan Somers check_audit(fds, extregex, pipefd);
939b92435ccSAlan Somers
940b92435ccSAlan Somers /* Close all socket descriptors */
941b92435ccSAlan Somers close_sockets(2, sockfd, sockfd2);
942b92435ccSAlan Somers }
943b92435ccSAlan Somers
ATF_TC_CLEANUP(recvmsg_success,tc)944b92435ccSAlan Somers ATF_TC_CLEANUP(recvmsg_success, tc)
945b92435ccSAlan Somers {
946b92435ccSAlan Somers cleanup();
947b92435ccSAlan Somers }
948b92435ccSAlan Somers
949b92435ccSAlan Somers
950b92435ccSAlan Somers ATF_TC_WITH_CLEANUP(recvmsg_failure);
ATF_TC_HEAD(recvmsg_failure,tc)951b92435ccSAlan Somers ATF_TC_HEAD(recvmsg_failure, tc)
952b92435ccSAlan Somers {
953b92435ccSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
954b92435ccSAlan Somers "recvmsg(2) call");
955b92435ccSAlan Somers }
956b92435ccSAlan Somers
ATF_TC_BODY(recvmsg_failure,tc)957b92435ccSAlan Somers ATF_TC_BODY(recvmsg_failure, tc)
958b92435ccSAlan Somers {
959b92435ccSAlan Somers snprintf(extregex, sizeof(extregex),
960b92435ccSAlan Somers "recvmsg.*return,failure : Bad address");
961b92435ccSAlan Somers FILE *pipefd = setup(fds, auclass);
962b92435ccSAlan Somers ATF_REQUIRE_EQ(-1, recvmsg(-1, NULL, 0));
963b92435ccSAlan Somers check_audit(fds, extregex, pipefd);
964b92435ccSAlan Somers }
965b92435ccSAlan Somers
ATF_TC_CLEANUP(recvmsg_failure,tc)966b92435ccSAlan Somers ATF_TC_CLEANUP(recvmsg_failure, tc)
967b92435ccSAlan Somers {
968b92435ccSAlan Somers cleanup();
969b92435ccSAlan Somers }
970b92435ccSAlan Somers
971b92435ccSAlan Somers
972b92435ccSAlan Somers ATF_TC_WITH_CLEANUP(shutdown_success);
ATF_TC_HEAD(shutdown_success,tc)973b92435ccSAlan Somers ATF_TC_HEAD(shutdown_success, tc)
974b92435ccSAlan Somers {
975b92435ccSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
976b92435ccSAlan Somers "shutdown(2) call");
977b92435ccSAlan Somers }
978b92435ccSAlan Somers
ATF_TC_BODY(shutdown_success,tc)979b92435ccSAlan Somers ATF_TC_BODY(shutdown_success, tc)
980b92435ccSAlan Somers {
981b92435ccSAlan Somers assign_address(&server);
982b92435ccSAlan Somers /* Setup server socket and bind to the specified address */
983b92435ccSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
984b92435ccSAlan Somers ATF_REQUIRE_EQ(0, bind(sockfd, (struct sockaddr *)&server, len));
985b92435ccSAlan Somers ATF_REQUIRE_EQ(0, listen(sockfd, 1));
986b92435ccSAlan Somers
987b92435ccSAlan Somers /* Setup client and connect with the blocking server */
988b92435ccSAlan Somers ATF_REQUIRE((sockfd2 = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
989b92435ccSAlan Somers ATF_REQUIRE_EQ(0, connect(sockfd2, (struct sockaddr *)&server, len));
990b92435ccSAlan Somers ATF_REQUIRE((connectfd = accept(sockfd, NULL, &len)) != -1);
991b92435ccSAlan Somers
992b92435ccSAlan Somers /* Audit record must contain clientfd */
993b92435ccSAlan Somers snprintf(extregex, sizeof(extregex),
994b92435ccSAlan Somers "shutdown.*%#x.*return,success", connectfd);
995b92435ccSAlan Somers
996b92435ccSAlan Somers FILE *pipefd = setup(fds, auclass);
997b92435ccSAlan Somers ATF_REQUIRE_EQ(0, shutdown(connectfd, SHUT_RDWR));
998b92435ccSAlan Somers check_audit(fds, extregex, pipefd);
999b92435ccSAlan Somers
1000b92435ccSAlan Somers /* Close all socket descriptors */
1001b92435ccSAlan Somers close_sockets(3, sockfd, sockfd2, connectfd);
1002b92435ccSAlan Somers }
1003b92435ccSAlan Somers
ATF_TC_CLEANUP(shutdown_success,tc)1004b92435ccSAlan Somers ATF_TC_CLEANUP(shutdown_success, tc)
1005b92435ccSAlan Somers {
1006b92435ccSAlan Somers cleanup();
1007b92435ccSAlan Somers }
1008b92435ccSAlan Somers
1009b92435ccSAlan Somers
1010b92435ccSAlan Somers ATF_TC_WITH_CLEANUP(shutdown_failure);
ATF_TC_HEAD(shutdown_failure,tc)1011b92435ccSAlan Somers ATF_TC_HEAD(shutdown_failure, tc)
1012b92435ccSAlan Somers {
1013b92435ccSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1014b92435ccSAlan Somers "shutdown(2) call");
1015b92435ccSAlan Somers }
1016b92435ccSAlan Somers
ATF_TC_BODY(shutdown_failure,tc)1017b92435ccSAlan Somers ATF_TC_BODY(shutdown_failure, tc)
1018b92435ccSAlan Somers {
1019b92435ccSAlan Somers pid = getpid();
1020b92435ccSAlan Somers snprintf(extregex, sizeof(extregex),
1021b92435ccSAlan Somers "shutdown.*%d.*return,failure", pid);
1022b92435ccSAlan Somers
1023b92435ccSAlan Somers FILE *pipefd = setup(fds, auclass);
1024b92435ccSAlan Somers /* Failure reason: Invalid socket descriptor */
1025b92435ccSAlan Somers ATF_REQUIRE_EQ(-1, shutdown(-1, SHUT_RDWR));
1026b92435ccSAlan Somers check_audit(fds, extregex, pipefd);
1027b92435ccSAlan Somers }
1028b92435ccSAlan Somers
ATF_TC_CLEANUP(shutdown_failure,tc)1029b92435ccSAlan Somers ATF_TC_CLEANUP(shutdown_failure, tc)
1030b92435ccSAlan Somers {
1031b92435ccSAlan Somers cleanup();
1032b92435ccSAlan Somers }
1033b92435ccSAlan Somers
1034b92435ccSAlan Somers
1035b92435ccSAlan Somers ATF_TC_WITH_CLEANUP(sendfile_success);
ATF_TC_HEAD(sendfile_success,tc)1036b92435ccSAlan Somers ATF_TC_HEAD(sendfile_success, tc)
1037b92435ccSAlan Somers {
1038b92435ccSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1039b92435ccSAlan Somers "sendfile(2) call");
1040b92435ccSAlan Somers }
1041b92435ccSAlan Somers
ATF_TC_BODY(sendfile_success,tc)1042b92435ccSAlan Somers ATF_TC_BODY(sendfile_success, tc)
1043b92435ccSAlan Somers {
1044b92435ccSAlan Somers int filedesc;
1045b92435ccSAlan Somers ATF_REQUIRE((filedesc = open(path, O_CREAT | O_RDONLY, mode)) != -1);
1046b92435ccSAlan Somers /* Create a simple UNIX socket to send out random data */
1047b92435ccSAlan Somers ATF_REQUIRE((sockfd = socket(PF_UNIX, SOCK_STREAM, 0)) != -1);
1048b92435ccSAlan Somers /* Check the presence of sockfd, non-file in the audit record */
1049b92435ccSAlan Somers snprintf(extregex, sizeof(extregex),
1050b92435ccSAlan Somers "sendfile.*%#x,non-file.*return,success", filedesc);
1051b92435ccSAlan Somers
1052b92435ccSAlan Somers FILE *pipefd = setup(fds, auclass);
1053b92435ccSAlan Somers ATF_REQUIRE_EQ(0, sendfile(filedesc, sockfd, 0, 0, NULL, NULL, 0));
1054b92435ccSAlan Somers check_audit(fds, extregex, pipefd);
1055b92435ccSAlan Somers
1056b92435ccSAlan Somers /* Teardown socket and file descriptors */
1057b92435ccSAlan Somers close_sockets(2, sockfd, filedesc);
1058b92435ccSAlan Somers }
1059b92435ccSAlan Somers
ATF_TC_CLEANUP(sendfile_success,tc)1060b92435ccSAlan Somers ATF_TC_CLEANUP(sendfile_success, tc)
1061b92435ccSAlan Somers {
1062b92435ccSAlan Somers cleanup();
1063b92435ccSAlan Somers }
1064b92435ccSAlan Somers
1065b92435ccSAlan Somers
1066b92435ccSAlan Somers ATF_TC_WITH_CLEANUP(sendfile_failure);
ATF_TC_HEAD(sendfile_failure,tc)1067b92435ccSAlan Somers ATF_TC_HEAD(sendfile_failure, tc)
1068b92435ccSAlan Somers {
1069b92435ccSAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1070b92435ccSAlan Somers "sendfile(2) call");
1071b92435ccSAlan Somers }
1072b92435ccSAlan Somers
ATF_TC_BODY(sendfile_failure,tc)1073b92435ccSAlan Somers ATF_TC_BODY(sendfile_failure, tc)
1074b92435ccSAlan Somers {
1075b92435ccSAlan Somers pid = getpid();
1076b92435ccSAlan Somers snprintf(extregex, sizeof(extregex),
1077b92435ccSAlan Somers "sendfile.*%d.*return,failure", pid);
1078b92435ccSAlan Somers FILE *pipefd = setup(fds, auclass);
1079b92435ccSAlan Somers ATF_REQUIRE_EQ(-1, sendfile(-1, -1, 0, 0, NULL, NULL, 0));
1080b92435ccSAlan Somers check_audit(fds, extregex, pipefd);
1081b92435ccSAlan Somers }
1082b92435ccSAlan Somers
ATF_TC_CLEANUP(sendfile_failure,tc)1083b92435ccSAlan Somers ATF_TC_CLEANUP(sendfile_failure, tc)
1084b92435ccSAlan Somers {
1085b92435ccSAlan Somers cleanup();
1086b92435ccSAlan Somers }
1087b92435ccSAlan Somers
1088b92435ccSAlan Somers
1089*55cd4523SAlan Somers ATF_TC_WITH_CLEANUP(setfib_success);
ATF_TC_HEAD(setfib_success,tc)1090*55cd4523SAlan Somers ATF_TC_HEAD(setfib_success, tc)
1091*55cd4523SAlan Somers {
1092*55cd4523SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1093*55cd4523SAlan Somers "setfib(2) call");
1094*55cd4523SAlan Somers }
1095*55cd4523SAlan Somers
ATF_TC_BODY(setfib_success,tc)1096*55cd4523SAlan Somers ATF_TC_BODY(setfib_success, tc)
1097*55cd4523SAlan Somers {
1098*55cd4523SAlan Somers pid = getpid();
1099*55cd4523SAlan Somers snprintf(extregex, sizeof(extregex), "setfib.*%d.*return,success", pid);
1100*55cd4523SAlan Somers
1101*55cd4523SAlan Somers FILE *pipefd = setup(fds, auclass);
1102*55cd4523SAlan Somers ATF_REQUIRE_EQ(0, setfib(0));
1103*55cd4523SAlan Somers check_audit(fds, extregex, pipefd);
1104*55cd4523SAlan Somers }
1105*55cd4523SAlan Somers
ATF_TC_CLEANUP(setfib_success,tc)1106*55cd4523SAlan Somers ATF_TC_CLEANUP(setfib_success, tc)
1107*55cd4523SAlan Somers {
1108*55cd4523SAlan Somers cleanup();
1109*55cd4523SAlan Somers }
1110*55cd4523SAlan Somers
1111*55cd4523SAlan Somers
1112*55cd4523SAlan Somers ATF_TC_WITH_CLEANUP(setfib_failure);
ATF_TC_HEAD(setfib_failure,tc)1113*55cd4523SAlan Somers ATF_TC_HEAD(setfib_failure, tc)
1114*55cd4523SAlan Somers {
1115*55cd4523SAlan Somers atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1116*55cd4523SAlan Somers "setfib(2) call");
1117*55cd4523SAlan Somers }
1118*55cd4523SAlan Somers
ATF_TC_BODY(setfib_failure,tc)1119*55cd4523SAlan Somers ATF_TC_BODY(setfib_failure, tc)
1120*55cd4523SAlan Somers {
1121*55cd4523SAlan Somers pid = getpid();
1122*55cd4523SAlan Somers snprintf(extregex, sizeof(extregex), "setfib.*%d.*return,failure", pid);
1123*55cd4523SAlan Somers
1124*55cd4523SAlan Somers FILE *pipefd = setup(fds, auclass);
1125*55cd4523SAlan Somers ATF_REQUIRE_EQ(-1, setfib(-1));
1126*55cd4523SAlan Somers check_audit(fds, extregex, pipefd);
1127*55cd4523SAlan Somers }
1128*55cd4523SAlan Somers
ATF_TC_CLEANUP(setfib_failure,tc)1129*55cd4523SAlan Somers ATF_TC_CLEANUP(setfib_failure, tc)
1130*55cd4523SAlan Somers {
1131*55cd4523SAlan Somers cleanup();
1132*55cd4523SAlan Somers }
1133*55cd4523SAlan Somers
1134*55cd4523SAlan Somers
ATF_TP_ADD_TCS(tp)1135ad2afa8cSAlan Somers ATF_TP_ADD_TCS(tp)
1136ad2afa8cSAlan Somers {
1137ad2afa8cSAlan Somers ATF_TP_ADD_TC(tp, socket_success);
1138ad2afa8cSAlan Somers ATF_TP_ADD_TC(tp, socket_failure);
1139ad2afa8cSAlan Somers ATF_TP_ADD_TC(tp, socketpair_success);
1140ad2afa8cSAlan Somers ATF_TP_ADD_TC(tp, socketpair_failure);
1141ad2afa8cSAlan Somers ATF_TP_ADD_TC(tp, setsockopt_success);
1142ad2afa8cSAlan Somers ATF_TP_ADD_TC(tp, setsockopt_failure);
1143ad2afa8cSAlan Somers
1144babaf5cbSAlan Somers ATF_TP_ADD_TC(tp, bind_success);
1145babaf5cbSAlan Somers ATF_TP_ADD_TC(tp, bind_failure);
1146babaf5cbSAlan Somers ATF_TP_ADD_TC(tp, bindat_success);
1147babaf5cbSAlan Somers ATF_TP_ADD_TC(tp, bindat_failure);
1148babaf5cbSAlan Somers ATF_TP_ADD_TC(tp, listen_success);
1149babaf5cbSAlan Somers ATF_TP_ADD_TC(tp, listen_failure);
1150babaf5cbSAlan Somers
1151b84a044bSAlan Somers ATF_TP_ADD_TC(tp, connect_success);
1152b84a044bSAlan Somers ATF_TP_ADD_TC(tp, connect_failure);
1153b84a044bSAlan Somers ATF_TP_ADD_TC(tp, connectat_success);
1154b84a044bSAlan Somers ATF_TP_ADD_TC(tp, connectat_failure);
1155b84a044bSAlan Somers ATF_TP_ADD_TC(tp, accept_success);
1156b84a044bSAlan Somers ATF_TP_ADD_TC(tp, accept_failure);
1157b84a044bSAlan Somers
1158943f585cSAlan Somers ATF_TP_ADD_TC(tp, send_success);
1159943f585cSAlan Somers ATF_TP_ADD_TC(tp, send_failure);
1160943f585cSAlan Somers ATF_TP_ADD_TC(tp, recv_success);
1161943f585cSAlan Somers ATF_TP_ADD_TC(tp, recv_failure);
1162943f585cSAlan Somers
1163943f585cSAlan Somers ATF_TP_ADD_TC(tp, sendto_success);
1164943f585cSAlan Somers ATF_TP_ADD_TC(tp, sendto_failure);
1165943f585cSAlan Somers ATF_TP_ADD_TC(tp, recvfrom_success);
1166943f585cSAlan Somers ATF_TP_ADD_TC(tp, recvfrom_failure);
1167943f585cSAlan Somers
1168b92435ccSAlan Somers ATF_TP_ADD_TC(tp, sendmsg_success);
1169b92435ccSAlan Somers ATF_TP_ADD_TC(tp, sendmsg_failure);
1170b92435ccSAlan Somers ATF_TP_ADD_TC(tp, recvmsg_success);
1171b92435ccSAlan Somers ATF_TP_ADD_TC(tp, recvmsg_failure);
1172b92435ccSAlan Somers
1173b92435ccSAlan Somers ATF_TP_ADD_TC(tp, shutdown_success);
1174b92435ccSAlan Somers ATF_TP_ADD_TC(tp, shutdown_failure);
1175b92435ccSAlan Somers ATF_TP_ADD_TC(tp, sendfile_success);
1176b92435ccSAlan Somers ATF_TP_ADD_TC(tp, sendfile_failure);
1177*55cd4523SAlan Somers ATF_TP_ADD_TC(tp, setfib_success);
1178*55cd4523SAlan Somers ATF_TP_ADD_TC(tp, setfib_failure);
1179b92435ccSAlan Somers
1180ad2afa8cSAlan Somers return (atf_no_error());
1181ad2afa8cSAlan Somers }
1182