]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
tests: (mkfds) add udp6 factory
authorMasatake YAMATO <yamato@redhat.com>
Sat, 18 Feb 2023 15:52:27 +0000 (00:52 +0900)
committerMasatake YAMATO <yamato@redhat.com>
Sun, 26 Feb 2023 08:26:13 +0000 (17:26 +0900)
Signed-off-by: Masatake YAMATO <yamato@redhat.com>
tests/helpers/test_mkfds.c

index 5eebff555fe61e834e5b278885dccaaf9777bc17..088e92682b71dee1d8846b8cc2accd8e9667b701 100644 (file)
@@ -1390,8 +1390,12 @@ static void *make_tcp(const struct factory *factory, struct fdesc fdescs[],
                               (struct sockaddr *)&sin, (struct sockaddr *)&cin);
 }
 
-static void *make_udp(const struct factory *factory, struct fdesc fdescs[],
-                                   int argc, char ** argv)
+static void *make_udp_common(const struct factory *factory, struct fdesc fdescs[],
+                            int argc, char ** argv,
+                            int family,
+                            void (*init_addr)(struct sockaddr *, unsigned short),
+                            size_t addr_size,
+                            struct sockaddr * sin, struct sockaddr * cin)
 {
        struct arg server_port = decode_arg("server-port", factory->params, argc, argv);
        unsigned short iserver_port = (unsigned short)ARG_INTEGER(server_port);
@@ -1405,7 +1409,6 @@ static void *make_udp(const struct factory *factory, struct fdesc fdescs[],
        struct arg client_do_connect = decode_arg("client-do-connect", factory->params, argc, argv);
        bool bclient_do_connect = ARG_BOOLEAN(client_do_connect);
 
-       struct sockaddr_in sin, cin;
        int ssd, csd;
 
        const int y = 1;
@@ -1416,7 +1419,7 @@ static void *make_udp(const struct factory *factory, struct fdesc fdescs[],
        free_arg(&server_port);
        free_arg(&client_port);
 
-       ssd = socket(AF_INET, SOCK_DGRAM, 0);
+       ssd = socket(family, SOCK_DGRAM, 0);
        if (ssd < 0)
                err(EXIT_FAILURE,
                    _("failed to make a udp socket for server"));
@@ -1440,12 +1443,9 @@ static void *make_udp(const struct factory *factory, struct fdesc fdescs[],
                ssd = fdescs[0].fd;
        }
 
-       memset(&sin, 0, sizeof(sin));
-       sin.sin_family = AF_INET;
-       sin.sin_port = htons(iserver_port);
-       sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+       init_addr(sin, iserver_port);
        if (bserver_do_bind) {
-               if (bind(ssd, &sin, sizeof(sin)) < 0) {
+               if (bind(ssd, sin, addr_size) < 0) {
                        int e = errno;
                        close(ssd);
                        errno = e;
@@ -1453,7 +1453,7 @@ static void *make_udp(const struct factory *factory, struct fdesc fdescs[],
                }
        }
 
-       csd = socket(AF_INET, SOCK_DGRAM, 0);
+       csd = socket(family, SOCK_DGRAM, 0);
        if (csd < 0) {
                int e = errno;
                close(ssd);
@@ -1484,11 +1484,8 @@ static void *make_udp(const struct factory *factory, struct fdesc fdescs[],
        }
 
        if (bclient_do_bind) {
-               memset(&cin, 0, sizeof(cin));
-               cin.sin_family = AF_INET;
-               cin.sin_port = htons(iclient_port);
-               cin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-               if (bind(csd, &cin, sizeof(cin)) < 0) {
+               init_addr(cin, iclient_port);
+               if (bind(csd, cin, addr_size) < 0) {
                        int e = errno;
                        close(ssd);
                        close(csd);
@@ -1498,7 +1495,7 @@ static void *make_udp(const struct factory *factory, struct fdesc fdescs[],
        }
 
        if (bclient_do_connect) {
-               if (connect(csd, &sin, sizeof(sin)) < 0) {
+               if (connect(csd, sin, addr_size) < 0) {
                        int e = errno;
                        close(ssd);
                        close(csd);
@@ -1521,6 +1518,16 @@ static void *make_udp(const struct factory *factory, struct fdesc fdescs[],
        return NULL;
 }
 
+static void *make_udp(const struct factory *factory, struct fdesc fdescs[],
+                                   int argc, char ** argv)
+{
+       struct sockaddr_in sin, cin;
+       return make_udp_common(factory, fdescs, argc, argv,
+                              AF_INET,
+                              tcp_init_addr, sizeof(sin),
+                              (struct sockaddr *)&sin, (struct sockaddr *)&cin);
+}
+
 static void *make_raw(const struct factory *factory, struct fdesc fdescs[],
                                    int argc, char ** argv)
 {
@@ -1594,6 +1601,16 @@ static void *make_tcp6(const struct factory *factory, struct fdesc fdescs[],
                               (struct sockaddr *)&sin, (struct sockaddr *)&cin);
 }
 
+static void *make_udp6(const struct factory *factory, struct fdesc fdescs[],
+                      int argc, char ** argv)
+{
+       struct sockaddr_in6 sin, cin;
+       return make_udp_common(factory, fdescs, argc, argv,
+                              AF_INET6,
+                              tcp6_init_addr, sizeof(sin),
+                              (struct sockaddr *)&sin, (struct sockaddr *)&cin);
+}
+
 static void *make_netns(const struct factory *factory _U_, struct fdesc fdescs[],
                        int argc _U_, char ** argv _U_)
 {
@@ -2025,6 +2042,47 @@ static const struct factory factories[] = {
                        PARAM_END
                }
        },
+       {
+               .name = "udp6",
+               .desc = "AF_INET6+SOCK_DGRAM sockets",
+               .priv = false,
+               .N    = 2,
+               .EX_N = 0,
+               .make = make_udp6,
+               .params = (struct parameter []) {
+                       {
+                               .name = "server-port",
+                               .type = PTYPE_INTEGER,
+                               .desc = "UDP port the server may listen",
+                               .defv.integer = 12345,
+                       },
+                       {
+                               .name = "client-port",
+                               .type = PTYPE_INTEGER,
+                               .desc = "UDP port the client may bind",
+                               .defv.integer = 23456,
+                       },
+                       {
+                               .name = "server-do-bind",
+                               .type = PTYPE_BOOLEAN,
+                               .desc = "call bind with the server socket",
+                               .defv.boolean = true,
+                       },
+                       {
+                               .name = "client-do-bind",
+                               .type = PTYPE_BOOLEAN,
+                               .desc = "call bind with the client socket",
+                               .defv.boolean = true,
+                       },
+                       {
+                               .name = "client-do-connect",
+                               .type = PTYPE_BOOLEAN,
+                               .desc = "call connect with the client socket",
+                               .defv.boolean = true,
+                       },
+                       PARAM_END
+               }
+       },
        {
                .name = "netns",
                .desc = "open a file specifying a netns",