1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * lws-minimal-secure-streams-policy2c
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * Written in 2010-2021 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  *
10*1c60b9acSAndroid Build Coastguard Worker  * This reads policy JSON on stdin and emits it as compileable
11*1c60b9acSAndroid Build Coastguard Worker  * C structs.
12*1c60b9acSAndroid Build Coastguard Worker  *
13*1c60b9acSAndroid Build Coastguard Worker  * It's useful if your platform is too space-constrained for a
14*1c60b9acSAndroid Build Coastguard Worker  * JSON policy and needs to build a static policy in C via
15*1c60b9acSAndroid Build Coastguard Worker  * LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY... this way you can
16*1c60b9acSAndroid Build Coastguard Worker  * still create and maintain the JSON policy but implement it directly
17*1c60b9acSAndroid Build Coastguard Worker  * as C structs in your code.
18*1c60b9acSAndroid Build Coastguard Worker  */
19*1c60b9acSAndroid Build Coastguard Worker 
20*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
21*1c60b9acSAndroid Build Coastguard Worker #include <string.h>
22*1c60b9acSAndroid Build Coastguard Worker #include <signal.h>
23*1c60b9acSAndroid Build Coastguard Worker #include <stdio.h>
24*1c60b9acSAndroid Build Coastguard Worker #include <assert.h>
25*1c60b9acSAndroid Build Coastguard Worker 
26*1c60b9acSAndroid Build Coastguard Worker static int interrupted, bad = 1;
27*1c60b9acSAndroid Build Coastguard Worker 
28*1c60b9acSAndroid Build Coastguard Worker 
29*1c60b9acSAndroid Build Coastguard Worker static void
sigint_handler(int sig)30*1c60b9acSAndroid Build Coastguard Worker sigint_handler(int sig)
31*1c60b9acSAndroid Build Coastguard Worker {
32*1c60b9acSAndroid Build Coastguard Worker 	interrupted = 1;
33*1c60b9acSAndroid Build Coastguard Worker }
34*1c60b9acSAndroid Build Coastguard Worker 
35*1c60b9acSAndroid Build Coastguard Worker struct aggstr {
36*1c60b9acSAndroid Build Coastguard Worker 	struct aggstr *next;
37*1c60b9acSAndroid Build Coastguard Worker 
38*1c60b9acSAndroid Build Coastguard Worker 	const char *orig;
39*1c60b9acSAndroid Build Coastguard Worker 	size_t offset;
40*1c60b9acSAndroid Build Coastguard Worker };
41*1c60b9acSAndroid Build Coastguard Worker 
42*1c60b9acSAndroid Build Coastguard Worker static struct aggstr *rbomap,	/* retry / backoff object map */
43*1c60b9acSAndroid Build Coastguard Worker 		     *trustmap, /* trust store map */
44*1c60b9acSAndroid Build Coastguard Worker 		     *certmap;	/* x.509 cert map */
45*1c60b9acSAndroid Build Coastguard Worker static size_t last_offset;
46*1c60b9acSAndroid Build Coastguard Worker 
47*1c60b9acSAndroid Build Coastguard Worker 
48*1c60b9acSAndroid Build Coastguard Worker 
49*1c60b9acSAndroid Build Coastguard Worker static const char *
purify_csymbol(const char * in,char * temp,size_t templen)50*1c60b9acSAndroid Build Coastguard Worker purify_csymbol(const char *in, char *temp, size_t templen)
51*1c60b9acSAndroid Build Coastguard Worker {
52*1c60b9acSAndroid Build Coastguard Worker 	const char *otemp = temp;
53*1c60b9acSAndroid Build Coastguard Worker 
54*1c60b9acSAndroid Build Coastguard Worker 	assert (strlen(in) < templen);
55*1c60b9acSAndroid Build Coastguard Worker 
56*1c60b9acSAndroid Build Coastguard Worker 	while (*in) {
57*1c60b9acSAndroid Build Coastguard Worker 		if ((*in >= 'a' && *in <= 'z') || (*in >= 'A' && *in <= 'Z') ||
58*1c60b9acSAndroid Build Coastguard Worker 		    (*in >= '0' && *in <= '9'))
59*1c60b9acSAndroid Build Coastguard Worker 			*temp++ = *in;
60*1c60b9acSAndroid Build Coastguard Worker 		else
61*1c60b9acSAndroid Build Coastguard Worker 			*temp++ = '_';
62*1c60b9acSAndroid Build Coastguard Worker 
63*1c60b9acSAndroid Build Coastguard Worker 		in++;
64*1c60b9acSAndroid Build Coastguard Worker 	}
65*1c60b9acSAndroid Build Coastguard Worker 
66*1c60b9acSAndroid Build Coastguard Worker 	*temp = '\0';
67*1c60b9acSAndroid Build Coastguard Worker 
68*1c60b9acSAndroid Build Coastguard Worker 	return otemp;
69*1c60b9acSAndroid Build Coastguard Worker }
70*1c60b9acSAndroid Build Coastguard Worker 
main(int argc,const char ** argv)71*1c60b9acSAndroid Build Coastguard Worker int main(int argc, const char **argv)
72*1c60b9acSAndroid Build Coastguard Worker {
73*1c60b9acSAndroid Build Coastguard Worker 	const lws_ss_policy_t *pol, *lastpol = NULL;
74*1c60b9acSAndroid Build Coastguard Worker 	struct lws_context_creation_info info;
75*1c60b9acSAndroid Build Coastguard Worker 	size_t json_size = 0, est = 0;
76*1c60b9acSAndroid Build Coastguard Worker 	struct lws_context *context;
77*1c60b9acSAndroid Build Coastguard Worker 	const lws_ss_auth_t *auth;
78*1c60b9acSAndroid Build Coastguard Worker 	char prev[128], curr[128];
79*1c60b9acSAndroid Build Coastguard Worker 	int unique_rbo = 0, m, n;
80*1c60b9acSAndroid Build Coastguard Worker 	char buf[64], buf1[64];
81*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_metadata_t *md;
82*1c60b9acSAndroid Build Coastguard Worker 	struct aggstr *a, *a1;
83*1c60b9acSAndroid Build Coastguard Worker 
84*1c60b9acSAndroid Build Coastguard Worker 	signal(SIGINT, sigint_handler);
85*1c60b9acSAndroid Build Coastguard Worker 
86*1c60b9acSAndroid Build Coastguard Worker 	memset(&info, 0, sizeof info);
87*1c60b9acSAndroid Build Coastguard Worker 	lws_cmdline_option_handle_builtin(argc, argv, &info);
88*1c60b9acSAndroid Build Coastguard Worker 
89*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("LWS secure streams policy2c [-d<verb>]\n");
90*1c60b9acSAndroid Build Coastguard Worker 
91*1c60b9acSAndroid Build Coastguard Worker 	info.fd_limit_per_thread = 1 + 6 + 1;
92*1c60b9acSAndroid Build Coastguard Worker 	info.port = CONTEXT_PORT_NO_LISTEN;
93*1c60b9acSAndroid Build Coastguard Worker 
94*1c60b9acSAndroid Build Coastguard Worker 	info.options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS |
95*1c60b9acSAndroid Build Coastguard Worker 		       LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
96*1c60b9acSAndroid Build Coastguard Worker 
97*1c60b9acSAndroid Build Coastguard Worker 	/* create the context */
98*1c60b9acSAndroid Build Coastguard Worker 
99*1c60b9acSAndroid Build Coastguard Worker 	context = lws_create_context(&info);
100*1c60b9acSAndroid Build Coastguard Worker 	if (!context) {
101*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("lws init failed\n");
102*1c60b9acSAndroid Build Coastguard Worker 		return 1;
103*1c60b9acSAndroid Build Coastguard Worker 	}
104*1c60b9acSAndroid Build Coastguard Worker 
105*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_policy_parse_begin(context, 0);
106*1c60b9acSAndroid Build Coastguard Worker 
107*1c60b9acSAndroid Build Coastguard Worker 	printf("/*\n * Autogenerated from the following JSON policy\n */\n\n#if 0\n");
108*1c60b9acSAndroid Build Coastguard Worker 
109*1c60b9acSAndroid Build Coastguard Worker 	do {
110*1c60b9acSAndroid Build Coastguard Worker 		int m, n = (int)read(0, buf, sizeof(buf));
111*1c60b9acSAndroid Build Coastguard Worker 
112*1c60b9acSAndroid Build Coastguard Worker 		if (n < 1)
113*1c60b9acSAndroid Build Coastguard Worker 			break;
114*1c60b9acSAndroid Build Coastguard Worker 
115*1c60b9acSAndroid Build Coastguard Worker 		m = lws_ss_policy_parse(context, (uint8_t *)buf, (size_t)n);
116*1c60b9acSAndroid Build Coastguard Worker 
117*1c60b9acSAndroid Build Coastguard Worker 		printf("%.*s", n, buf);
118*1c60b9acSAndroid Build Coastguard Worker 		json_size += (unsigned int)n;
119*1c60b9acSAndroid Build Coastguard Worker 
120*1c60b9acSAndroid Build Coastguard Worker 		if (m < 0 && m != LEJP_CONTINUE) {
121*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("%s: policy parse failed... lws has WITH_ROLEs"
122*1c60b9acSAndroid Build Coastguard Worker 				 "for what's in the JSON?\n", __func__);
123*1c60b9acSAndroid Build Coastguard Worker 			goto bail;
124*1c60b9acSAndroid Build Coastguard Worker 		}
125*1c60b9acSAndroid Build Coastguard Worker 	} while (1);
126*1c60b9acSAndroid Build Coastguard Worker 
127*1c60b9acSAndroid Build Coastguard Worker 	printf("\n\n Original JSON size: %zu\n#endif\n\n", json_size);
128*1c60b9acSAndroid Build Coastguard Worker 
129*1c60b9acSAndroid Build Coastguard Worker 	lwsl_notice("%s: parsed JSON\n", __func__);
130*1c60b9acSAndroid Build Coastguard Worker 
131*1c60b9acSAndroid Build Coastguard Worker 	/*
132*1c60b9acSAndroid Build Coastguard Worker 	 * Well, this is fun, isn't it... we have parsed the JSON into in-memory
133*1c60b9acSAndroid Build Coastguard Worker 	 * policy objects, and it has set the context policy pointer to the head
134*1c60b9acSAndroid Build Coastguard Worker 	 * of those but has not set the new policy (which would free the x.509).
135*1c60b9acSAndroid Build Coastguard Worker 	 *
136*1c60b9acSAndroid Build Coastguard Worker 	 * We want to walk the streamtype list first discovering unique objects
137*1c60b9acSAndroid Build Coastguard Worker 	 * and strings referenced there and emitting them compactly as C data,
138*1c60b9acSAndroid Build Coastguard Worker 	 * and then second to emit the streamtype linked-list referring to those
139*1c60b9acSAndroid Build Coastguard Worker 	 * objects.
140*1c60b9acSAndroid Build Coastguard Worker 	 *
141*1c60b9acSAndroid Build Coastguard Worker 	 * For const strings, we aggregate them and avoid generating extra
142*1c60b9acSAndroid Build Coastguard Worker 	 * pointers by encoding the reference as &_lws_ss_staticpol_str[xxx]
143*1c60b9acSAndroid Build Coastguard Worker 	 * where xxx is the fixed offset in the aggregated monster-string.  When
144*1c60b9acSAndroid Build Coastguard Worker 	 * doing that, we keep a map of original pointers to offsets.
145*1c60b9acSAndroid Build Coastguard Worker 	 *
146*1c60b9acSAndroid Build Coastguard Worker 	 * Although we want to minimize memory used by the emitted C, we don't
147*1c60b9acSAndroid Build Coastguard Worker 	 * have to sweat memory during this conversion since it's happening on a
148*1c60b9acSAndroid Build Coastguard Worker 	 * PC
149*1c60b9acSAndroid Build Coastguard Worker 	 */
150*1c60b9acSAndroid Build Coastguard Worker 
151*1c60b9acSAndroid Build Coastguard Worker 	pol = lws_ss_policy_get(context);
152*1c60b9acSAndroid Build Coastguard Worker 
153*1c60b9acSAndroid Build Coastguard Worker 	while (pol) {
154*1c60b9acSAndroid Build Coastguard Worker 
155*1c60b9acSAndroid Build Coastguard Worker 		/*
156*1c60b9acSAndroid Build Coastguard Worker 		 * Walk the metadata list gathering strings and issuing the
157*1c60b9acSAndroid Build Coastguard Worker 		 * C struct
158*1c60b9acSAndroid Build Coastguard Worker 		 */
159*1c60b9acSAndroid Build Coastguard Worker 
160*1c60b9acSAndroid Build Coastguard Worker 		md = pol->metadata;
161*1c60b9acSAndroid Build Coastguard Worker 
162*1c60b9acSAndroid Build Coastguard Worker 		if (md) {
163*1c60b9acSAndroid Build Coastguard Worker 			int idx = 0;
164*1c60b9acSAndroid Build Coastguard Worker 
165*1c60b9acSAndroid Build Coastguard Worker 			printf("\nstatic const lws_ss_metadata_t ");
166*1c60b9acSAndroid Build Coastguard Worker 
167*1c60b9acSAndroid Build Coastguard Worker 			prev[0] = '\0';
168*1c60b9acSAndroid Build Coastguard Worker 			md = pol->metadata;
169*1c60b9acSAndroid Build Coastguard Worker 			while (md) {
170*1c60b9acSAndroid Build Coastguard Worker 
171*1c60b9acSAndroid Build Coastguard Worker 				est += sizeof(lws_ss_metadata_t);
172*1c60b9acSAndroid Build Coastguard Worker 
173*1c60b9acSAndroid Build Coastguard Worker 				lws_snprintf(curr, sizeof(curr), "_md_%s_%s",
174*1c60b9acSAndroid Build Coastguard Worker 					purify_csymbol(pol->streamtype, buf,
175*1c60b9acSAndroid Build Coastguard Worker 						       sizeof(buf)),
176*1c60b9acSAndroid Build Coastguard Worker 					purify_csymbol(md->name, buf1,
177*1c60b9acSAndroid Build Coastguard Worker 						       sizeof(buf1)));
178*1c60b9acSAndroid Build Coastguard Worker 
179*1c60b9acSAndroid Build Coastguard Worker 				printf("%s = {\n", curr);
180*1c60b9acSAndroid Build Coastguard Worker 				if (prev[0])
181*1c60b9acSAndroid Build Coastguard Worker 					printf("\t.next = (void *)&%s, \n", prev);
182*1c60b9acSAndroid Build Coastguard Worker 
183*1c60b9acSAndroid Build Coastguard Worker 				printf("\t.name = \"%s\",\n", (const char *)md->name);
184*1c60b9acSAndroid Build Coastguard Worker 				if (md->value__may_own_heap) {
185*1c60b9acSAndroid Build Coastguard Worker 					printf("\t.value__may_own_heap = (void *)\"%s\",\n",
186*1c60b9acSAndroid Build Coastguard Worker 							(const char *)md->value__may_own_heap);
187*1c60b9acSAndroid Build Coastguard Worker 					printf("\t.value_length = 0x%x,\n",
188*1c60b9acSAndroid Build Coastguard Worker 						(unsigned int)strlen(
189*1c60b9acSAndroid Build Coastguard Worker 							(const char *)md->value__may_own_heap));
190*1c60b9acSAndroid Build Coastguard Worker 				}
191*1c60b9acSAndroid Build Coastguard Worker 
192*1c60b9acSAndroid Build Coastguard Worker 				printf("\t.length = %d,\n", idx++); // md->length);
193*1c60b9acSAndroid Build Coastguard Worker 				printf("\t.value_is_http_token = 0x%x,\n",
194*1c60b9acSAndroid Build Coastguard Worker 					(unsigned int)md->value_is_http_token);
195*1c60b9acSAndroid Build Coastguard Worker 				printf("}");
196*1c60b9acSAndroid Build Coastguard Worker 				if (md->next)
197*1c60b9acSAndroid Build Coastguard Worker 					printf(",\n");
198*1c60b9acSAndroid Build Coastguard Worker 
199*1c60b9acSAndroid Build Coastguard Worker 				lws_strncpy(prev, curr, sizeof(prev));
200*1c60b9acSAndroid Build Coastguard Worker 
201*1c60b9acSAndroid Build Coastguard Worker 				md = md->next;
202*1c60b9acSAndroid Build Coastguard Worker 			}
203*1c60b9acSAndroid Build Coastguard Worker 
204*1c60b9acSAndroid Build Coastguard Worker 			printf(";\n\n");
205*1c60b9acSAndroid Build Coastguard Worker 		}
206*1c60b9acSAndroid Build Coastguard Worker 
207*1c60b9acSAndroid Build Coastguard Worker 		/*
208*1c60b9acSAndroid Build Coastguard Worker 		 * Create unique retry policies... have we seen this guy?
209*1c60b9acSAndroid Build Coastguard Worker 		 */
210*1c60b9acSAndroid Build Coastguard Worker 
211*1c60b9acSAndroid Build Coastguard Worker 		if (pol->retry_bo) {
212*1c60b9acSAndroid Build Coastguard Worker 			a = rbomap;
213*1c60b9acSAndroid Build Coastguard Worker 			while (a) {
214*1c60b9acSAndroid Build Coastguard Worker 				if (a->orig == (const char *)pol->retry_bo)
215*1c60b9acSAndroid Build Coastguard Worker 					break;
216*1c60b9acSAndroid Build Coastguard Worker 
217*1c60b9acSAndroid Build Coastguard Worker 				a = a->next;
218*1c60b9acSAndroid Build Coastguard Worker 			}
219*1c60b9acSAndroid Build Coastguard Worker 
220*1c60b9acSAndroid Build Coastguard Worker 			if (!a) {
221*1c60b9acSAndroid Build Coastguard Worker 
222*1c60b9acSAndroid Build Coastguard Worker 				/* We haven't seen it before and need to create it */
223*1c60b9acSAndroid Build Coastguard Worker 
224*1c60b9acSAndroid Build Coastguard Worker 				a = malloc(sizeof(*a));
225*1c60b9acSAndroid Build Coastguard Worker 				if (!a)
226*1c60b9acSAndroid Build Coastguard Worker 					goto bail;
227*1c60b9acSAndroid Build Coastguard Worker 				a->next = rbomap;
228*1c60b9acSAndroid Build Coastguard Worker 				a->offset = (unsigned int)unique_rbo++;
229*1c60b9acSAndroid Build Coastguard Worker 				a->orig = (const char *)pol->retry_bo;
230*1c60b9acSAndroid Build Coastguard Worker 				rbomap = a;
231*1c60b9acSAndroid Build Coastguard Worker 
232*1c60b9acSAndroid Build Coastguard Worker 				printf("static const uint32_t _rbo_bo_%zu[] = {\n",
233*1c60b9acSAndroid Build Coastguard Worker 					a->offset);
234*1c60b9acSAndroid Build Coastguard Worker 				for (n = 0; n < pol->retry_bo->retry_ms_table_count; n++)
235*1c60b9acSAndroid Build Coastguard Worker 					printf(" %u, ", (unsigned int)
236*1c60b9acSAndroid Build Coastguard Worker 					       pol->retry_bo->retry_ms_table[n]);
237*1c60b9acSAndroid Build Coastguard Worker 
238*1c60b9acSAndroid Build Coastguard Worker 				est += sizeof(uint32_t) *
239*1c60b9acSAndroid Build Coastguard Worker 					pol->retry_bo->retry_ms_table_count;
240*1c60b9acSAndroid Build Coastguard Worker 
241*1c60b9acSAndroid Build Coastguard Worker 				printf("\n};\nstatic const "
242*1c60b9acSAndroid Build Coastguard Worker 				       "lws_retry_bo_t _rbo_%zu = {\n", a->offset);
243*1c60b9acSAndroid Build Coastguard Worker 
244*1c60b9acSAndroid Build Coastguard Worker 				printf("\t.retry_ms_table = _rbo_bo_%zu,\n",
245*1c60b9acSAndroid Build Coastguard Worker 					a->offset);
246*1c60b9acSAndroid Build Coastguard Worker 				printf("\t.retry_ms_table_count = %u,\n",
247*1c60b9acSAndroid Build Coastguard Worker 					pol->retry_bo->retry_ms_table_count);
248*1c60b9acSAndroid Build Coastguard Worker 				printf("\t.conceal_count = %u,\n",
249*1c60b9acSAndroid Build Coastguard Worker 					pol->retry_bo->conceal_count);
250*1c60b9acSAndroid Build Coastguard Worker 				printf("\t.secs_since_valid_ping = %u,\n",
251*1c60b9acSAndroid Build Coastguard Worker 					pol->retry_bo->secs_since_valid_ping);
252*1c60b9acSAndroid Build Coastguard Worker 				printf("\t.secs_since_valid_hangup = %u,\n",
253*1c60b9acSAndroid Build Coastguard Worker 					pol->retry_bo->secs_since_valid_hangup);
254*1c60b9acSAndroid Build Coastguard Worker 				printf("\t.jitter_percent = %u,\n",
255*1c60b9acSAndroid Build Coastguard Worker 					pol->retry_bo->jitter_percent);
256*1c60b9acSAndroid Build Coastguard Worker 				printf("};\n");
257*1c60b9acSAndroid Build Coastguard Worker 
258*1c60b9acSAndroid Build Coastguard Worker 				est += sizeof(lws_retry_bo_t);
259*1c60b9acSAndroid Build Coastguard Worker 			}
260*1c60b9acSAndroid Build Coastguard Worker 		}
261*1c60b9acSAndroid Build Coastguard Worker 
262*1c60b9acSAndroid Build Coastguard Worker 		/*
263*1c60b9acSAndroid Build Coastguard Worker 		 * How about his trust store, it's new to us?
264*1c60b9acSAndroid Build Coastguard Worker 		 */
265*1c60b9acSAndroid Build Coastguard Worker 
266*1c60b9acSAndroid Build Coastguard Worker 		if (pol->trust.store) {
267*1c60b9acSAndroid Build Coastguard Worker 			a = trustmap;
268*1c60b9acSAndroid Build Coastguard Worker 			while (a) {
269*1c60b9acSAndroid Build Coastguard Worker 				if (a->orig == (const char *)pol->trust.store)
270*1c60b9acSAndroid Build Coastguard Worker 					break;
271*1c60b9acSAndroid Build Coastguard Worker 
272*1c60b9acSAndroid Build Coastguard Worker 				a = a->next;
273*1c60b9acSAndroid Build Coastguard Worker 			}
274*1c60b9acSAndroid Build Coastguard Worker 
275*1c60b9acSAndroid Build Coastguard Worker 			if (!a) {
276*1c60b9acSAndroid Build Coastguard Worker 
277*1c60b9acSAndroid Build Coastguard Worker 				/* it's new to us... */
278*1c60b9acSAndroid Build Coastguard Worker 
279*1c60b9acSAndroid Build Coastguard Worker 				a = malloc(sizeof(*a));
280*1c60b9acSAndroid Build Coastguard Worker 				if (!a)
281*1c60b9acSAndroid Build Coastguard Worker 					goto bail;
282*1c60b9acSAndroid Build Coastguard Worker 				a->next = trustmap;
283*1c60b9acSAndroid Build Coastguard Worker 				a->offset = 0; /* don't care, just track seen */
284*1c60b9acSAndroid Build Coastguard Worker 				a->orig = (const char *)pol->trust.store;
285*1c60b9acSAndroid Build Coastguard Worker 				trustmap = a;
286*1c60b9acSAndroid Build Coastguard Worker 
287*1c60b9acSAndroid Build Coastguard Worker 				/*
288*1c60b9acSAndroid Build Coastguard Worker 				 * Have a look through his x.509 stack...
289*1c60b9acSAndroid Build Coastguard Worker 				 * any that're new to us?
290*1c60b9acSAndroid Build Coastguard Worker 				 */
291*1c60b9acSAndroid Build Coastguard Worker 
292*1c60b9acSAndroid Build Coastguard Worker 				for (n = 0; n < pol->trust.store->count; n++) {
293*1c60b9acSAndroid Build Coastguard Worker 					if (!pol->trust.store->ssx509[n])
294*1c60b9acSAndroid Build Coastguard Worker 						continue;
295*1c60b9acSAndroid Build Coastguard Worker 					a1 = certmap;
296*1c60b9acSAndroid Build Coastguard Worker 					while (a1) {
297*1c60b9acSAndroid Build Coastguard Worker 						if (a1->orig == (const char *)pol->trust.store->ssx509[n])
298*1c60b9acSAndroid Build Coastguard Worker 							break;
299*1c60b9acSAndroid Build Coastguard Worker 						a1 = a1->next;
300*1c60b9acSAndroid Build Coastguard Worker 					}
301*1c60b9acSAndroid Build Coastguard Worker 
302*1c60b9acSAndroid Build Coastguard Worker 					if (!a1) {
303*1c60b9acSAndroid Build Coastguard Worker 						/*
304*1c60b9acSAndroid Build Coastguard Worker 						 * This x.509 cert is new to us...
305*1c60b9acSAndroid Build Coastguard Worker 						 * let's capture the DER
306*1c60b9acSAndroid Build Coastguard Worker 						 */
307*1c60b9acSAndroid Build Coastguard Worker 
308*1c60b9acSAndroid Build Coastguard Worker 						a1 = malloc(sizeof(*a1));
309*1c60b9acSAndroid Build Coastguard Worker 						if (!a1)
310*1c60b9acSAndroid Build Coastguard Worker 							goto bail;
311*1c60b9acSAndroid Build Coastguard Worker 						a1->next = certmap;
312*1c60b9acSAndroid Build Coastguard Worker 						a1->offset = 0; /* don't care, just track seen */
313*1c60b9acSAndroid Build Coastguard Worker 						a1->orig = (const char *)pol->trust.store->ssx509[n];
314*1c60b9acSAndroid Build Coastguard Worker 						certmap = a1;
315*1c60b9acSAndroid Build Coastguard Worker 
316*1c60b9acSAndroid Build Coastguard Worker 						printf("static const uint8_t _ss_der_%s[] = {\n",
317*1c60b9acSAndroid Build Coastguard Worker 							purify_csymbol(pol->trust.store->ssx509[n]->vhost_name,
318*1c60b9acSAndroid Build Coastguard Worker 									buf, sizeof(buf)));
319*1c60b9acSAndroid Build Coastguard Worker 
320*1c60b9acSAndroid Build Coastguard Worker 						for (m = 0; m < (int)pol->trust.store->ssx509[n]->ca_der_len; m++) {
321*1c60b9acSAndroid Build Coastguard Worker 							if ((m & 7) == 0)
322*1c60b9acSAndroid Build Coastguard Worker 								printf("\t/* 0x%3x */ ", m);
323*1c60b9acSAndroid Build Coastguard Worker 
324*1c60b9acSAndroid Build Coastguard Worker 							printf("0x%02X, ", pol->trust.store->ssx509[n]->ca_der[m]);
325*1c60b9acSAndroid Build Coastguard Worker 							if ((m & 7) == 7)
326*1c60b9acSAndroid Build Coastguard Worker 								printf("\n");
327*1c60b9acSAndroid Build Coastguard Worker 						}
328*1c60b9acSAndroid Build Coastguard Worker 
329*1c60b9acSAndroid Build Coastguard Worker 						printf("\n};\nstatic const lws_ss_x509_t _ss_x509_%s = {\n",
330*1c60b9acSAndroid Build Coastguard Worker 								purify_csymbol(pol->trust.store->ssx509[n]->vhost_name,
331*1c60b9acSAndroid Build Coastguard Worker 								buf, sizeof(buf)));
332*1c60b9acSAndroid Build Coastguard Worker 						printf("\t.vhost_name = \"%s\",\n", pol->trust.store->ssx509[n]->vhost_name);
333*1c60b9acSAndroid Build Coastguard Worker 						printf("\t.ca_der = _ss_der_%s,\n",
334*1c60b9acSAndroid Build Coastguard Worker 							purify_csymbol(pol->trust.store->ssx509[n]->vhost_name,
335*1c60b9acSAndroid Build Coastguard Worker 								buf, sizeof(buf)));
336*1c60b9acSAndroid Build Coastguard Worker 						printf("\t.ca_der_len = %zu,\n", pol->trust.store->ssx509[n]->ca_der_len);
337*1c60b9acSAndroid Build Coastguard Worker 						printf("};\n");
338*1c60b9acSAndroid Build Coastguard Worker 
339*1c60b9acSAndroid Build Coastguard Worker 						est += sizeof(lws_ss_x509_t) + pol->trust.store->ssx509[n]->ca_der_len;
340*1c60b9acSAndroid Build Coastguard Worker 					}
341*1c60b9acSAndroid Build Coastguard Worker 
342*1c60b9acSAndroid Build Coastguard Worker 				}
343*1c60b9acSAndroid Build Coastguard Worker 
344*1c60b9acSAndroid Build Coastguard Worker 
345*1c60b9acSAndroid Build Coastguard Worker 				printf("static const lws_ss_trust_store_t _ss_ts_%s = {\n",
346*1c60b9acSAndroid Build Coastguard Worker 					purify_csymbol(pol->trust.store->name,
347*1c60b9acSAndroid Build Coastguard Worker 							buf, sizeof(buf)));
348*1c60b9acSAndroid Build Coastguard Worker 
349*1c60b9acSAndroid Build Coastguard Worker 				printf("\t.name = \"%s\",\n", pol->trust.store->name);
350*1c60b9acSAndroid Build Coastguard Worker 				printf("\t.count = %d,\n", pol->trust.store->count);
351*1c60b9acSAndroid Build Coastguard Worker 				printf("\t.ssx509 = {\n");
352*1c60b9acSAndroid Build Coastguard Worker 
353*1c60b9acSAndroid Build Coastguard Worker 				for (n = pol->trust.store->count - 1; n >= 0 ; n--)
354*1c60b9acSAndroid Build Coastguard Worker 					printf("\t\t&_ss_x509_%s,\n",
355*1c60b9acSAndroid Build Coastguard Worker 						pol->trust.store->ssx509[n]->vhost_name);
356*1c60b9acSAndroid Build Coastguard Worker 
357*1c60b9acSAndroid Build Coastguard Worker 				printf("\t}\n};\n");
358*1c60b9acSAndroid Build Coastguard Worker 
359*1c60b9acSAndroid Build Coastguard Worker 				est += sizeof(lws_ss_trust_store_t);
360*1c60b9acSAndroid Build Coastguard Worker 
361*1c60b9acSAndroid Build Coastguard Worker 			}
362*1c60b9acSAndroid Build Coastguard Worker 		}
363*1c60b9acSAndroid Build Coastguard Worker 
364*1c60b9acSAndroid Build Coastguard Worker 		pol = pol->next;
365*1c60b9acSAndroid Build Coastguard Worker 	}
366*1c60b9acSAndroid Build Coastguard Worker 
367*1c60b9acSAndroid Build Coastguard Worker 
368*1c60b9acSAndroid Build Coastguard Worker 	/* dump any streamtype's http resp map */
369*1c60b9acSAndroid Build Coastguard Worker 
370*1c60b9acSAndroid Build Coastguard Worker 	pol = lws_ss_policy_get(context);
371*1c60b9acSAndroid Build Coastguard Worker 	m = 0;
372*1c60b9acSAndroid Build Coastguard Worker 
373*1c60b9acSAndroid Build Coastguard Worker 	while (pol) {
374*1c60b9acSAndroid Build Coastguard Worker 
375*1c60b9acSAndroid Build Coastguard Worker 		lws_snprintf(curr, sizeof(curr), "_ssp_%s",
376*1c60b9acSAndroid Build Coastguard Worker 			purify_csymbol(pol->streamtype, buf, sizeof(buf)));
377*1c60b9acSAndroid Build Coastguard Worker 
378*1c60b9acSAndroid Build Coastguard Worker 		/* if relevant, dump http resp map */
379*1c60b9acSAndroid Build Coastguard Worker 
380*1c60b9acSAndroid Build Coastguard Worker 		switch (pol->protocol) {
381*1c60b9acSAndroid Build Coastguard Worker 		case LWSSSP_H1:
382*1c60b9acSAndroid Build Coastguard Worker 		case LWSSSP_H2:
383*1c60b9acSAndroid Build Coastguard Worker 		case LWSSSP_WS:
384*1c60b9acSAndroid Build Coastguard Worker 
385*1c60b9acSAndroid Build Coastguard Worker 			if (!pol->u.http.count_respmap)
386*1c60b9acSAndroid Build Coastguard Worker 				break;
387*1c60b9acSAndroid Build Coastguard Worker 
388*1c60b9acSAndroid Build Coastguard Worker 			if (!m)
389*1c60b9acSAndroid Build Coastguard Worker 				printf("\nstatic const lws_ss_http_respmap_t ");
390*1c60b9acSAndroid Build Coastguard Worker 			else
391*1c60b9acSAndroid Build Coastguard Worker 				printf(",\n");
392*1c60b9acSAndroid Build Coastguard Worker 			m++;
393*1c60b9acSAndroid Build Coastguard Worker 
394*1c60b9acSAndroid Build Coastguard Worker 			printf("%s_http_respmap[] = {\n", curr);
395*1c60b9acSAndroid Build Coastguard Worker 			for (n = 0; n < pol->u.http.count_respmap; n++) {
396*1c60b9acSAndroid Build Coastguard Worker 				printf("\t{ %d, 0x%x },\n",
397*1c60b9acSAndroid Build Coastguard Worker 						pol->u.http.respmap[n].resp,
398*1c60b9acSAndroid Build Coastguard Worker 						pol->u.http.respmap[n].state);
399*1c60b9acSAndroid Build Coastguard Worker 
400*1c60b9acSAndroid Build Coastguard Worker 				est += sizeof(lws_ss_http_respmap_t);
401*1c60b9acSAndroid Build Coastguard Worker 			}
402*1c60b9acSAndroid Build Coastguard Worker 			printf("}");
403*1c60b9acSAndroid Build Coastguard Worker 			break;
404*1c60b9acSAndroid Build Coastguard Worker 		}
405*1c60b9acSAndroid Build Coastguard Worker 
406*1c60b9acSAndroid Build Coastguard Worker 		pol = pol->next;
407*1c60b9acSAndroid Build Coastguard Worker 	}
408*1c60b9acSAndroid Build Coastguard Worker 
409*1c60b9acSAndroid Build Coastguard Worker 	if (m)
410*1c60b9acSAndroid Build Coastguard Worker 		printf(";\n");
411*1c60b9acSAndroid Build Coastguard Worker 
412*1c60b9acSAndroid Build Coastguard Worker 	/*
413*1c60b9acSAndroid Build Coastguard Worker 	 * The auth map
414*1c60b9acSAndroid Build Coastguard Worker 	 */
415*1c60b9acSAndroid Build Coastguard Worker 
416*1c60b9acSAndroid Build Coastguard Worker 	auth = lws_ss_auth_get(context);
417*1c60b9acSAndroid Build Coastguard Worker 	if (auth)
418*1c60b9acSAndroid Build Coastguard Worker 		printf("\nstatic const lws_ss_auth_t ");
419*1c60b9acSAndroid Build Coastguard Worker 	prev[0] = '\0';
420*1c60b9acSAndroid Build Coastguard Worker 
421*1c60b9acSAndroid Build Coastguard Worker 	while (auth) {
422*1c60b9acSAndroid Build Coastguard Worker 		lws_snprintf(curr, sizeof(curr), "_ssau_%s",
423*1c60b9acSAndroid Build Coastguard Worker 			purify_csymbol(auth->name, buf, sizeof(buf)));
424*1c60b9acSAndroid Build Coastguard Worker 
425*1c60b9acSAndroid Build Coastguard Worker 		printf("%s = {\n", curr);
426*1c60b9acSAndroid Build Coastguard Worker 		if (prev[0])
427*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.next = (void *)&%s,\n", prev);
428*1c60b9acSAndroid Build Coastguard Worker 
429*1c60b9acSAndroid Build Coastguard Worker 		printf("\t.name = \"%s\",\n", auth->name);
430*1c60b9acSAndroid Build Coastguard Worker 		printf("\t.type= \"%s\",\n", auth->type);
431*1c60b9acSAndroid Build Coastguard Worker 		printf("\t.streamtype = \"%s\",\n", auth->streamtype);
432*1c60b9acSAndroid Build Coastguard Worker 		printf("\t.blob_index = %d,\n", auth->blob_index);
433*1c60b9acSAndroid Build Coastguard Worker 		printf("}");
434*1c60b9acSAndroid Build Coastguard Worker 		if (auth->next)
435*1c60b9acSAndroid Build Coastguard Worker 			printf(",");
436*1c60b9acSAndroid Build Coastguard Worker 		else
437*1c60b9acSAndroid Build Coastguard Worker 			printf(";");
438*1c60b9acSAndroid Build Coastguard Worker 		printf("\n");
439*1c60b9acSAndroid Build Coastguard Worker 
440*1c60b9acSAndroid Build Coastguard Worker 		lws_strncpy(prev, curr, sizeof(prev));
441*1c60b9acSAndroid Build Coastguard Worker 
442*1c60b9acSAndroid Build Coastguard Worker 		auth = auth->next;
443*1c60b9acSAndroid Build Coastguard Worker 	}
444*1c60b9acSAndroid Build Coastguard Worker 
445*1c60b9acSAndroid Build Coastguard Worker 	if (lws_ss_auth_get(context))
446*1c60b9acSAndroid Build Coastguard Worker 		printf("\n");
447*1c60b9acSAndroid Build Coastguard Worker 
448*1c60b9acSAndroid Build Coastguard Worker 	/*
449*1c60b9acSAndroid Build Coastguard Worker 	 * The streamtypes
450*1c60b9acSAndroid Build Coastguard Worker 	 */
451*1c60b9acSAndroid Build Coastguard Worker 
452*1c60b9acSAndroid Build Coastguard Worker 	pol = lws_ss_policy_get(context);
453*1c60b9acSAndroid Build Coastguard Worker 
454*1c60b9acSAndroid Build Coastguard Worker 	printf("\nstatic const lws_ss_policy_t ");
455*1c60b9acSAndroid Build Coastguard Worker 	prev[0] = '\0';
456*1c60b9acSAndroid Build Coastguard Worker 
457*1c60b9acSAndroid Build Coastguard Worker 	while (pol) {
458*1c60b9acSAndroid Build Coastguard Worker 
459*1c60b9acSAndroid Build Coastguard Worker 		est += sizeof(*pol);
460*1c60b9acSAndroid Build Coastguard Worker 
461*1c60b9acSAndroid Build Coastguard Worker 		lws_snprintf(curr, sizeof(curr), "_ssp_%s",
462*1c60b9acSAndroid Build Coastguard Worker 			purify_csymbol(pol->streamtype, buf, sizeof(buf)));
463*1c60b9acSAndroid Build Coastguard Worker 
464*1c60b9acSAndroid Build Coastguard Worker 		printf("%s = {\n", curr);
465*1c60b9acSAndroid Build Coastguard Worker 
466*1c60b9acSAndroid Build Coastguard Worker 		if (prev[0])
467*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.next = (void *)&%s,\n", prev);
468*1c60b9acSAndroid Build Coastguard Worker 
469*1c60b9acSAndroid Build Coastguard Worker 		printf("\t.streamtype = \"%s\",\n", pol->streamtype);
470*1c60b9acSAndroid Build Coastguard Worker 		if (pol->endpoint)
471*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.endpoint = \"%s\",\n", pol->endpoint);
472*1c60b9acSAndroid Build Coastguard Worker 		if (pol->rideshare_streamtype)
473*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.rideshare_streamtype = \"%s\",\n",
474*1c60b9acSAndroid Build Coastguard Worker 				pol->rideshare_streamtype);
475*1c60b9acSAndroid Build Coastguard Worker 		if (pol->payload_fmt)
476*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.payload_fmt = \"%s\",\n",
477*1c60b9acSAndroid Build Coastguard Worker 				pol->payload_fmt);
478*1c60b9acSAndroid Build Coastguard Worker 		if (pol->socks5_proxy)
479*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.socks5_proxy = \"%s\",\n",
480*1c60b9acSAndroid Build Coastguard Worker 				pol->socks5_proxy);
481*1c60b9acSAndroid Build Coastguard Worker 
482*1c60b9acSAndroid Build Coastguard Worker 		if (pol->auth)
483*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.auth = &_ssau_%s,\n",
484*1c60b9acSAndroid Build Coastguard Worker 			       purify_csymbol(pol->auth->name, buf, sizeof(buf)));
485*1c60b9acSAndroid Build Coastguard Worker 
486*1c60b9acSAndroid Build Coastguard Worker 		{
487*1c60b9acSAndroid Build Coastguard Worker 			lws_ss_metadata_t *nv = pol->metadata, *last = NULL;
488*1c60b9acSAndroid Build Coastguard Worker 
489*1c60b9acSAndroid Build Coastguard Worker 			while (nv) {
490*1c60b9acSAndroid Build Coastguard Worker 				last = nv;
491*1c60b9acSAndroid Build Coastguard Worker 				nv = nv->next;
492*1c60b9acSAndroid Build Coastguard Worker 			}
493*1c60b9acSAndroid Build Coastguard Worker 			if (pol->metadata)
494*1c60b9acSAndroid Build Coastguard Worker 				printf("\t.metadata = (void *)&_md_%s_%s,\n",
495*1c60b9acSAndroid Build Coastguard Worker 					purify_csymbol(pol->streamtype, buf, sizeof(buf)),
496*1c60b9acSAndroid Build Coastguard Worker 					purify_csymbol(last->name, buf1, sizeof(buf1)));
497*1c60b9acSAndroid Build Coastguard Worker 		}
498*1c60b9acSAndroid Build Coastguard Worker 
499*1c60b9acSAndroid Build Coastguard Worker 
500*1c60b9acSAndroid Build Coastguard Worker 		switch (pol->protocol) {
501*1c60b9acSAndroid Build Coastguard Worker 		case LWSSSP_H1:
502*1c60b9acSAndroid Build Coastguard Worker 		case LWSSSP_H2:
503*1c60b9acSAndroid Build Coastguard Worker 		case LWSSSP_WS:
504*1c60b9acSAndroid Build Coastguard Worker 
505*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.u = {\n\t\t.http = {\n");
506*1c60b9acSAndroid Build Coastguard Worker 
507*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.http.method)
508*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.method = \"%s\",\n",
509*1c60b9acSAndroid Build Coastguard Worker 					pol->u.http.method);
510*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.http.url)
511*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.url = \"%s\",\n",
512*1c60b9acSAndroid Build Coastguard Worker 					pol->u.http.url);
513*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.http.multipart_name)
514*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.multipart_name = \"%s\",\n",
515*1c60b9acSAndroid Build Coastguard Worker 					pol->u.http.multipart_name);
516*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.http.multipart_filename)
517*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.multipart_filename = \"%s\",\n",
518*1c60b9acSAndroid Build Coastguard Worker 					pol->u.http.multipart_filename);
519*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.http.multipart_content_type)
520*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.multipart_content_type = \"%s\",\n",
521*1c60b9acSAndroid Build Coastguard Worker 					pol->u.http.multipart_content_type);
522*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.http.auth_preamble)
523*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.auth_preamble = \"%s\",\n",
524*1c60b9acSAndroid Build Coastguard Worker 					pol->u.http.auth_preamble);
525*1c60b9acSAndroid Build Coastguard Worker 
526*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.http.respmap) {
527*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.respmap = (void *)&%s_http_respmap,\n",
528*1c60b9acSAndroid Build Coastguard Worker 						curr);
529*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.count_respmap = %d,\n",
530*1c60b9acSAndroid Build Coastguard Worker 						pol->u.http.count_respmap);
531*1c60b9acSAndroid Build Coastguard Worker 			}
532*1c60b9acSAndroid Build Coastguard Worker 
533*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.http.blob_header[0]) {
534*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.blob_header = {\n");
535*1c60b9acSAndroid Build Coastguard Worker 				for (n = 0; n < (int)LWS_ARRAY_SIZE(pol->u.http.blob_header); n++)
536*1c60b9acSAndroid Build Coastguard Worker 					if (pol->u.http.blob_header[n])
537*1c60b9acSAndroid Build Coastguard Worker 						printf("\t\t\t\t\"%s\",\n",
538*1c60b9acSAndroid Build Coastguard Worker 							pol->u.http.blob_header[n]);
539*1c60b9acSAndroid Build Coastguard Worker 
540*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t},\n");
541*1c60b9acSAndroid Build Coastguard Worker 			}
542*1c60b9acSAndroid Build Coastguard Worker 
543*1c60b9acSAndroid Build Coastguard Worker 			if (pol->protocol == LWSSSP_WS) {
544*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.u = {\n\t\t\t\t.ws = {\n");
545*1c60b9acSAndroid Build Coastguard Worker 				if (pol->u.http.u.ws.subprotocol)
546*1c60b9acSAndroid Build Coastguard Worker 					printf("\t\t\t\t\t.subprotocol = \"%s\",\n",
547*1c60b9acSAndroid Build Coastguard Worker 						pol->u.http.u.ws.subprotocol);
548*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t\t\t.binary = %u\n", pol->u.http.u.ws.binary);
549*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t\t}\n\t\t\t},\n");
550*1c60b9acSAndroid Build Coastguard Worker 			}
551*1c60b9acSAndroid Build Coastguard Worker 
552*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.http.resp_expect)
553*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.resp_expect = %u,\n", pol->u.http.resp_expect);
554*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.http.fail_redirect)
555*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.fail_redirect = %u,\n", pol->u.http.fail_redirect);
556*1c60b9acSAndroid Build Coastguard Worker 
557*1c60b9acSAndroid Build Coastguard Worker 			printf("\t\t}\n\t},\n");
558*1c60b9acSAndroid Build Coastguard Worker 
559*1c60b9acSAndroid Build Coastguard Worker 			break;
560*1c60b9acSAndroid Build Coastguard Worker 		case LWSSSP_MQTT:
561*1c60b9acSAndroid Build Coastguard Worker 
562*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.u = {\n\t\t.mqtt = {\n");
563*1c60b9acSAndroid Build Coastguard Worker 
564*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.mqtt.topic)
565*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.topic = \"%s\",\n",
566*1c60b9acSAndroid Build Coastguard Worker 					pol->u.mqtt.topic);
567*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.mqtt.subscribe)
568*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.subscribe = \"%s\",\n",
569*1c60b9acSAndroid Build Coastguard Worker 					pol->u.mqtt.subscribe);
570*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.mqtt.will_topic)
571*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.will_topic = \"%s\",\n",
572*1c60b9acSAndroid Build Coastguard Worker 					pol->u.mqtt.will_topic);
573*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.mqtt.will_message)
574*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.will_message = \"%s\",\n",
575*1c60b9acSAndroid Build Coastguard Worker 					pol->u.mqtt.will_message);
576*1c60b9acSAndroid Build Coastguard Worker 
577*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.mqtt.keep_alive)
578*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.keep_alive = %u,\n",
579*1c60b9acSAndroid Build Coastguard Worker 					pol->u.mqtt.keep_alive);
580*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.mqtt.qos)
581*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.qos = %u,\n",
582*1c60b9acSAndroid Build Coastguard Worker 					pol->u.mqtt.qos);
583*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.mqtt.clean_start)
584*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.clean_start = %u,\n",
585*1c60b9acSAndroid Build Coastguard Worker 					pol->u.mqtt.clean_start);
586*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.mqtt.will_qos)
587*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.will_qos = %u,\n",
588*1c60b9acSAndroid Build Coastguard Worker 					pol->u.mqtt.will_qos);
589*1c60b9acSAndroid Build Coastguard Worker 			if (pol->u.mqtt.will_retain)
590*1c60b9acSAndroid Build Coastguard Worker 				printf("\t\t\t.will_retain = %u,\n",
591*1c60b9acSAndroid Build Coastguard Worker 					pol->u.mqtt.will_retain);
592*1c60b9acSAndroid Build Coastguard Worker 
593*1c60b9acSAndroid Build Coastguard Worker 			printf("\t\t}\n\t},\n");
594*1c60b9acSAndroid Build Coastguard Worker 
595*1c60b9acSAndroid Build Coastguard Worker 			break;
596*1c60b9acSAndroid Build Coastguard Worker 		default:
597*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("%s: unknown ss protocol index %d\n", __func__,
598*1c60b9acSAndroid Build Coastguard Worker 					pol->protocol);
599*1c60b9acSAndroid Build Coastguard Worker 			goto bail;
600*1c60b9acSAndroid Build Coastguard Worker 		}
601*1c60b9acSAndroid Build Coastguard Worker 
602*1c60b9acSAndroid Build Coastguard Worker #if 0
603*1c60b9acSAndroid Build Coastguard Worker 		const lws_ss_trust_store_t *trust_store; /**< CA certs needed for conn
604*1c60b9acSAndroid Build Coastguard Worker 		       validation, only set between policy parsing and vhost creation */
605*1c60b9acSAndroid Build Coastguard Worker #endif
606*1c60b9acSAndroid Build Coastguard Worker 
607*1c60b9acSAndroid Build Coastguard Worker 		if (pol->retry_bo) {
608*1c60b9acSAndroid Build Coastguard Worker 			a = rbomap;
609*1c60b9acSAndroid Build Coastguard Worker 			while (a) {
610*1c60b9acSAndroid Build Coastguard Worker 				if (a->orig == (const char *)pol->retry_bo)
611*1c60b9acSAndroid Build Coastguard Worker 					break;
612*1c60b9acSAndroid Build Coastguard Worker 
613*1c60b9acSAndroid Build Coastguard Worker 				a = a->next;
614*1c60b9acSAndroid Build Coastguard Worker 			}
615*1c60b9acSAndroid Build Coastguard Worker 			if (!a)
616*1c60b9acSAndroid Build Coastguard Worker 				goto bail;
617*1c60b9acSAndroid Build Coastguard Worker 
618*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.retry_bo = &_rbo_%zu,\n", a->offset);
619*1c60b9acSAndroid Build Coastguard Worker 		}
620*1c60b9acSAndroid Build Coastguard Worker 
621*1c60b9acSAndroid Build Coastguard Worker 		if (pol->timeout_ms)
622*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.timeout_ms = %u,\n", pol->timeout_ms);
623*1c60b9acSAndroid Build Coastguard Worker 		if (pol->flags)
624*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.flags = 0x%x,\n", pol->flags);
625*1c60b9acSAndroid Build Coastguard Worker 		if (pol->flags)
626*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.priority = 0x%x,\n", (unsigned int)pol->priority);
627*1c60b9acSAndroid Build Coastguard Worker 		if (pol->port)
628*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.port = %u,\n", pol->port);
629*1c60b9acSAndroid Build Coastguard Worker 		if (pol->metadata_count)
630*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.metadata_count = %u,\n", pol->metadata_count);
631*1c60b9acSAndroid Build Coastguard Worker 		printf("\t.protocol = %u,\n", pol->protocol);
632*1c60b9acSAndroid Build Coastguard Worker 		if (pol->client_cert)
633*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.client_cert = %u,\n", pol->client_cert);
634*1c60b9acSAndroid Build Coastguard Worker 
635*1c60b9acSAndroid Build Coastguard Worker 		if (pol->trust.store)
636*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.trust = {.store = &_ss_ts_%s},\n",
637*1c60b9acSAndroid Build Coastguard Worker 				purify_csymbol(pol->trust.store->name,
638*1c60b9acSAndroid Build Coastguard Worker 							buf, sizeof(buf)));
639*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4)
640*1c60b9acSAndroid Build Coastguard Worker 		if (pol->aws_region)
641*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.aws_region= \"%s\",\n", pol->aws_region);
642*1c60b9acSAndroid Build Coastguard Worker 		if (pol->aws_service)
643*1c60b9acSAndroid Build Coastguard Worker 			printf("\t.aws_service= \"%s\",\n", pol->aws_service);
644*1c60b9acSAndroid Build Coastguard Worker 
645*1c60b9acSAndroid Build Coastguard Worker #endif
646*1c60b9acSAndroid Build Coastguard Worker 
647*1c60b9acSAndroid Build Coastguard Worker 
648*1c60b9acSAndroid Build Coastguard Worker 		printf("}");
649*1c60b9acSAndroid Build Coastguard Worker 		if (pol->next)
650*1c60b9acSAndroid Build Coastguard Worker 			printf(",\n");
651*1c60b9acSAndroid Build Coastguard Worker 
652*1c60b9acSAndroid Build Coastguard Worker 		lws_strncpy(prev, curr, sizeof(prev));
653*1c60b9acSAndroid Build Coastguard Worker 
654*1c60b9acSAndroid Build Coastguard Worker 		lastpol = pol;
655*1c60b9acSAndroid Build Coastguard Worker 
656*1c60b9acSAndroid Build Coastguard Worker 		pol = pol->next;
657*1c60b9acSAndroid Build Coastguard Worker 	}
658*1c60b9acSAndroid Build Coastguard Worker 
659*1c60b9acSAndroid Build Coastguard Worker 	printf(";\n");
660*1c60b9acSAndroid Build Coastguard Worker 	if (lastpol)
661*1c60b9acSAndroid Build Coastguard Worker 		printf("#define _ss_static_policy_entry _ssp_%s\n",
662*1c60b9acSAndroid Build Coastguard Worker 			purify_csymbol(lastpol->streamtype, buf, sizeof(buf)));
663*1c60b9acSAndroid Build Coastguard Worker 
664*1c60b9acSAndroid Build Coastguard Worker 	est += last_offset;
665*1c60b9acSAndroid Build Coastguard Worker 
666*1c60b9acSAndroid Build Coastguard Worker 	printf("/* estimated footprint %zu (when sizeof void * = %zu) */\n",
667*1c60b9acSAndroid Build Coastguard Worker 			est, sizeof(void *));
668*1c60b9acSAndroid Build Coastguard Worker 
669*1c60b9acSAndroid Build Coastguard Worker 	lws_ss_policy_parse_abandon(context);
670*1c60b9acSAndroid Build Coastguard Worker 	bad = 0;
671*1c60b9acSAndroid Build Coastguard Worker 
672*1c60b9acSAndroid Build Coastguard Worker bail:
673*1c60b9acSAndroid Build Coastguard Worker 
674*1c60b9acSAndroid Build Coastguard Worker 
675*1c60b9acSAndroid Build Coastguard Worker 	lws_context_destroy(context);
676*1c60b9acSAndroid Build Coastguard Worker 
677*1c60b9acSAndroid Build Coastguard Worker 	lwsl_user("Completed: %s\n", bad ? "failed" : "OK");
678*1c60b9acSAndroid Build Coastguard Worker 
679*1c60b9acSAndroid Build Coastguard Worker 	return bad;
680*1c60b9acSAndroid Build Coastguard Worker }
681