xref: /minix3/minix/tests/test81.c (revision ad920fc485da86e45a88f73a98077b92da1288a3)
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