minix/minix/tests/test81.c
David van Moolenbroek ea69bfc71d tests: resolve new compiler warnings
Change-Id: I57f6602a9fe9e8524f7da4320b0d1a46889b90d6
2015-07-28 14:18:35 +00:00

134 lines
3.7 KiB
C

/*
* test81: use the functions originally written for test56 to test UDP
*/
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include "common.h"
#include "common-socket.h"
#define PORT1 4321
#define PORT2 4322
static void callback_check_sockaddr(const struct sockaddr *sockaddr,
socklen_t sockaddrlen, const char *callname, int addridx) {
char buf[256];
int port;
const struct sockaddr_in *sockaddr_in =
(const struct sockaddr_in *) sockaddr;
switch (addridx) {
case 1: port = PORT1; break;
case 2: port = PORT2; break;
default:
fprintf(stderr, "error: invalid addridx %d in "
"callback_check_sockaddr\n", addridx);
abort();
}
if (sockaddr_in->sin_family != AF_INET ||
sockaddr_in->sin_port != htons(port)) {
snprintf(buf, sizeof(buf), "%s() didn't return the right addr",
callname);
test_fail(buf);
memset(buf, 0, sizeof(buf));
inet_ntop(sockaddr_in->sin_family, &sockaddr_in->sin_addr,
buf, sizeof(buf));
fprintf(stderr, "exp: localhost:%d | got: %s:%d\n", port, buf,
ntohs(sockaddr_in->sin_port));
}
}
static void callback_cleanup(void) {
/* nothing to do */
}
int main(int argc, char *argv[])
{
struct sockaddr_in clientaddr = {
.sin_family = AF_INET,
.sin_port = htons(PORT1),
.sin_addr = { .s_addr = htonl(INADDR_LOOPBACK) },
};
struct sockaddr_in clientaddr2 = {
.sin_family = AF_INET,
.sin_port = htons(PORT2),
.sin_addr = { .s_addr = htonl(INADDR_LOOPBACK) },
};
struct sockaddr_in serveraddr = {
.sin_family = AF_INET,
.sin_port = htons(PORT1),
.sin_addr = { .s_addr = htonl(INADDR_ANY) },
};
struct sockaddr_in serveraddr2 = {
.sin_family = AF_INET,
.sin_port = htons(PORT2),
.sin_addr = { .s_addr = htonl(INADDR_ANY) },
};
const struct socket_test_info info = {
.clientaddr = (struct sockaddr *) &clientaddr,
.clientaddrlen = sizeof(clientaddr),
.clientaddr2 = (struct sockaddr *) &clientaddr2,
.clientaddr2len = sizeof(clientaddr2),
.clientaddrsym = (struct sockaddr *) &clientaddr,
.clientaddrsymlen = sizeof(clientaddr),
.domain = PF_INET,
.expected_rcvbuf = -1,
.expected_sndbuf = -1,
.serveraddr = (struct sockaddr *) &serveraddr,
.serveraddrlen = sizeof(serveraddr),
.serveraddr2 = (struct sockaddr *) &serveraddr2,
.serveraddr2len = sizeof(serveraddr2),
.type = SOCK_DGRAM,
.types = &info.type,
.typecount = 1,
.bug_bind_in_use = 1,
.bug_bind_null = 1,
.bug_connect_after_close = 1,
.bug_shutdown = 1, /* UDP only problem */
.bug_shutdown_not_conn = 1,
.bug_shutdown_read = 1,
.bug_sockopt_rcvbuf = 1, /* UDP only problem */
.bug_sockopt_sndbuf = 1, /* UDP only problem */
.ignore_accept_delay = 1,
.ignore_connect_unaccepted = 1,
.ignore_connect_delay = 1,
.ignore_read_conn_reset = 1,
.ignore_select_delay = 1,
.ignore_send_waiting = 1,
.ignore_write_conn_reset = 1,
.callback_check_sockaddr = callback_check_sockaddr,
.callback_cleanup = callback_cleanup,
.callback_xfer_prepclient = NULL,
.callback_xfer_peercred = NULL,
};
debug("entering main()");
start(81);
test_socket(&info);
test_bind(&info);
test_getsockname(&info);
test_shutdown(&info);
test_close(&info);
test_dup(&info);
test_dup2(&info);
test_shutdown(&info);
test_read(&info);
test_write(&info);
test_sockopts(&info);
test_simple_client_server(&info, info.type);
quit();
return -1; /* we should never get here */
}