xref: /aosp_15_r20/external/libwebsockets/minimal-examples/api-tests/api-test-async-dns/main.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * lws-api-test-async-dns
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * Written in 2019 by Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker  *
6*1c60b9acSAndroid Build Coastguard Worker  * This file is made available under the Creative Commons CC0 1.0
7*1c60b9acSAndroid Build Coastguard Worker  * Universal Public Domain Dedication.
8*1c60b9acSAndroid Build Coastguard Worker  *
9*1c60b9acSAndroid Build Coastguard Worker  * This api test confirms various kinds of async dns apis
10*1c60b9acSAndroid Build Coastguard Worker  */
11*1c60b9acSAndroid Build Coastguard Worker 
12*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
13*1c60b9acSAndroid Build Coastguard Worker #include <signal.h>
14*1c60b9acSAndroid Build Coastguard Worker 
15*1c60b9acSAndroid Build Coastguard Worker static int interrupted, dtest, ok, fail, _exp = 26;
16*1c60b9acSAndroid Build Coastguard Worker struct lws_context *context;
17*1c60b9acSAndroid Build Coastguard Worker 
18*1c60b9acSAndroid Build Coastguard Worker /*
19*1c60b9acSAndroid Build Coastguard Worker  * These are used to test the apis to parse and print ipv4 / ipv6 literal
20*1c60b9acSAndroid Build Coastguard Worker  * address strings for various cases.
21*1c60b9acSAndroid Build Coastguard Worker  *
22*1c60b9acSAndroid Build Coastguard Worker  * Expected error cases are not used to test the ip data -> string api.
23*1c60b9acSAndroid Build Coastguard Worker  */
24*1c60b9acSAndroid Build Coastguard Worker 
25*1c60b9acSAndroid Build Coastguard Worker static const struct ipparser_tests {
26*1c60b9acSAndroid Build Coastguard Worker 	const char	*test;
27*1c60b9acSAndroid Build Coastguard Worker 	int		rlen;
28*1c60b9acSAndroid Build Coastguard Worker 	const char	*emit_test;
29*1c60b9acSAndroid Build Coastguard Worker 	int		emit_len;
30*1c60b9acSAndroid Build Coastguard Worker 	uint8_t		b[16];
31*1c60b9acSAndroid Build Coastguard Worker } ipt[] = {
32*1c60b9acSAndroid Build Coastguard Worker 	{ "2001:db8:85a3:0:0:8a2e:370:7334", 16,
33*1c60b9acSAndroid Build Coastguard Worker 	  "2001:db8:85a3::8a2e:370:7334", 28,
34*1c60b9acSAndroid Build Coastguard Worker 		{ 0x20, 0x01, 0x0d, 0xb8, 0x85, 0xa3, 0x00, 0x00,
35*1c60b9acSAndroid Build Coastguard Worker 		  0x00, 0x00, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x34 } },
36*1c60b9acSAndroid Build Coastguard Worker 
37*1c60b9acSAndroid Build Coastguard Worker 	{ "2001:db8:85a3::8a2e:370:7334", 16,
38*1c60b9acSAndroid Build Coastguard Worker 	  "2001:db8:85a3::8a2e:370:7334", 28,
39*1c60b9acSAndroid Build Coastguard Worker 		{ 0x20, 0x01, 0x0d, 0xb8, 0x85, 0xa3, 0x00, 0x00,
40*1c60b9acSAndroid Build Coastguard Worker 		  0x00, 0x00, 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x34 } },
41*1c60b9acSAndroid Build Coastguard Worker 
42*1c60b9acSAndroid Build Coastguard Worker 	{ "::1", 16, "::1", 3,
43*1c60b9acSAndroid Build Coastguard Worker 			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },
44*1c60b9acSAndroid Build Coastguard Worker 
45*1c60b9acSAndroid Build Coastguard Worker 	{ "::",  16, "::", 2,
46*1c60b9acSAndroid Build Coastguard Worker 			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
47*1c60b9acSAndroid Build Coastguard Worker 
48*1c60b9acSAndroid Build Coastguard Worker 	{ "::ffff:192.0.2.128", 16,  "::ffff:192.0.2.128", 18,
49*1c60b9acSAndroid Build Coastguard Worker 		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50*1c60b9acSAndroid Build Coastguard Worker 		  0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x02, 0x80 } },
51*1c60b9acSAndroid Build Coastguard Worker 
52*1c60b9acSAndroid Build Coastguard Worker 	{ "cats", -1, "", 0,
53*1c60b9acSAndroid Build Coastguard Worker 			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },
54*1c60b9acSAndroid Build Coastguard Worker 
55*1c60b9acSAndroid Build Coastguard Worker 	{ "onevalid.bogus.warmcat.com", -1, "", 0,
56*1c60b9acSAndroid Build Coastguard Worker 			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },
57*1c60b9acSAndroid Build Coastguard Worker 
58*1c60b9acSAndroid Build Coastguard Worker 	{ "1.cat.dog.com", -1, "", 0,
59*1c60b9acSAndroid Build Coastguard Worker 			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },
60*1c60b9acSAndroid Build Coastguard Worker 
61*1c60b9acSAndroid Build Coastguard Worker 	{ ":::1", -8, "", 0,
62*1c60b9acSAndroid Build Coastguard Worker 			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },
63*1c60b9acSAndroid Build Coastguard Worker 
64*1c60b9acSAndroid Build Coastguard Worker 	{ "0:0::0:1", 16, "::1", 3,
65*1c60b9acSAndroid Build Coastguard Worker 			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } },
66*1c60b9acSAndroid Build Coastguard Worker 
67*1c60b9acSAndroid Build Coastguard Worker 	{ "1.2.3.4", 4, "1.2.3.4", 7, { 1, 2, 3, 4 } },
68*1c60b9acSAndroid Build Coastguard Worker };
69*1c60b9acSAndroid Build Coastguard Worker 
70*1c60b9acSAndroid Build Coastguard Worker static const struct async_dns_tests {
71*1c60b9acSAndroid Build Coastguard Worker 	const char *dns_name;
72*1c60b9acSAndroid Build Coastguard Worker 	int recordtype;
73*1c60b9acSAndroid Build Coastguard Worker 	int addrlen;
74*1c60b9acSAndroid Build Coastguard Worker 	uint8_t ads[16];
75*1c60b9acSAndroid Build Coastguard Worker } adt[] = {
76*1c60b9acSAndroid Build Coastguard Worker 	{ "warmcat.com", LWS_ADNS_RECORD_A, 4,
77*1c60b9acSAndroid Build Coastguard Worker 		{ 46, 105, 127, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },
78*1c60b9acSAndroid Build Coastguard Worker 	{ "libwebsockets.org", LWS_ADNS_RECORD_A, 4,
79*1c60b9acSAndroid Build Coastguard Worker 		{ 46, 105, 127, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },
80*1c60b9acSAndroid Build Coastguard Worker 	{ "doesntexist", LWS_ADNS_RECORD_A, 0,
81*1c60b9acSAndroid Build Coastguard Worker 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },
82*1c60b9acSAndroid Build Coastguard Worker 	{ "localhost", LWS_ADNS_RECORD_A, 4,
83*1c60b9acSAndroid Build Coastguard Worker 		{ 127, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },
84*1c60b9acSAndroid Build Coastguard Worker 	{ "ipv4only.warmcat.com", LWS_ADNS_RECORD_A, 4,
85*1c60b9acSAndroid Build Coastguard Worker 		{ 46, 105, 127, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },
86*1c60b9acSAndroid Build Coastguard Worker 	{ "onevalid.bogus.warmcat.com", LWS_ADNS_RECORD_A, 4,
87*1c60b9acSAndroid Build Coastguard Worker 		{ 46, 105, 127, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } },
88*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_IPV6)
89*1c60b9acSAndroid Build Coastguard Worker 	{ "warmcat.com", LWS_ADNS_RECORD_AAAA, 16, /* check ipv6 */
90*1c60b9acSAndroid Build Coastguard Worker 		{ 0x20, 0x01, 0x41, 0xd0, 0x00, 0x02, 0xee, 0x93,
91*1c60b9acSAndroid Build Coastguard Worker 				0, 0, 0, 0, 0, 0, 0, 1, } },
92*1c60b9acSAndroid Build Coastguard Worker 	{ "ipv6only.warmcat.com", LWS_ADNS_RECORD_AAAA, 16, /* check ipv6 */
93*1c60b9acSAndroid Build Coastguard Worker 		{ 0x20, 0x01, 0x41, 0xd0, 0x00, 0x02, 0xee, 0x93,
94*1c60b9acSAndroid Build Coastguard Worker 				0, 0, 0, 0, 0, 0, 0, 1, } },
95*1c60b9acSAndroid Build Coastguard Worker #endif
96*1c60b9acSAndroid Build Coastguard Worker };
97*1c60b9acSAndroid Build Coastguard Worker 
98*1c60b9acSAndroid Build Coastguard Worker static lws_sorted_usec_list_t sul;
99*1c60b9acSAndroid Build Coastguard Worker 
100*1c60b9acSAndroid Build Coastguard Worker struct lws *
101*1c60b9acSAndroid Build Coastguard Worker cb1(struct lws *wsi_unused, const char *ads, const struct addrinfo *a, int n,
102*1c60b9acSAndroid Build Coastguard Worker     void *opaque);
103*1c60b9acSAndroid Build Coastguard Worker 
104*1c60b9acSAndroid Build Coastguard Worker static void
next_test_cb(lws_sorted_usec_list_t * sul)105*1c60b9acSAndroid Build Coastguard Worker next_test_cb(lws_sorted_usec_list_t *sul)
106*1c60b9acSAndroid Build Coastguard Worker {
107*1c60b9acSAndroid Build Coastguard Worker 	int m;
108*1c60b9acSAndroid Build Coastguard Worker 
109*1c60b9acSAndroid Build Coastguard Worker 	lwsl_notice("%s: querying %s\n", __func__, adt[dtest].dns_name);
110*1c60b9acSAndroid Build Coastguard Worker 
111*1c60b9acSAndroid Build Coastguard Worker 	m = lws_async_dns_query(context, 0,
112*1c60b9acSAndroid Build Coastguard Worker 				adt[dtest].dns_name,
113*1c60b9acSAndroid Build Coastguard Worker 				(adns_query_type_t)adt[dtest].recordtype, cb1, NULL,
114*1c60b9acSAndroid Build Coastguard Worker 				context);
115*1c60b9acSAndroid Build Coastguard Worker 	if (m != LADNS_RET_CONTINUING && m != LADNS_RET_FOUND && m != LADNS_RET_FAILED_WSI_CLOSED) {
116*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: adns 1: %s failed: %d\n", __func__, adt[dtest].dns_name, m);
117*1c60b9acSAndroid Build Coastguard Worker 		interrupted = 1;
118*1c60b9acSAndroid Build Coastguard Worker 	}
119*1c60b9acSAndroid Build Coastguard Worker }
120*1c60b9acSAndroid Build Coastguard Worker 
121*1c60b9acSAndroid Build Coastguard Worker struct lws *
cb1(struct lws * wsi_unused,const char * ads,const struct addrinfo * a,int n,void * opaque)122*1c60b9acSAndroid Build Coastguard Worker cb1(struct lws *wsi_unused, const char *ads, const struct addrinfo *a, int n,
123*1c60b9acSAndroid Build Coastguard Worker     void *opaque)
124*1c60b9acSAndroid Build Coastguard Worker {
125*1c60b9acSAndroid Build Coastguard Worker 	const struct addrinfo *ac = a;
126*1c60b9acSAndroid Build Coastguard Worker 	int ctr = 0, alen;
127*1c60b9acSAndroid Build Coastguard Worker 	uint8_t *addr;
128*1c60b9acSAndroid Build Coastguard Worker 	char buf[64];
129*1c60b9acSAndroid Build Coastguard Worker 
130*1c60b9acSAndroid Build Coastguard Worker 	dtest++;
131*1c60b9acSAndroid Build Coastguard Worker 
132*1c60b9acSAndroid Build Coastguard Worker 	if (!ac)
133*1c60b9acSAndroid Build Coastguard Worker 		lwsl_warn("%s: no results\n", __func__);
134*1c60b9acSAndroid Build Coastguard Worker 
135*1c60b9acSAndroid Build Coastguard Worker 	/* dump the results */
136*1c60b9acSAndroid Build Coastguard Worker 
137*1c60b9acSAndroid Build Coastguard Worker 	while (ac) {
138*1c60b9acSAndroid Build Coastguard Worker 		if (ac->ai_family == AF_INET) {
139*1c60b9acSAndroid Build Coastguard Worker 			addr = (uint8_t *)&(((struct sockaddr_in *)
140*1c60b9acSAndroid Build Coastguard Worker 					ac->ai_addr)->sin_addr.s_addr);
141*1c60b9acSAndroid Build Coastguard Worker 			alen = 4;
142*1c60b9acSAndroid Build Coastguard Worker 		} else {
143*1c60b9acSAndroid Build Coastguard Worker 			addr = (uint8_t *)&(((struct sockaddr_in6 *)
144*1c60b9acSAndroid Build Coastguard Worker 					ac->ai_addr)->sin6_addr.s6_addr);
145*1c60b9acSAndroid Build Coastguard Worker 			alen = 16;
146*1c60b9acSAndroid Build Coastguard Worker 		}
147*1c60b9acSAndroid Build Coastguard Worker 		strcpy(buf, "unknown");
148*1c60b9acSAndroid Build Coastguard Worker 		lws_write_numeric_address(addr, alen, buf, sizeof(buf));
149*1c60b9acSAndroid Build Coastguard Worker 
150*1c60b9acSAndroid Build Coastguard Worker 		lwsl_warn("%s: %d: %s %d %s\n", __func__, ctr++, ads, alen, buf);
151*1c60b9acSAndroid Build Coastguard Worker 
152*1c60b9acSAndroid Build Coastguard Worker 		ac = ac->ai_next;
153*1c60b9acSAndroid Build Coastguard Worker 	}
154*1c60b9acSAndroid Build Coastguard Worker 
155*1c60b9acSAndroid Build Coastguard Worker 	ac = a;
156*1c60b9acSAndroid Build Coastguard Worker 	while (ac) {
157*1c60b9acSAndroid Build Coastguard Worker 		if (ac->ai_family == AF_INET) {
158*1c60b9acSAndroid Build Coastguard Worker 			addr = (uint8_t *)&(((struct sockaddr_in *)
159*1c60b9acSAndroid Build Coastguard Worker 					ac->ai_addr)->sin_addr.s_addr);
160*1c60b9acSAndroid Build Coastguard Worker 			alen = 4;
161*1c60b9acSAndroid Build Coastguard Worker 		} else {
162*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_IPV6)
163*1c60b9acSAndroid Build Coastguard Worker 			addr = (uint8_t *)&(((struct sockaddr_in6 *)
164*1c60b9acSAndroid Build Coastguard Worker 					ac->ai_addr)->sin6_addr.s6_addr);
165*1c60b9acSAndroid Build Coastguard Worker 			alen = 16;
166*1c60b9acSAndroid Build Coastguard Worker #else
167*1c60b9acSAndroid Build Coastguard Worker 			goto again;
168*1c60b9acSAndroid Build Coastguard Worker #endif
169*1c60b9acSAndroid Build Coastguard Worker 		}
170*1c60b9acSAndroid Build Coastguard Worker 		if (alen == adt[dtest - 1].addrlen &&
171*1c60b9acSAndroid Build Coastguard Worker 		    !memcmp(adt[dtest - 1].ads, addr, (unsigned int)alen)) {
172*1c60b9acSAndroid Build Coastguard Worker 			ok++;
173*1c60b9acSAndroid Build Coastguard Worker 			goto next;
174*1c60b9acSAndroid Build Coastguard Worker 		}
175*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_WITH_IPV6)
176*1c60b9acSAndroid Build Coastguard Worker again:
177*1c60b9acSAndroid Build Coastguard Worker #endif
178*1c60b9acSAndroid Build Coastguard Worker 		ac = ac->ai_next;
179*1c60b9acSAndroid Build Coastguard Worker 	}
180*1c60b9acSAndroid Build Coastguard Worker 
181*1c60b9acSAndroid Build Coastguard Worker 	/* testing for NXDOMAIN? */
182*1c60b9acSAndroid Build Coastguard Worker 
183*1c60b9acSAndroid Build Coastguard Worker 	if (!a && !adt[dtest - 1].addrlen) {
184*1c60b9acSAndroid Build Coastguard Worker 		ok++;
185*1c60b9acSAndroid Build Coastguard Worker 		goto next;
186*1c60b9acSAndroid Build Coastguard Worker 	}
187*1c60b9acSAndroid Build Coastguard Worker 
188*1c60b9acSAndroid Build Coastguard Worker 	lwsl_err("%s: dns test %d: no match\n", __func__, dtest);
189*1c60b9acSAndroid Build Coastguard Worker 	fail++;
190*1c60b9acSAndroid Build Coastguard Worker 
191*1c60b9acSAndroid Build Coastguard Worker next:
192*1c60b9acSAndroid Build Coastguard Worker 	lws_async_dns_freeaddrinfo(&a);
193*1c60b9acSAndroid Build Coastguard Worker 	if (dtest == (int)LWS_ARRAY_SIZE(adt))
194*1c60b9acSAndroid Build Coastguard Worker 		interrupted = 1;
195*1c60b9acSAndroid Build Coastguard Worker 	else
196*1c60b9acSAndroid Build Coastguard Worker 		lws_sul_schedule(context, 0, &sul, next_test_cb, 1);
197*1c60b9acSAndroid Build Coastguard Worker 
198*1c60b9acSAndroid Build Coastguard Worker 	return NULL;
199*1c60b9acSAndroid Build Coastguard Worker }
200*1c60b9acSAndroid Build Coastguard Worker 
201*1c60b9acSAndroid Build Coastguard Worker static lws_sorted_usec_list_t sul_l;
202*1c60b9acSAndroid Build Coastguard Worker 
203*1c60b9acSAndroid Build Coastguard Worker struct lws *
cb_loop(struct lws * wsi_unused,const char * ads,const struct addrinfo * a,int n,void * opaque)204*1c60b9acSAndroid Build Coastguard Worker cb_loop(struct lws *wsi_unused, const char *ads, const struct addrinfo *a, int n,
205*1c60b9acSAndroid Build Coastguard Worker 		void *opaque)
206*1c60b9acSAndroid Build Coastguard Worker {
207*1c60b9acSAndroid Build Coastguard Worker 	if (!a) {
208*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s: no results\n", __func__);
209*1c60b9acSAndroid Build Coastguard Worker 		return NULL;
210*1c60b9acSAndroid Build Coastguard Worker 	}
211*1c60b9acSAndroid Build Coastguard Worker 
212*1c60b9acSAndroid Build Coastguard Worker 	lwsl_notice("%s: addrinfo %p\n", __func__, a);\
213*1c60b9acSAndroid Build Coastguard Worker 	lws_async_dns_freeaddrinfo(&a);
214*1c60b9acSAndroid Build Coastguard Worker 
215*1c60b9acSAndroid Build Coastguard Worker 	return NULL;
216*1c60b9acSAndroid Build Coastguard Worker }
217*1c60b9acSAndroid Build Coastguard Worker 
218*1c60b9acSAndroid Build Coastguard Worker 
219*1c60b9acSAndroid Build Coastguard Worker static void
sul_retry_l(struct lws_sorted_usec_list * sul)220*1c60b9acSAndroid Build Coastguard Worker sul_retry_l(struct lws_sorted_usec_list *sul)
221*1c60b9acSAndroid Build Coastguard Worker {
222*1c60b9acSAndroid Build Coastguard Worker 	int m;
223*1c60b9acSAndroid Build Coastguard Worker 
224*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("%s: starting new query\n", __func__);
225*1c60b9acSAndroid Build Coastguard Worker 
226*1c60b9acSAndroid Build Coastguard Worker 	m = lws_async_dns_query(context, 0, "warmcat.com",
227*1c60b9acSAndroid Build Coastguard Worker 				    (adns_query_type_t)LWS_ADNS_RECORD_A,
228*1c60b9acSAndroid Build Coastguard Worker 				    cb_loop, NULL, context);
229*1c60b9acSAndroid Build Coastguard Worker 	switch (m) {
230*1c60b9acSAndroid Build Coastguard Worker 	case LADNS_RET_FAILED_WSI_CLOSED:
231*1c60b9acSAndroid Build Coastguard Worker 		lwsl_warn("%s: LADNS_RET_FAILED_WSI_CLOSED "
232*1c60b9acSAndroid Build Coastguard Worker 			  "(== from cache / success in this test)\n", __func__);
233*1c60b9acSAndroid Build Coastguard Worker 		break;
234*1c60b9acSAndroid Build Coastguard Worker 	case LADNS_RET_NXDOMAIN:
235*1c60b9acSAndroid Build Coastguard Worker 		lwsl_warn("%s: LADNS_RET_NXDOMAIN\n", __func__);
236*1c60b9acSAndroid Build Coastguard Worker 		break;
237*1c60b9acSAndroid Build Coastguard Worker 	case LADNS_RET_TIMEDOUT:
238*1c60b9acSAndroid Build Coastguard Worker 		lwsl_warn("%s: LADNS_RET_TIMEDOUT\n", __func__);
239*1c60b9acSAndroid Build Coastguard Worker 		break;
240*1c60b9acSAndroid Build Coastguard Worker 	case LADNS_RET_FAILED:
241*1c60b9acSAndroid Build Coastguard Worker 		lwsl_warn("%s: LADNS_RET_FAILED\n", __func__);
242*1c60b9acSAndroid Build Coastguard Worker 		break;
243*1c60b9acSAndroid Build Coastguard Worker 	case LADNS_RET_FOUND:
244*1c60b9acSAndroid Build Coastguard Worker 		lwsl_warn("%s: LADNS_RET_FOUND\n", __func__);
245*1c60b9acSAndroid Build Coastguard Worker 		break;
246*1c60b9acSAndroid Build Coastguard Worker 	case LADNS_RET_CONTINUING:
247*1c60b9acSAndroid Build Coastguard Worker 		lwsl_warn("%s: LADNS_RET_CONTINUING\n", __func__);
248*1c60b9acSAndroid Build Coastguard Worker 		break;
249*1c60b9acSAndroid Build Coastguard Worker 	}
250*1c60b9acSAndroid Build Coastguard Worker 
251*1c60b9acSAndroid Build Coastguard Worker 	lws_sul_schedule(context, 0, &sul_l, sul_retry_l, 5 * LWS_US_PER_SEC);
252*1c60b9acSAndroid Build Coastguard Worker }
253*1c60b9acSAndroid Build Coastguard Worker 
sigint_handler(int sig)254*1c60b9acSAndroid Build Coastguard Worker void sigint_handler(int sig)
255*1c60b9acSAndroid Build Coastguard Worker {
256*1c60b9acSAndroid Build Coastguard Worker 	interrupted = 1;
257*1c60b9acSAndroid Build Coastguard Worker }
258*1c60b9acSAndroid Build Coastguard Worker 
259*1c60b9acSAndroid Build Coastguard Worker int
main(int argc,const char ** argv)260*1c60b9acSAndroid Build Coastguard Worker main(int argc, const char **argv)
261*1c60b9acSAndroid Build Coastguard Worker {
262*1c60b9acSAndroid Build Coastguard Worker 	int n = 1, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE;
263*1c60b9acSAndroid Build Coastguard Worker 	struct lws_context_creation_info info;
264*1c60b9acSAndroid Build Coastguard Worker 	const char *p;
265*1c60b9acSAndroid Build Coastguard Worker 
266*1c60b9acSAndroid Build Coastguard Worker 	/* the normal lws init */
267*1c60b9acSAndroid Build Coastguard Worker 
268*1c60b9acSAndroid Build Coastguard Worker 	signal(SIGINT, sigint_handler);
269*1c60b9acSAndroid Build Coastguard Worker 
270*1c60b9acSAndroid Build Coastguard Worker 	if ((p = lws_cmdline_option(argc, argv, "-d")))
271*1c60b9acSAndroid Build Coastguard Worker 		logs = atoi(p);
272*1c60b9acSAndroid Build Coastguard Worker 
273*1c60b9acSAndroid Build Coastguard Worker 	lws_set_log_level(logs, NULL);
274*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("LWS API selftest: Async DNS\n");
275*1c60b9acSAndroid Build Coastguard Worker 
276*1c60b9acSAndroid Build Coastguard Worker 	memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */
277*1c60b9acSAndroid Build Coastguard Worker 	info.port = CONTEXT_PORT_NO_LISTEN;
278*1c60b9acSAndroid Build Coastguard Worker 	info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
279*1c60b9acSAndroid Build Coastguard Worker 
280*1c60b9acSAndroid Build Coastguard Worker 	context = lws_create_context(&info);
281*1c60b9acSAndroid Build Coastguard Worker 	if (!context) {
282*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("lws init failed\n");
283*1c60b9acSAndroid Build Coastguard Worker 		return 1;
284*1c60b9acSAndroid Build Coastguard Worker 	}
285*1c60b9acSAndroid Build Coastguard Worker 
286*1c60b9acSAndroid Build Coastguard Worker 	if (lws_cmdline_option(argc, argv, "-l")) {
287*1c60b9acSAndroid Build Coastguard Worker 		lws_sul_schedule(context, 0, &sul_l, sul_retry_l, LWS_US_PER_SEC);
288*1c60b9acSAndroid Build Coastguard Worker 		goto evloop;
289*1c60b9acSAndroid Build Coastguard Worker 	}
290*1c60b9acSAndroid Build Coastguard Worker 
291*1c60b9acSAndroid Build Coastguard Worker 
292*1c60b9acSAndroid Build Coastguard Worker 	/* ip address parser tests */
293*1c60b9acSAndroid Build Coastguard Worker 
294*1c60b9acSAndroid Build Coastguard Worker 	for (n = 0; n < (int)LWS_ARRAY_SIZE(ipt); n++) {
295*1c60b9acSAndroid Build Coastguard Worker 		uint8_t u[16];
296*1c60b9acSAndroid Build Coastguard Worker 		int m = lws_parse_numeric_address(ipt[n].test, u, sizeof(u));
297*1c60b9acSAndroid Build Coastguard Worker 
298*1c60b9acSAndroid Build Coastguard Worker 		if (m != ipt[n].rlen) {
299*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("%s: fail %s ret %d\n",
300*1c60b9acSAndroid Build Coastguard Worker 					__func__, ipt[n].test, m);
301*1c60b9acSAndroid Build Coastguard Worker 			fail++;
302*1c60b9acSAndroid Build Coastguard Worker 			continue;
303*1c60b9acSAndroid Build Coastguard Worker 		}
304*1c60b9acSAndroid Build Coastguard Worker 
305*1c60b9acSAndroid Build Coastguard Worker 		if (m > 0) {
306*1c60b9acSAndroid Build Coastguard Worker 			if (memcmp(ipt[n].b, u, (unsigned int)m)) {
307*1c60b9acSAndroid Build Coastguard Worker 				lwsl_err("%s: fail %s compare\n", __func__,
308*1c60b9acSAndroid Build Coastguard Worker 						ipt[n].test);
309*1c60b9acSAndroid Build Coastguard Worker 				lwsl_hexdump_notice(u, (unsigned int)m);
310*1c60b9acSAndroid Build Coastguard Worker 				fail++;
311*1c60b9acSAndroid Build Coastguard Worker 				continue;
312*1c60b9acSAndroid Build Coastguard Worker 			}
313*1c60b9acSAndroid Build Coastguard Worker 		}
314*1c60b9acSAndroid Build Coastguard Worker 		ok++;
315*1c60b9acSAndroid Build Coastguard Worker 	}
316*1c60b9acSAndroid Build Coastguard Worker 
317*1c60b9acSAndroid Build Coastguard Worker 	/* ip address formatter tests */
318*1c60b9acSAndroid Build Coastguard Worker 
319*1c60b9acSAndroid Build Coastguard Worker 	for (n = 0; n < (int)LWS_ARRAY_SIZE(ipt); n++) {
320*1c60b9acSAndroid Build Coastguard Worker 		char buf[64];
321*1c60b9acSAndroid Build Coastguard Worker 		int m;
322*1c60b9acSAndroid Build Coastguard Worker 
323*1c60b9acSAndroid Build Coastguard Worker 		/* don't attempt to reverse the ones that are meant to fail */
324*1c60b9acSAndroid Build Coastguard Worker 		if (ipt[n].rlen < 0)
325*1c60b9acSAndroid Build Coastguard Worker 			continue;
326*1c60b9acSAndroid Build Coastguard Worker 
327*1c60b9acSAndroid Build Coastguard Worker 		m = lws_write_numeric_address(ipt[n].b, ipt[n].rlen, buf,
328*1c60b9acSAndroid Build Coastguard Worker 						sizeof(buf));
329*1c60b9acSAndroid Build Coastguard Worker 		if (m != ipt[n].emit_len) {
330*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("%s: fail %s ret %d\n",
331*1c60b9acSAndroid Build Coastguard Worker 					__func__, ipt[n].emit_test, m);
332*1c60b9acSAndroid Build Coastguard Worker 			fail++;
333*1c60b9acSAndroid Build Coastguard Worker 			continue;
334*1c60b9acSAndroid Build Coastguard Worker 		}
335*1c60b9acSAndroid Build Coastguard Worker 
336*1c60b9acSAndroid Build Coastguard Worker 		if (m > 0) {
337*1c60b9acSAndroid Build Coastguard Worker 			if (strcmp(ipt[n].emit_test, buf)) {
338*1c60b9acSAndroid Build Coastguard Worker 				lwsl_err("%s: fail %s compare\n", __func__,
339*1c60b9acSAndroid Build Coastguard Worker 						ipt[n].test);
340*1c60b9acSAndroid Build Coastguard Worker 				lwsl_hexdump_notice(buf, (unsigned int)m);
341*1c60b9acSAndroid Build Coastguard Worker 				fail++;
342*1c60b9acSAndroid Build Coastguard Worker 				continue;
343*1c60b9acSAndroid Build Coastguard Worker 			}
344*1c60b9acSAndroid Build Coastguard Worker 		}
345*1c60b9acSAndroid Build Coastguard Worker 		ok++;
346*1c60b9acSAndroid Build Coastguard Worker 	}
347*1c60b9acSAndroid Build Coastguard Worker 
348*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_WITH_IPV6)
349*1c60b9acSAndroid Build Coastguard Worker 	_exp -= 2;
350*1c60b9acSAndroid Build Coastguard Worker #endif
351*1c60b9acSAndroid Build Coastguard Worker 
352*1c60b9acSAndroid Build Coastguard Worker 	/* kick off the async dns tests */
353*1c60b9acSAndroid Build Coastguard Worker 
354*1c60b9acSAndroid Build Coastguard Worker 	lws_sul_schedule(context, 0, &sul, next_test_cb, 1);
355*1c60b9acSAndroid Build Coastguard Worker 
356*1c60b9acSAndroid Build Coastguard Worker evloop:
357*1c60b9acSAndroid Build Coastguard Worker 	/* the usual lws event loop */
358*1c60b9acSAndroid Build Coastguard Worker 
359*1c60b9acSAndroid Build Coastguard Worker 	n = 1;
360*1c60b9acSAndroid Build Coastguard Worker 	while (n >= 0 && !interrupted)
361*1c60b9acSAndroid Build Coastguard Worker 		n = lws_service(context, 0);
362*1c60b9acSAndroid Build Coastguard Worker 
363*1c60b9acSAndroid Build Coastguard Worker 	lws_context_destroy(context);
364*1c60b9acSAndroid Build Coastguard Worker 
365*1c60b9acSAndroid Build Coastguard Worker 	if (fail || ok != _exp)
366*1c60b9acSAndroid Build Coastguard Worker 		lwsl_user("Completed: PASS: %d / %d, FAIL: %d\n", ok, _exp,
367*1c60b9acSAndroid Build Coastguard Worker 				fail);
368*1c60b9acSAndroid Build Coastguard Worker 	else
369*1c60b9acSAndroid Build Coastguard Worker 		lwsl_user("Completed: ALL PASS: %d / %d\n", ok, _exp);
370*1c60b9acSAndroid Build Coastguard Worker 
371*1c60b9acSAndroid Build Coastguard Worker 	return !(ok == _exp && !fail);
372*1c60b9acSAndroid Build Coastguard Worker }
373