1294d1590SErik van der Kouwe /*
2294d1590SErik van der Kouwe * test81: use the functions originally written for test56 to test UDP
3294d1590SErik van der Kouwe */
4294d1590SErik van der Kouwe
5294d1590SErik van der Kouwe #include <arpa/inet.h>
6294d1590SErik van der Kouwe #include <netinet/in.h>
7294d1590SErik van der Kouwe #include <stdio.h>
8294d1590SErik van der Kouwe #include <stdlib.h>
9294d1590SErik van der Kouwe #include <sys/socket.h>
10294d1590SErik van der Kouwe
11294d1590SErik van der Kouwe #include "common.h"
12294d1590SErik van der Kouwe #include "common-socket.h"
13294d1590SErik van der Kouwe
14294d1590SErik van der Kouwe #define PORT1 4321
15294d1590SErik van der Kouwe #define PORT2 4322
16294d1590SErik van der Kouwe
callback_check_sockaddr(const struct sockaddr * sockaddr,socklen_t sockaddrlen,const char * callname,int addridx)17294d1590SErik van der Kouwe static void callback_check_sockaddr(const struct sockaddr *sockaddr,
18294d1590SErik van der Kouwe socklen_t sockaddrlen, const char *callname, int addridx) {
19294d1590SErik van der Kouwe char buf[256];
20294d1590SErik van der Kouwe int port;
21294d1590SErik van der Kouwe const struct sockaddr_in *sockaddr_in =
22294d1590SErik van der Kouwe (const struct sockaddr_in *) sockaddr;
23294d1590SErik van der Kouwe
24294d1590SErik van der Kouwe switch (addridx) {
25294d1590SErik van der Kouwe case 1: port = PORT1; break;
26294d1590SErik van der Kouwe case 2: port = PORT2; break;
27294d1590SErik van der Kouwe default:
28294d1590SErik van der Kouwe fprintf(stderr, "error: invalid addridx %d in "
29294d1590SErik van der Kouwe "callback_check_sockaddr\n", addridx);
30294d1590SErik van der Kouwe abort();
31294d1590SErik van der Kouwe }
32294d1590SErik van der Kouwe
33294d1590SErik van der Kouwe if (sockaddr_in->sin_family != AF_INET ||
34294d1590SErik van der Kouwe sockaddr_in->sin_port != htons(port)) {
35294d1590SErik van der Kouwe snprintf(buf, sizeof(buf), "%s() didn't return the right addr",
36294d1590SErik van der Kouwe callname);
37294d1590SErik van der Kouwe test_fail(buf);
38294d1590SErik van der Kouwe
39294d1590SErik van der Kouwe memset(buf, 0, sizeof(buf));
40294d1590SErik van der Kouwe inet_ntop(sockaddr_in->sin_family, &sockaddr_in->sin_addr,
41294d1590SErik van der Kouwe buf, sizeof(buf));
42294d1590SErik van der Kouwe fprintf(stderr, "exp: localhost:%d | got: %s:%d\n", port, buf,
43294d1590SErik van der Kouwe ntohs(sockaddr_in->sin_port));
44294d1590SErik van der Kouwe }
45294d1590SErik van der Kouwe }
46294d1590SErik van der Kouwe
callback_cleanup(void)47294d1590SErik van der Kouwe static void callback_cleanup(void) {
48294d1590SErik van der Kouwe /* nothing to do */
49294d1590SErik van der Kouwe }
50294d1590SErik van der Kouwe
main(int argc,char * argv[])51294d1590SErik van der Kouwe int main(int argc, char *argv[])
52294d1590SErik van der Kouwe {
53294d1590SErik van der Kouwe struct sockaddr_in clientaddr = {
54294d1590SErik van der Kouwe .sin_family = AF_INET,
55294d1590SErik van der Kouwe .sin_port = htons(PORT1),
56294d1590SErik van der Kouwe .sin_addr = { .s_addr = htonl(INADDR_LOOPBACK) },
57294d1590SErik van der Kouwe };
58294d1590SErik van der Kouwe struct sockaddr_in clientaddr2 = {
59294d1590SErik van der Kouwe .sin_family = AF_INET,
60294d1590SErik van der Kouwe .sin_port = htons(PORT2),
61294d1590SErik van der Kouwe .sin_addr = { .s_addr = htonl(INADDR_LOOPBACK) },
62294d1590SErik van der Kouwe };
63294d1590SErik van der Kouwe struct sockaddr_in serveraddr = {
64294d1590SErik van der Kouwe .sin_family = AF_INET,
65294d1590SErik van der Kouwe .sin_port = htons(PORT1),
66294d1590SErik van der Kouwe .sin_addr = { .s_addr = htonl(INADDR_ANY) },
67294d1590SErik van der Kouwe };
68294d1590SErik van der Kouwe struct sockaddr_in serveraddr2 = {
69294d1590SErik van der Kouwe .sin_family = AF_INET,
70294d1590SErik van der Kouwe .sin_port = htons(PORT2),
71294d1590SErik van der Kouwe .sin_addr = { .s_addr = htonl(INADDR_ANY) },
72294d1590SErik van der Kouwe };
73294d1590SErik van der Kouwe const struct socket_test_info info = {
74294d1590SErik van der Kouwe .clientaddr = (struct sockaddr *) &clientaddr,
75294d1590SErik van der Kouwe .clientaddrlen = sizeof(clientaddr),
76294d1590SErik van der Kouwe .clientaddr2 = (struct sockaddr *) &clientaddr2,
77294d1590SErik van der Kouwe .clientaddr2len = sizeof(clientaddr2),
78294d1590SErik van der Kouwe .clientaddrsym = (struct sockaddr *) &clientaddr,
79294d1590SErik van der Kouwe .clientaddrsymlen = sizeof(clientaddr),
80294d1590SErik van der Kouwe .domain = PF_INET,
81*ad920fc4SDavid van Moolenbroek .expected_rcvbuf = 32768,
82*ad920fc4SDavid van Moolenbroek .expected_sndbuf = 8192,
83294d1590SErik van der Kouwe .serveraddr = (struct sockaddr *) &serveraddr,
84294d1590SErik van der Kouwe .serveraddrlen = sizeof(serveraddr),
85294d1590SErik van der Kouwe .serveraddr2 = (struct sockaddr *) &serveraddr2,
86294d1590SErik van der Kouwe .serveraddr2len = sizeof(serveraddr2),
87294d1590SErik van der Kouwe .type = SOCK_DGRAM,
88294d1590SErik van der Kouwe .types = &info.type,
89294d1590SErik van der Kouwe .typecount = 1,
90294d1590SErik van der Kouwe .callback_check_sockaddr = callback_check_sockaddr,
91294d1590SErik van der Kouwe .callback_cleanup = callback_cleanup,
92294d1590SErik van der Kouwe .callback_xfer_prepclient = NULL,
93294d1590SErik van der Kouwe .callback_xfer_peercred = NULL,
94294d1590SErik van der Kouwe };
95294d1590SErik van der Kouwe
96294d1590SErik van der Kouwe debug("entering main()");
97294d1590SErik van der Kouwe
98294d1590SErik van der Kouwe start(81);
99294d1590SErik van der Kouwe
100294d1590SErik van der Kouwe test_socket(&info);
101294d1590SErik van der Kouwe test_bind(&info);
102294d1590SErik van der Kouwe test_getsockname(&info);
103294d1590SErik van der Kouwe test_shutdown(&info);
104294d1590SErik van der Kouwe test_close(&info);
105294d1590SErik van der Kouwe test_dup(&info);
106294d1590SErik van der Kouwe test_dup2(&info);
107294d1590SErik van der Kouwe test_shutdown(&info);
108294d1590SErik van der Kouwe test_read(&info);
109294d1590SErik van der Kouwe test_write(&info);
110294d1590SErik van der Kouwe test_sockopts(&info);
111294d1590SErik van der Kouwe test_simple_client_server(&info, info.type);
112294d1590SErik van der Kouwe
113294d1590SErik van der Kouwe quit();
114294d1590SErik van der Kouwe
115294d1590SErik van der Kouwe return -1; /* we should never get here */
116294d1590SErik van der Kouwe }
117