xref: /openbsd-src/regress/sys/kern/signal/sigio/sigio_socket.c (revision 6bcfccda660a0ea1c51395cf0b89694d927c87dd)
1*6bcfccdaSmpi /*	$OpenBSD: sigio_socket.c,v 1.1 2020/09/16 14:02:23 mpi Exp $	*/
2*6bcfccdaSmpi 
3*6bcfccdaSmpi /*
4*6bcfccdaSmpi  * Copyright (c) 2018 Visa Hankala
5*6bcfccdaSmpi  *
6*6bcfccdaSmpi  * Permission to use, copy, modify, and distribute this software for any
7*6bcfccdaSmpi  * purpose with or without fee is hereby granted, provided that the above
8*6bcfccdaSmpi  * copyright notice and this permission notice appear in all copies.
9*6bcfccdaSmpi  *
10*6bcfccdaSmpi  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11*6bcfccdaSmpi  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12*6bcfccdaSmpi  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13*6bcfccdaSmpi  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14*6bcfccdaSmpi  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15*6bcfccdaSmpi  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16*6bcfccdaSmpi  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*6bcfccdaSmpi  */
18*6bcfccdaSmpi 
19*6bcfccdaSmpi #include <sys/socket.h>
20*6bcfccdaSmpi #include <netinet/in.h>
21*6bcfccdaSmpi #include <netinet/tcp.h>
22*6bcfccdaSmpi #include <assert.h>
23*6bcfccdaSmpi #include <fcntl.h>
24*6bcfccdaSmpi #include <signal.h>
25*6bcfccdaSmpi #include <string.h>
26*6bcfccdaSmpi #include <unistd.h>
27*6bcfccdaSmpi 
28*6bcfccdaSmpi #include "common.h"
29*6bcfccdaSmpi 
30*6bcfccdaSmpi int
test_socket_badpgid(void)31*6bcfccdaSmpi test_socket_badpgid(void)
32*6bcfccdaSmpi {
33*6bcfccdaSmpi 	int fds[2];
34*6bcfccdaSmpi 
35*6bcfccdaSmpi 	assert(socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == 0);
36*6bcfccdaSmpi 	return test_common_badpgid(fds[0]);
37*6bcfccdaSmpi }
38*6bcfccdaSmpi 
39*6bcfccdaSmpi int
test_socket_badsession(void)40*6bcfccdaSmpi test_socket_badsession(void)
41*6bcfccdaSmpi {
42*6bcfccdaSmpi 	int fds[2];
43*6bcfccdaSmpi 
44*6bcfccdaSmpi 	assert(socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == 0);
45*6bcfccdaSmpi 	return test_common_badsession(fds[0]);
46*6bcfccdaSmpi }
47*6bcfccdaSmpi 
48*6bcfccdaSmpi int
test_socket_cansigio(void)49*6bcfccdaSmpi test_socket_cansigio(void)
50*6bcfccdaSmpi {
51*6bcfccdaSmpi 	int fds[2];
52*6bcfccdaSmpi 
53*6bcfccdaSmpi 	assert(socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == 0);
54*6bcfccdaSmpi 	return test_common_cansigio(fds);
55*6bcfccdaSmpi }
56*6bcfccdaSmpi 
57*6bcfccdaSmpi int
test_socket_getown(void)58*6bcfccdaSmpi test_socket_getown(void)
59*6bcfccdaSmpi {
60*6bcfccdaSmpi 	int fds[2];
61*6bcfccdaSmpi 
62*6bcfccdaSmpi 	assert(socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == 0);
63*6bcfccdaSmpi 	return test_common_getown(fds[0]);
64*6bcfccdaSmpi }
65*6bcfccdaSmpi 
66*6bcfccdaSmpi /*
67*6bcfccdaSmpi  * Test that the parent socket's signal target gets assigned to the socket
68*6bcfccdaSmpi  * of an accepted connection.
69*6bcfccdaSmpi  */
70*6bcfccdaSmpi int
test_socket_inherit(void)71*6bcfccdaSmpi test_socket_inherit(void)
72*6bcfccdaSmpi {
73*6bcfccdaSmpi 	struct sockaddr_in inaddr;
74*6bcfccdaSmpi 	socklen_t inaddrlen;
75*6bcfccdaSmpi 	pid_t pid;
76*6bcfccdaSmpi 	int cli, flags, sfd, sock;
77*6bcfccdaSmpi 
78*6bcfccdaSmpi 	sock = socket(AF_INET, SOCK_STREAM, 0);
79*6bcfccdaSmpi 	assert(sock != -1);
80*6bcfccdaSmpi 
81*6bcfccdaSmpi 	memset(&inaddr, 0, sizeof(inaddr));
82*6bcfccdaSmpi 	inaddr.sin_len = sizeof(inaddr);
83*6bcfccdaSmpi 	inaddr.sin_family = AF_INET;
84*6bcfccdaSmpi 	inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
85*6bcfccdaSmpi 	assert(bind(sock, (struct sockaddr *)&inaddr, sizeof(inaddr)) == 0);
86*6bcfccdaSmpi 	assert(listen(sock, 1) == 0);
87*6bcfccdaSmpi 
88*6bcfccdaSmpi 	flags = fcntl(sock, F_GETFL);
89*6bcfccdaSmpi 	assert(fcntl(sock, F_SETFL, flags | O_ASYNC) == 0);
90*6bcfccdaSmpi 
91*6bcfccdaSmpi 	if (test_fork(&pid, &sfd) == PARENT) {
92*6bcfccdaSmpi 		inaddrlen = sizeof(inaddr);
93*6bcfccdaSmpi 		cli = accept(sock, (struct sockaddr *)&inaddr, &inaddrlen);
94*6bcfccdaSmpi 		assert(cli != -1);
95*6bcfccdaSmpi 		assert(fcntl(cli, F_GETOWN) == 0);
96*6bcfccdaSmpi 		close(cli);
97*6bcfccdaSmpi 
98*6bcfccdaSmpi 		assert(fcntl(sock, F_SETOWN, getpid()) == 0);
99*6bcfccdaSmpi 		test_barrier(sfd);
100*6bcfccdaSmpi 
101*6bcfccdaSmpi 		inaddrlen = sizeof(inaddr);
102*6bcfccdaSmpi 		cli = accept(sock, (struct sockaddr *)&inaddr, &inaddrlen);
103*6bcfccdaSmpi 		assert(cli != -1);
104*6bcfccdaSmpi 		assert(fcntl(cli, F_GETOWN) == getpid());
105*6bcfccdaSmpi 		close(cli);
106*6bcfccdaSmpi 	} else {
107*6bcfccdaSmpi 		inaddrlen = sizeof(inaddr);
108*6bcfccdaSmpi 		assert(getsockname(sock, (struct sockaddr *)&inaddr,
109*6bcfccdaSmpi 		    &inaddrlen) == 0);
110*6bcfccdaSmpi 
111*6bcfccdaSmpi 		cli = socket(AF_INET, SOCK_STREAM, 0);
112*6bcfccdaSmpi 		assert(cli != -1);
113*6bcfccdaSmpi 		assert(connect(cli, (struct sockaddr *)&inaddr, sizeof(inaddr))
114*6bcfccdaSmpi 		    == 0);
115*6bcfccdaSmpi 		close(cli);
116*6bcfccdaSmpi 
117*6bcfccdaSmpi 		test_barrier(sfd);
118*6bcfccdaSmpi 
119*6bcfccdaSmpi 		cli = socket(AF_INET, SOCK_STREAM, 0);
120*6bcfccdaSmpi 		assert(cli != -1);
121*6bcfccdaSmpi 		assert(connect(cli, (struct sockaddr *)&inaddr, sizeof(inaddr))
122*6bcfccdaSmpi 		    == 0);
123*6bcfccdaSmpi 		close(cli);
124*6bcfccdaSmpi 	}
125*6bcfccdaSmpi 	return test_wait(pid, sfd);
126*6bcfccdaSmpi }
127*6bcfccdaSmpi 
128*6bcfccdaSmpi int
test_socket_read(void)129*6bcfccdaSmpi test_socket_read(void)
130*6bcfccdaSmpi {
131*6bcfccdaSmpi 	int fds[2];
132*6bcfccdaSmpi 
133*6bcfccdaSmpi 	assert(socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == 0);
134*6bcfccdaSmpi 	return test_common_read(fds);
135*6bcfccdaSmpi }
136*6bcfccdaSmpi 
137*6bcfccdaSmpi int
test_socket_write(void)138*6bcfccdaSmpi test_socket_write(void)
139*6bcfccdaSmpi {
140*6bcfccdaSmpi 	int fds[2];
141*6bcfccdaSmpi 
142*6bcfccdaSmpi 	assert(socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == 0);
143*6bcfccdaSmpi 	return test_common_write(fds);
144*6bcfccdaSmpi }
145