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