xref: /openbmc/linux/tools/testing/selftests/net/af_unix/unix_connect.c (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1e95ab1d8SKuniyuki Iwashima // SPDX-License-Identifier: GPL-2.0
2e95ab1d8SKuniyuki Iwashima 
3e95ab1d8SKuniyuki Iwashima #define _GNU_SOURCE
4e95ab1d8SKuniyuki Iwashima #include <sched.h>
5e95ab1d8SKuniyuki Iwashima 
6*f12b86c0SKuniyuki Iwashima #include <stddef.h>
7e95ab1d8SKuniyuki Iwashima #include <stdio.h>
8e95ab1d8SKuniyuki Iwashima #include <unistd.h>
9e95ab1d8SKuniyuki Iwashima 
10e95ab1d8SKuniyuki Iwashima #include <sys/socket.h>
11e95ab1d8SKuniyuki Iwashima #include <sys/un.h>
12e95ab1d8SKuniyuki Iwashima 
13e95ab1d8SKuniyuki Iwashima #include "../../kselftest_harness.h"
14e95ab1d8SKuniyuki Iwashima 
FIXTURE(unix_connect)15e95ab1d8SKuniyuki Iwashima FIXTURE(unix_connect)
16e95ab1d8SKuniyuki Iwashima {
17e95ab1d8SKuniyuki Iwashima 	int server, client;
18e95ab1d8SKuniyuki Iwashima 	int family;
19e95ab1d8SKuniyuki Iwashima };
20e95ab1d8SKuniyuki Iwashima 
FIXTURE_VARIANT(unix_connect)21e95ab1d8SKuniyuki Iwashima FIXTURE_VARIANT(unix_connect)
22e95ab1d8SKuniyuki Iwashima {
23e95ab1d8SKuniyuki Iwashima 	int type;
24e95ab1d8SKuniyuki Iwashima 	char sun_path[8];
25e95ab1d8SKuniyuki Iwashima 	int len;
26e95ab1d8SKuniyuki Iwashima 	int flags;
27e95ab1d8SKuniyuki Iwashima 	int err;
28e95ab1d8SKuniyuki Iwashima };
29e95ab1d8SKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(unix_connect,stream_pathname)30e95ab1d8SKuniyuki Iwashima FIXTURE_VARIANT_ADD(unix_connect, stream_pathname)
31e95ab1d8SKuniyuki Iwashima {
32e95ab1d8SKuniyuki Iwashima 	.type = SOCK_STREAM,
33e95ab1d8SKuniyuki Iwashima 	.sun_path = "test",
34e95ab1d8SKuniyuki Iwashima 	.len = 4 + 1,
35e95ab1d8SKuniyuki Iwashima 	.flags = 0,
36e95ab1d8SKuniyuki Iwashima 	.err = 0,
37e95ab1d8SKuniyuki Iwashima };
38e95ab1d8SKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(unix_connect,stream_abstract)39e95ab1d8SKuniyuki Iwashima FIXTURE_VARIANT_ADD(unix_connect, stream_abstract)
40e95ab1d8SKuniyuki Iwashima {
41e95ab1d8SKuniyuki Iwashima 	.type = SOCK_STREAM,
42e95ab1d8SKuniyuki Iwashima 	.sun_path = "\0test",
43e95ab1d8SKuniyuki Iwashima 	.len = 5,
44e95ab1d8SKuniyuki Iwashima 	.flags = 0,
45e95ab1d8SKuniyuki Iwashima 	.err = 0,
46e95ab1d8SKuniyuki Iwashima };
47e95ab1d8SKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(unix_connect,stream_pathname_netns)48e95ab1d8SKuniyuki Iwashima FIXTURE_VARIANT_ADD(unix_connect, stream_pathname_netns)
49e95ab1d8SKuniyuki Iwashima {
50e95ab1d8SKuniyuki Iwashima 	.type = SOCK_STREAM,
51e95ab1d8SKuniyuki Iwashima 	.sun_path = "test",
52e95ab1d8SKuniyuki Iwashima 	.len = 4 + 1,
53e95ab1d8SKuniyuki Iwashima 	.flags = CLONE_NEWNET,
54e95ab1d8SKuniyuki Iwashima 	.err = 0,
55e95ab1d8SKuniyuki Iwashima };
56e95ab1d8SKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(unix_connect,stream_abstract_netns)57e95ab1d8SKuniyuki Iwashima FIXTURE_VARIANT_ADD(unix_connect, stream_abstract_netns)
58e95ab1d8SKuniyuki Iwashima {
59e95ab1d8SKuniyuki Iwashima 	.type = SOCK_STREAM,
60e95ab1d8SKuniyuki Iwashima 	.sun_path = "\0test",
61e95ab1d8SKuniyuki Iwashima 	.len = 5,
62e95ab1d8SKuniyuki Iwashima 	.flags = CLONE_NEWNET,
63e95ab1d8SKuniyuki Iwashima 	.err = ECONNREFUSED,
64e95ab1d8SKuniyuki Iwashima };
65e95ab1d8SKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(unix_connect,dgram_pathname)66e95ab1d8SKuniyuki Iwashima FIXTURE_VARIANT_ADD(unix_connect, dgram_pathname)
67e95ab1d8SKuniyuki Iwashima {
68e95ab1d8SKuniyuki Iwashima 	.type = SOCK_DGRAM,
69e95ab1d8SKuniyuki Iwashima 	.sun_path = "test",
70e95ab1d8SKuniyuki Iwashima 	.len = 4 + 1,
71e95ab1d8SKuniyuki Iwashima 	.flags = 0,
72e95ab1d8SKuniyuki Iwashima 	.err = 0,
73e95ab1d8SKuniyuki Iwashima };
74e95ab1d8SKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(unix_connect,dgram_abstract)75e95ab1d8SKuniyuki Iwashima FIXTURE_VARIANT_ADD(unix_connect, dgram_abstract)
76e95ab1d8SKuniyuki Iwashima {
77e95ab1d8SKuniyuki Iwashima 	.type = SOCK_DGRAM,
78e95ab1d8SKuniyuki Iwashima 	.sun_path = "\0test",
79e95ab1d8SKuniyuki Iwashima 	.len = 5,
80e95ab1d8SKuniyuki Iwashima 	.flags = 0,
81e95ab1d8SKuniyuki Iwashima 	.err = 0,
82e95ab1d8SKuniyuki Iwashima };
83e95ab1d8SKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(unix_connect,dgram_pathname_netns)84e95ab1d8SKuniyuki Iwashima FIXTURE_VARIANT_ADD(unix_connect, dgram_pathname_netns)
85e95ab1d8SKuniyuki Iwashima {
86e95ab1d8SKuniyuki Iwashima 	.type = SOCK_DGRAM,
87e95ab1d8SKuniyuki Iwashima 	.sun_path = "test",
88e95ab1d8SKuniyuki Iwashima 	.len = 4 + 1,
89e95ab1d8SKuniyuki Iwashima 	.flags = CLONE_NEWNET,
90e95ab1d8SKuniyuki Iwashima 	.err = 0,
91e95ab1d8SKuniyuki Iwashima };
92e95ab1d8SKuniyuki Iwashima 
FIXTURE_VARIANT_ADD(unix_connect,dgram_abstract_netns)93e95ab1d8SKuniyuki Iwashima FIXTURE_VARIANT_ADD(unix_connect, dgram_abstract_netns)
94e95ab1d8SKuniyuki Iwashima {
95e95ab1d8SKuniyuki Iwashima 	.type = SOCK_DGRAM,
96e95ab1d8SKuniyuki Iwashima 	.sun_path = "\0test",
97e95ab1d8SKuniyuki Iwashima 	.len = 5,
98e95ab1d8SKuniyuki Iwashima 	.flags = CLONE_NEWNET,
99e95ab1d8SKuniyuki Iwashima 	.err = ECONNREFUSED,
100e95ab1d8SKuniyuki Iwashima };
101e95ab1d8SKuniyuki Iwashima 
FIXTURE_SETUP(unix_connect)102e95ab1d8SKuniyuki Iwashima FIXTURE_SETUP(unix_connect)
103e95ab1d8SKuniyuki Iwashima {
104e95ab1d8SKuniyuki Iwashima 	self->family = AF_UNIX;
105e95ab1d8SKuniyuki Iwashima }
106e95ab1d8SKuniyuki Iwashima 
FIXTURE_TEARDOWN(unix_connect)107e95ab1d8SKuniyuki Iwashima FIXTURE_TEARDOWN(unix_connect)
108e95ab1d8SKuniyuki Iwashima {
109e95ab1d8SKuniyuki Iwashima 	close(self->server);
110e95ab1d8SKuniyuki Iwashima 	close(self->client);
111e95ab1d8SKuniyuki Iwashima 
112e95ab1d8SKuniyuki Iwashima 	if (variant->sun_path[0])
113e95ab1d8SKuniyuki Iwashima 		remove("test");
114e95ab1d8SKuniyuki Iwashima }
115e95ab1d8SKuniyuki Iwashima 
TEST_F(unix_connect,test)116e95ab1d8SKuniyuki Iwashima TEST_F(unix_connect, test)
117e95ab1d8SKuniyuki Iwashima {
118e95ab1d8SKuniyuki Iwashima 	socklen_t addrlen;
119e95ab1d8SKuniyuki Iwashima 	struct sockaddr_un addr = {
120e95ab1d8SKuniyuki Iwashima 		.sun_family = self->family,
121e95ab1d8SKuniyuki Iwashima 	};
122e95ab1d8SKuniyuki Iwashima 	int err;
123e95ab1d8SKuniyuki Iwashima 
124e95ab1d8SKuniyuki Iwashima 	self->server = socket(self->family, variant->type, 0);
125e95ab1d8SKuniyuki Iwashima 	ASSERT_NE(-1, self->server);
126e95ab1d8SKuniyuki Iwashima 
127e95ab1d8SKuniyuki Iwashima 	addrlen = offsetof(struct sockaddr_un, sun_path) + variant->len;
128e95ab1d8SKuniyuki Iwashima 	memcpy(&addr.sun_path, variant->sun_path, variant->len);
129e95ab1d8SKuniyuki Iwashima 
130e95ab1d8SKuniyuki Iwashima 	err = bind(self->server, (struct sockaddr *)&addr, addrlen);
131e95ab1d8SKuniyuki Iwashima 	ASSERT_EQ(0, err);
132e95ab1d8SKuniyuki Iwashima 
133e95ab1d8SKuniyuki Iwashima 	if (variant->type == SOCK_STREAM) {
134e95ab1d8SKuniyuki Iwashima 		err = listen(self->server, 32);
135e95ab1d8SKuniyuki Iwashima 		ASSERT_EQ(0, err);
136e95ab1d8SKuniyuki Iwashima 	}
137e95ab1d8SKuniyuki Iwashima 
138e95ab1d8SKuniyuki Iwashima 	err = unshare(variant->flags);
139e95ab1d8SKuniyuki Iwashima 	ASSERT_EQ(0, err);
140e95ab1d8SKuniyuki Iwashima 
141e95ab1d8SKuniyuki Iwashima 	self->client = socket(self->family, variant->type, 0);
142e95ab1d8SKuniyuki Iwashima 	ASSERT_LT(0, self->client);
143e95ab1d8SKuniyuki Iwashima 
144e95ab1d8SKuniyuki Iwashima 	err = connect(self->client, (struct sockaddr *)&addr, addrlen);
145e95ab1d8SKuniyuki Iwashima 	ASSERT_EQ(variant->err, err == -1 ? errno : 0);
146e95ab1d8SKuniyuki Iwashima }
147e95ab1d8SKuniyuki Iwashima 
148e95ab1d8SKuniyuki Iwashima TEST_HARNESS_MAIN
149