]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/netbsd-tests/net/net/t_udp.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / netbsd-tests / net / net / t_udp.c
1 #include <sys/cdefs.h>
2 __RCSID("$NetBSD: t_udp.c,v 1.2 2013/01/06 02:22:50 christos Exp $");
3
4 #include <sys/socket.h>
5 #include <netinet/in.h>
6
7 #include <netdb.h>
8 #include <string.h>
9 #include <errno.h>
10 #include <unistd.h>
11
12 #include <atf-c.h>
13
14 static const char msg[] = "sendto test";
15
16 static void
17 sendit(int family)
18 {
19         struct addrinfo hints;
20         struct addrinfo *res;
21         int             S, s;
22         int             e;
23
24         /* lookup localhost addr, depending on argv[1] */
25         memset(&hints, 0, sizeof(hints));
26         hints.ai_family = family;
27         hints.ai_socktype = SOCK_DGRAM;
28         hints.ai_protocol = IPPROTO_UDP;
29         hints.ai_flags = 0;
30
31         e = getaddrinfo("localhost", "9999", &hints, &res);
32         ATF_REQUIRE_MSG(e == 0, "getaddrinfo AF=%d: %s", family,
33             gai_strerror(e));
34
35         /* server socket */
36         S = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
37         ATF_REQUIRE_MSG(S >= 0, "server-socket AF=%d: %s", family,
38             strerror(errno));
39
40         e = bind(S, res->ai_addr, res->ai_addrlen);
41         ATF_REQUIRE_MSG(e == 0, "bind AF=%d: %s", family,
42             strerror(errno));
43
44         /* client socket */
45         s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
46         ATF_REQUIRE_MSG(s >= 0, "client-socket AF=%d: %s", family,
47             strerror(errno));
48
49         /* sendto */
50         e = sendto(s, msg, sizeof(msg), 0, res->ai_addr, res->ai_addrlen);
51         ATF_REQUIRE_MSG(e == sizeof(msg), "sendto(1) AF=%d: %s", family,
52             strerror(errno));
53
54         e = sendto(s, msg, sizeof(msg), 0, res->ai_addr, res->ai_addrlen);
55         ATF_REQUIRE_MSG(e == sizeof(msg), "sendto(2) AF=%d: %s", family,
56             strerror(errno));
57
58         /* connect + send */
59         e = connect(s, res->ai_addr, res->ai_addrlen);
60         ATF_REQUIRE_MSG(e == 0, "connect(1) AF=%d: %s", family,
61             strerror(errno));
62
63         e = send(s, msg, sizeof(msg), 0);
64         ATF_REQUIRE_MSG(e == sizeof(msg), "send(1) AF=%d: %s", family,
65             strerror(errno));
66
67         e = connect(s, res->ai_addr, res->ai_addrlen);
68         ATF_REQUIRE_MSG(e == 0, "connect(2) AF=%d: %s", family,
69             strerror(errno));
70
71         e = send(s, msg, sizeof(msg), 0);
72         ATF_REQUIRE_MSG(e == sizeof(msg), "send(2) AF=%d: %s", family,
73             strerror(errno));
74
75         close(s);
76 }
77
78 ATF_TC(udp4_send);
79 ATF_TC_HEAD(udp4_send, tc)
80 {
81
82         atf_tc_set_md_var(tc, "descr", "Check that inet4 udp send works both"
83             " for connected and unconnected sockets");
84 }
85
86 ATF_TC_BODY(udp4_send, tc)
87 {
88         sendit(AF_INET);
89 }
90
91 ATF_TC(udp6_send);
92 ATF_TC_HEAD(udp6_send, tc)
93 {
94
95         atf_tc_set_md_var(tc, "descr", "Check that inet6 udp send works both"
96             " for connected and unconnected sockets");
97 }
98
99 ATF_TC_BODY(udp6_send, tc)
100 {
101         sendit(AF_INET6);
102 }
103
104 ATF_TP_ADD_TCS(tp)
105 {
106
107         ATF_TP_ADD_TC(tp, udp4_send);
108         ATF_TP_ADD_TC(tp, udp6_send);
109         return atf_no_error();
110 }