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