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 } 111