0001
0002
0003 #define _GNU_SOURCE
0004 #include <sched.h>
0005
0006 #include <stddef.h>
0007 #include <stdio.h>
0008 #include <unistd.h>
0009
0010 #include <sys/socket.h>
0011 #include <sys/un.h>
0012
0013 #include "../../kselftest_harness.h"
0014
0015 FIXTURE(unix_connect)
0016 {
0017 int server, client;
0018 int family;
0019 };
0020
0021 FIXTURE_VARIANT(unix_connect)
0022 {
0023 int type;
0024 char sun_path[8];
0025 int len;
0026 int flags;
0027 int err;
0028 };
0029
0030 FIXTURE_VARIANT_ADD(unix_connect, stream_pathname)
0031 {
0032 .type = SOCK_STREAM,
0033 .sun_path = "test",
0034 .len = 4 + 1,
0035 .flags = 0,
0036 .err = 0,
0037 };
0038
0039 FIXTURE_VARIANT_ADD(unix_connect, stream_abstract)
0040 {
0041 .type = SOCK_STREAM,
0042 .sun_path = "\0test",
0043 .len = 5,
0044 .flags = 0,
0045 .err = 0,
0046 };
0047
0048 FIXTURE_VARIANT_ADD(unix_connect, stream_pathname_netns)
0049 {
0050 .type = SOCK_STREAM,
0051 .sun_path = "test",
0052 .len = 4 + 1,
0053 .flags = CLONE_NEWNET,
0054 .err = 0,
0055 };
0056
0057 FIXTURE_VARIANT_ADD(unix_connect, stream_abstract_netns)
0058 {
0059 .type = SOCK_STREAM,
0060 .sun_path = "\0test",
0061 .len = 5,
0062 .flags = CLONE_NEWNET,
0063 .err = ECONNREFUSED,
0064 };
0065
0066 FIXTURE_VARIANT_ADD(unix_connect, dgram_pathname)
0067 {
0068 .type = SOCK_DGRAM,
0069 .sun_path = "test",
0070 .len = 4 + 1,
0071 .flags = 0,
0072 .err = 0,
0073 };
0074
0075 FIXTURE_VARIANT_ADD(unix_connect, dgram_abstract)
0076 {
0077 .type = SOCK_DGRAM,
0078 .sun_path = "\0test",
0079 .len = 5,
0080 .flags = 0,
0081 .err = 0,
0082 };
0083
0084 FIXTURE_VARIANT_ADD(unix_connect, dgram_pathname_netns)
0085 {
0086 .type = SOCK_DGRAM,
0087 .sun_path = "test",
0088 .len = 4 + 1,
0089 .flags = CLONE_NEWNET,
0090 .err = 0,
0091 };
0092
0093 FIXTURE_VARIANT_ADD(unix_connect, dgram_abstract_netns)
0094 {
0095 .type = SOCK_DGRAM,
0096 .sun_path = "\0test",
0097 .len = 5,
0098 .flags = CLONE_NEWNET,
0099 .err = ECONNREFUSED,
0100 };
0101
0102 FIXTURE_SETUP(unix_connect)
0103 {
0104 self->family = AF_UNIX;
0105 }
0106
0107 FIXTURE_TEARDOWN(unix_connect)
0108 {
0109 close(self->server);
0110 close(self->client);
0111
0112 if (variant->sun_path[0])
0113 remove("test");
0114 }
0115
0116 TEST_F(unix_connect, test)
0117 {
0118 socklen_t addrlen;
0119 struct sockaddr_un addr = {
0120 .sun_family = self->family,
0121 };
0122 int err;
0123
0124 self->server = socket(self->family, variant->type, 0);
0125 ASSERT_NE(-1, self->server);
0126
0127 addrlen = offsetof(struct sockaddr_un, sun_path) + variant->len;
0128 memcpy(&addr.sun_path, variant->sun_path, variant->len);
0129
0130 err = bind(self->server, (struct sockaddr *)&addr, addrlen);
0131 ASSERT_EQ(0, err);
0132
0133 if (variant->type == SOCK_STREAM) {
0134 err = listen(self->server, 32);
0135 ASSERT_EQ(0, err);
0136 }
0137
0138 err = unshare(variant->flags);
0139 ASSERT_EQ(0, err);
0140
0141 self->client = socket(self->family, variant->type, 0);
0142 ASSERT_LT(0, self->client);
0143
0144 err = connect(self->client, (struct sockaddr *)&addr, addrlen);
0145 ASSERT_EQ(variant->err, err == -1 ? errno : 0);
0146 }
0147
0148 TEST_HARNESS_MAIN