1*50c1baceSchristos /* $NetBSD: sockaddrtest.c,v 1.3 2022/10/09 21:41:04 christos Exp $ */
2067f5680Schristos
3a6f3f22fSchristos
4a6f3f22fSchristos #include "config.h"
5a6f3f22fSchristos #include "ntp.h"
6a6f3f22fSchristos #include "ntp_stdlib.h"
7a6f3f22fSchristos #include "sockaddrtest.h"
8a6f3f22fSchristos
9a6f3f22fSchristos sockaddr_u
CreateSockaddr4(const char * address,unsigned int port)10a6f3f22fSchristos CreateSockaddr4(const char* address, unsigned int port) {
11a6f3f22fSchristos sockaddr_u s;
12a6f3f22fSchristos s.sa4.sin_family = AF_INET;
13a6f3f22fSchristos s.sa4.sin_addr.s_addr = inet_addr(address);
14a6f3f22fSchristos SET_PORT(&s, port);
15a6f3f22fSchristos
16a6f3f22fSchristos return s;
17a6f3f22fSchristos }
18a6f3f22fSchristos
19a6f3f22fSchristos
20a6f3f22fSchristos int
IsEqual(const sockaddr_u expected,const sockaddr_u actual)21a6f3f22fSchristos IsEqual(const sockaddr_u expected, const sockaddr_u actual) {
22a6f3f22fSchristos struct in_addr in;
23a6f3f22fSchristos struct in6_addr in6;
24a6f3f22fSchristos
25a6f3f22fSchristos if (expected.sa.sa_family != actual.sa.sa_family) {
26a6f3f22fSchristos printf("Expected sa_family: %d but got: %d", expected.sa.sa_family, actual.sa.sa_family);
27a6f3f22fSchristos return FALSE;
28a6f3f22fSchristos }
29a6f3f22fSchristos
30a6f3f22fSchristos if (actual.sa.sa_family == AF_INET) { // IPv4
31*50c1baceSchristos if ( expected.sa4.sin_port == actual.sa4.sin_port
32*50c1baceSchristos && memcmp(&expected.sa4.sin_addr, &actual.sa4.sin_addr,
33a6f3f22fSchristos sizeof( in )) == 0) {
34a6f3f22fSchristos return TRUE;
35a6f3f22fSchristos } else {
36067f5680Schristos char buf[4][32];
37067f5680Schristos strlcpy(buf[0], inet_ntoa(expected.sa4.sin_addr), sizeof(buf[0]));
38067f5680Schristos strlcpy(buf[1], socktoa(&expected) , sizeof(buf[1]));
39067f5680Schristos strlcpy(buf[2], inet_ntoa(actual.sa4.sin_addr) , sizeof(buf[2]));
40067f5680Schristos strlcpy(buf[3], socktoa(&actual) , sizeof(buf[3]));
41067f5680Schristos printf("IPv4 comparision failed, expected: %s(%s) but was: %s(%s)",
42067f5680Schristos buf[0], buf[1], buf[2], buf[3]);
43a6f3f22fSchristos return FALSE;
44a6f3f22fSchristos }
45a6f3f22fSchristos } else if (actual.sa.sa_family == AF_INET6) { //IPv6
46*50c1baceSchristos if ( expected.sa6.sin6_port == actual.sa6.sin6_port
47*50c1baceSchristos && expected.sa6.sin6_scope_id == actual.sa6.sin6_scope_id
48*50c1baceSchristos && memcmp(&expected.sa6.sin6_addr, &actual.sa6.sin6_addr,
49a6f3f22fSchristos sizeof(in6)) == 0) {
50a6f3f22fSchristos return TRUE;
51a6f3f22fSchristos } else {
52a6f3f22fSchristos printf("IPv6 comparision failed");
53a6f3f22fSchristos return FALSE;
54a6f3f22fSchristos }
55a6f3f22fSchristos } else { // Unknown family
56a6f3f22fSchristos printf("Unknown sa_family: %d",actual.sa.sa_family);
57a6f3f22fSchristos return FALSE;
58a6f3f22fSchristos }
59a6f3f22fSchristos }
60a6f3f22fSchristos
61