1 /* 2 * test81: use the functions originally written for test56 to test UDP 3 */ 4 5 #include <arpa/inet.h> 6 #include <netinet/in.h> 7 #include <stdio.h> 8 #include <stdlib.h> 9 #include <sys/socket.h> 10 11 #include "common.h" 12 #include "common-socket.h" 13 14 #define PORT1 4321 15 #define PORT2 4322 16 17 static void callback_check_sockaddr(const struct sockaddr *sockaddr, 18 socklen_t sockaddrlen, const char *callname, int addridx) { 19 char buf[256]; 20 int port; 21 const struct sockaddr_in *sockaddr_in = 22 (const struct sockaddr_in *) sockaddr; 23 24 switch (addridx) { 25 case 1: port = PORT1; break; 26 case 2: port = PORT2; break; 27 default: 28 fprintf(stderr, "error: invalid addridx %d in " 29 "callback_check_sockaddr\n", addridx); 30 abort(); 31 } 32 33 if (sockaddr_in->sin_family != AF_INET || 34 sockaddr_in->sin_port != htons(port)) { 35 snprintf(buf, sizeof(buf), "%s() didn't return the right addr", 36 callname); 37 test_fail(buf); 38 39 memset(buf, 0, sizeof(buf)); 40 inet_ntop(sockaddr_in->sin_family, &sockaddr_in->sin_addr, 41 buf, sizeof(buf)); 42 fprintf(stderr, "exp: localhost:%d | got: %s:%d\n", port, buf, 43 ntohs(sockaddr_in->sin_port)); 44 } 45 } 46 47 static void callback_cleanup(void) { 48 /* nothing to do */ 49 } 50 51 int main(int argc, char *argv[]) 52 { 53 struct sockaddr_in clientaddr = { 54 .sin_family = AF_INET, 55 .sin_port = htons(PORT1), 56 .sin_addr = { .s_addr = htonl(INADDR_LOOPBACK) }, 57 }; 58 struct sockaddr_in clientaddr2 = { 59 .sin_family = AF_INET, 60 .sin_port = htons(PORT2), 61 .sin_addr = { .s_addr = htonl(INADDR_LOOPBACK) }, 62 }; 63 struct sockaddr_in serveraddr = { 64 .sin_family = AF_INET, 65 .sin_port = htons(PORT1), 66 .sin_addr = { .s_addr = htonl(INADDR_ANY) }, 67 }; 68 struct sockaddr_in serveraddr2 = { 69 .sin_family = AF_INET, 70 .sin_port = htons(PORT2), 71 .sin_addr = { .s_addr = htonl(INADDR_ANY) }, 72 }; 73 const struct socket_test_info info = { 74 .clientaddr = (struct sockaddr *) &clientaddr, 75 .clientaddrlen = sizeof(clientaddr), 76 .clientaddr2 = (struct sockaddr *) &clientaddr2, 77 .clientaddr2len = sizeof(clientaddr2), 78 .clientaddrsym = (struct sockaddr *) &clientaddr, 79 .clientaddrsymlen = sizeof(clientaddr), 80 .domain = PF_INET, 81 .expected_rcvbuf = -1, 82 .expected_sndbuf = -1, 83 .serveraddr = (struct sockaddr *) &serveraddr, 84 .serveraddrlen = sizeof(serveraddr), 85 .serveraddr2 = (struct sockaddr *) &serveraddr2, 86 .serveraddr2len = sizeof(serveraddr2), 87 .type = SOCK_DGRAM, 88 .types = &info.type, 89 .typecount = 1, 90 91 .bug_bind_in_use = 1, 92 .bug_bind_null = 1, 93 .bug_connect_after_close = 1, 94 .bug_shutdown = 1, /* UDP only problem */ 95 .bug_shutdown_not_conn = 1, 96 .bug_shutdown_read = 1, 97 .bug_sockopt_rcvbuf = 1, /* UDP only problem */ 98 .bug_sockopt_sndbuf = 1, /* UDP only problem */ 99 .ignore_accept_delay = 1, 100 .ignore_connect_unaccepted = 1, 101 .ignore_connect_delay = 1, 102 .ignore_select_delay = 1, 103 .ignore_send_waiting = 1, 104 .ignore_write_conn_reset = 1, 105 106 .callback_check_sockaddr = callback_check_sockaddr, 107 .callback_cleanup = callback_cleanup, 108 .callback_xfer_prepclient = NULL, 109 .callback_xfer_peercred = NULL, 110 }; 111 112 debug("entering main()"); 113 114 start(81); 115 116 test_socket(&info); 117 test_bind(&info); 118 test_getsockname(&info); 119 test_shutdown(&info); 120 test_close(&info); 121 test_dup(&info); 122 test_dup2(&info); 123 test_shutdown(&info); 124 test_read(&info); 125 test_write(&info); 126 test_sockopts(&info); 127 test_simple_client_server(&info, info.type); 128 129 quit(); 130 131 return -1; /* we should never get here */ 132 } 133