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