xref: /netbsd-src/external/bsd/ntp/dist/tests/libntp/sockaddrtest.c (revision 50c1bace9687b37ab860a3ac85b157d33cb3f3d6)
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