xref: /aosp_15_r20/external/libwebsockets/lib/roles/http/server/lejp-conf.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * libwebsockets - small server side websockets and web server implementation
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * Copyright (C) 2010 - 2019 Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker  *
6*1c60b9acSAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a copy
7*1c60b9acSAndroid Build Coastguard Worker  * of this software and associated documentation files (the "Software"), to
8*1c60b9acSAndroid Build Coastguard Worker  * deal in the Software without restriction, including without limitation the
9*1c60b9acSAndroid Build Coastguard Worker  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*1c60b9acSAndroid Build Coastguard Worker  * sell copies of the Software, and to permit persons to whom the Software is
11*1c60b9acSAndroid Build Coastguard Worker  * furnished to do so, subject to the following conditions:
12*1c60b9acSAndroid Build Coastguard Worker  *
13*1c60b9acSAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included in
14*1c60b9acSAndroid Build Coastguard Worker  * all copies or substantial portions of the Software.
15*1c60b9acSAndroid Build Coastguard Worker  *
16*1c60b9acSAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*1c60b9acSAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*1c60b9acSAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*1c60b9acSAndroid Build Coastguard Worker  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*1c60b9acSAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21*1c60b9acSAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22*1c60b9acSAndroid Build Coastguard Worker  * IN THE SOFTWARE.
23*1c60b9acSAndroid Build Coastguard Worker  */
24*1c60b9acSAndroid Build Coastguard Worker 
25*1c60b9acSAndroid Build Coastguard Worker #include "private-lib-core.h"
26*1c60b9acSAndroid Build Coastguard Worker 
27*1c60b9acSAndroid Build Coastguard Worker #ifndef _WIN32
28*1c60b9acSAndroid Build Coastguard Worker /* this is needed for Travis CI */
29*1c60b9acSAndroid Build Coastguard Worker #include <dirent.h>
30*1c60b9acSAndroid Build Coastguard Worker #endif
31*1c60b9acSAndroid Build Coastguard Worker 
32*1c60b9acSAndroid Build Coastguard Worker #define ESC_INSTALL_DATADIR "_lws_ddir_"
33*1c60b9acSAndroid Build Coastguard Worker 
34*1c60b9acSAndroid Build Coastguard Worker static const char * const paths_global[] = {
35*1c60b9acSAndroid Build Coastguard Worker 	"global.uid",
36*1c60b9acSAndroid Build Coastguard Worker 	"global.gid",
37*1c60b9acSAndroid Build Coastguard Worker 	"global.username",
38*1c60b9acSAndroid Build Coastguard Worker 	"global.groupname",
39*1c60b9acSAndroid Build Coastguard Worker 	"global.count-threads",
40*1c60b9acSAndroid Build Coastguard Worker 	"global.init-ssl",
41*1c60b9acSAndroid Build Coastguard Worker 	"global.server-string",
42*1c60b9acSAndroid Build Coastguard Worker 	"global.plugin-dir",
43*1c60b9acSAndroid Build Coastguard Worker 	"global.ws-pingpong-secs", /* deprecated */
44*1c60b9acSAndroid Build Coastguard Worker 	"global.timeout-secs",
45*1c60b9acSAndroid Build Coastguard Worker 	"global.reject-service-keywords[].*",
46*1c60b9acSAndroid Build Coastguard Worker 	"global.reject-service-keywords[]",
47*1c60b9acSAndroid Build Coastguard Worker 	"global.default-alpn",
48*1c60b9acSAndroid Build Coastguard Worker 	"global.ip-limit-ah",
49*1c60b9acSAndroid Build Coastguard Worker 	"global.ip-limit-wsi",
50*1c60b9acSAndroid Build Coastguard Worker 	"global.rlimit-nofile",
51*1c60b9acSAndroid Build Coastguard Worker };
52*1c60b9acSAndroid Build Coastguard Worker 
53*1c60b9acSAndroid Build Coastguard Worker enum lejp_global_paths {
54*1c60b9acSAndroid Build Coastguard Worker 	LEJPGP_UID,
55*1c60b9acSAndroid Build Coastguard Worker 	LEJPGP_GID,
56*1c60b9acSAndroid Build Coastguard Worker 	LEJPGP_USERNAME,
57*1c60b9acSAndroid Build Coastguard Worker 	LEJPGP_GROUPNAME,
58*1c60b9acSAndroid Build Coastguard Worker 	LEJPGP_COUNT_THREADS,
59*1c60b9acSAndroid Build Coastguard Worker 	LWJPGP_INIT_SSL,
60*1c60b9acSAndroid Build Coastguard Worker 	LEJPGP_SERVER_STRING,
61*1c60b9acSAndroid Build Coastguard Worker 	LEJPGP_PLUGIN_DIR,
62*1c60b9acSAndroid Build Coastguard Worker 	LWJPGP_PINGPONG_SECS,
63*1c60b9acSAndroid Build Coastguard Worker 	LWJPGP_TIMEOUT_SECS,
64*1c60b9acSAndroid Build Coastguard Worker 	LWJPGP_REJECT_SERVICE_KEYWORDS_NAME,
65*1c60b9acSAndroid Build Coastguard Worker 	LWJPGP_REJECT_SERVICE_KEYWORDS,
66*1c60b9acSAndroid Build Coastguard Worker 	LWJPGP_DEFAULT_ALPN,
67*1c60b9acSAndroid Build Coastguard Worker 	LWJPGP_IP_LIMIT_AH,
68*1c60b9acSAndroid Build Coastguard Worker 	LWJPGP_IP_LIMIT_WSI,
69*1c60b9acSAndroid Build Coastguard Worker 	LWJPGP_FD_LIMIT_PT,
70*1c60b9acSAndroid Build Coastguard Worker };
71*1c60b9acSAndroid Build Coastguard Worker 
72*1c60b9acSAndroid Build Coastguard Worker static const char * const paths_vhosts[] = {
73*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[]",
74*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[]",
75*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].name",
76*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].port",
77*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].interface",
78*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].unix-socket",
79*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].unix-socket-perms",
80*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].sts",
81*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].host-ssl-key",
82*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].host-ssl-cert",
83*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].host-ssl-ca",
84*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].access-log",
85*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].mountpoint",
86*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].origin",
87*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].protocol",
88*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].default",
89*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].auth-mask",
90*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].cgi-timeout",
91*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].cgi-env[].*",
92*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].cache-max-age",
93*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].cache-reuse",
94*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].cache-revalidate",
95*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].basic-auth",
96*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].cache-intermediaries",
97*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].extra-mimetypes.*",
98*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].interpret.*",
99*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].ws-protocols[].*.*",
100*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].ws-protocols[].*",
101*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].ws-protocols[]",
102*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].keepalive_timeout",
103*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].enable-client-ssl",
104*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].ciphers",
105*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].ecdh-curve",
106*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].noipv6",
107*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].ipv6only",
108*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].ssl-option-set",
109*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].ssl-option-clear",
110*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].mounts[].pmo[].*",
111*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].headers[].*",
112*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].headers[]",
113*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].client-ssl-key",
114*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].client-ssl-cert",
115*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].client-ssl-ca",
116*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].client-ssl-ciphers",
117*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].onlyraw",
118*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].client-cert-required",
119*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].ignore-missing-cert",
120*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].error-document-404",
121*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].alpn",
122*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].fo-listen-queue",
123*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].ssl-client-option-set",
124*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].ssl-client-option-clear",
125*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].tls13-ciphers",
126*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].client-tls13-ciphers",
127*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].strict-host-check",
128*1c60b9acSAndroid Build Coastguard Worker 
129*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].listen-accept-role",
130*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].listen-accept-protocol",
131*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].apply-listen-accept", /* deprecates "onlyraw" */
132*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].fallback-listen-accept",
133*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].allow-non-tls",
134*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].redirect-http",
135*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].allow-http-on-https",
136*1c60b9acSAndroid Build Coastguard Worker 
137*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].disable-no-protocol-ws-upgrades",
138*1c60b9acSAndroid Build Coastguard Worker 	"vhosts[].h2-half-closed-long-poll",
139*1c60b9acSAndroid Build Coastguard Worker };
140*1c60b9acSAndroid Build Coastguard Worker 
141*1c60b9acSAndroid Build Coastguard Worker enum lejp_vhost_paths {
142*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP,
143*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_MOUNTS,
144*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_NAME,
145*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_PORT,
146*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_INTERFACE,
147*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_UNIXSKT,
148*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_UNIXSKT_PERMS,
149*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_STS,
150*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_HOST_SSL_KEY,
151*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_HOST_SSL_CERT,
152*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_HOST_SSL_CA,
153*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_ACCESS_LOG,
154*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_MOUNTPOINT,
155*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_ORIGIN,
156*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_MOUNT_PROTOCOL,
157*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_DEFAULT,
158*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_DEFAULT_AUTH_MASK,
159*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_CGI_TIMEOUT,
160*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_CGI_ENV,
161*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_MOUNT_CACHE_MAX_AGE,
162*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_MOUNT_CACHE_REUSE,
163*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_MOUNT_CACHE_REVALIDATE,
164*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_MOUNT_BASIC_AUTH,
165*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_MOUNT_CACHE_INTERMEDIARIES,
166*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_MOUNT_EXTRA_MIMETYPES,
167*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_MOUNT_INTERPRET,
168*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_PROTOCOL_NAME_OPT,
169*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_PROTOCOL_NAME,
170*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_PROTOCOL,
171*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_KEEPALIVE_TIMEOUT,
172*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_ENABLE_CLIENT_SSL,
173*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_CIPHERS,
174*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_ECDH_CURVE,
175*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_NOIPV6,
176*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_IPV6ONLY,
177*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_SSL_OPTION_SET,
178*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_SSL_OPTION_CLEAR,
179*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_PMO,
180*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_HEADERS_NAME,
181*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_HEADERS,
182*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_CLIENT_SSL_KEY,
183*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_CLIENT_SSL_CERT,
184*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_CLIENT_SSL_CA,
185*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_CLIENT_CIPHERS,
186*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_FLAG_ONLYRAW,
187*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_FLAG_CLIENT_CERT_REQUIRED,
188*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_IGNORE_MISSING_CERT,
189*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_ERROR_DOCUMENT_404,
190*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_ALPN,
191*1c60b9acSAndroid Build Coastguard Worker 	LWJPVP_FO_LISTEN_QUEUE,
192*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_SSL_CLIENT_OPTION_SET,
193*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_SSL_CLIENT_OPTION_CLEAR,
194*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_TLS13_CIPHERS,
195*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_CLIENT_TLS13_CIPHERS,
196*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_FLAG_STRICT_HOST_CHECK,
197*1c60b9acSAndroid Build Coastguard Worker 
198*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_LISTEN_ACCEPT_ROLE,
199*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_LISTEN_ACCEPT_PROTOCOL,
200*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_FLAG_APPLY_LISTEN_ACCEPT,
201*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_FLAG_FALLBACK_LISTEN_ACCEPT,
202*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_FLAG_ALLOW_NON_TLS,
203*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_FLAG_REDIRECT_HTTP,
204*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_FLAG_ALLOW_HTTP_ON_HTTPS,
205*1c60b9acSAndroid Build Coastguard Worker 
206*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_FLAG_DISABLE_NO_PROTOCOL_WS_UPGRADES,
207*1c60b9acSAndroid Build Coastguard Worker 	LEJPVP_FLAG_H2_HALF_CLOSED_LONG_POLL,
208*1c60b9acSAndroid Build Coastguard Worker };
209*1c60b9acSAndroid Build Coastguard Worker 
210*1c60b9acSAndroid Build Coastguard Worker #define MAX_PLUGIN_DIRS 10
211*1c60b9acSAndroid Build Coastguard Worker 
212*1c60b9acSAndroid Build Coastguard Worker struct jpargs {
213*1c60b9acSAndroid Build Coastguard Worker 	struct lws_context_creation_info *info;
214*1c60b9acSAndroid Build Coastguard Worker 	struct lws_context *context;
215*1c60b9acSAndroid Build Coastguard Worker 	const struct lws_protocols *protocols;
216*1c60b9acSAndroid Build Coastguard Worker 	const struct lws_protocols **pprotocols;
217*1c60b9acSAndroid Build Coastguard Worker 	const struct lws_extension *extensions;
218*1c60b9acSAndroid Build Coastguard Worker 	char *p, *end, valid;
219*1c60b9acSAndroid Build Coastguard Worker 	struct lws_http_mount *head, *last;
220*1c60b9acSAndroid Build Coastguard Worker 
221*1c60b9acSAndroid Build Coastguard Worker 	struct lws_protocol_vhost_options *pvo;
222*1c60b9acSAndroid Build Coastguard Worker 	struct lws_protocol_vhost_options *pvo_em;
223*1c60b9acSAndroid Build Coastguard Worker 	struct lws_protocol_vhost_options *pvo_int;
224*1c60b9acSAndroid Build Coastguard Worker 	struct lws_http_mount m;
225*1c60b9acSAndroid Build Coastguard Worker 	const char **plugin_dirs;
226*1c60b9acSAndroid Build Coastguard Worker 	int count_plugin_dirs;
227*1c60b9acSAndroid Build Coastguard Worker 
228*1c60b9acSAndroid Build Coastguard Worker 	unsigned int reject_ws_with_no_protocol:1;
229*1c60b9acSAndroid Build Coastguard Worker 	unsigned int enable_client_ssl:1;
230*1c60b9acSAndroid Build Coastguard Worker 	unsigned int fresh_mount:1;
231*1c60b9acSAndroid Build Coastguard Worker 	unsigned int any_vhosts:1;
232*1c60b9acSAndroid Build Coastguard Worker 	unsigned int chunk:1;
233*1c60b9acSAndroid Build Coastguard Worker };
234*1c60b9acSAndroid Build Coastguard Worker 
235*1c60b9acSAndroid Build Coastguard Worker static void *
lwsws_align(struct jpargs * a)236*1c60b9acSAndroid Build Coastguard Worker lwsws_align(struct jpargs *a)
237*1c60b9acSAndroid Build Coastguard Worker {
238*1c60b9acSAndroid Build Coastguard Worker 	if ((lws_intptr_t)(a->p) & 15)
239*1c60b9acSAndroid Build Coastguard Worker 		a->p += 16 - ((lws_intptr_t)(a->p) & 15);
240*1c60b9acSAndroid Build Coastguard Worker 
241*1c60b9acSAndroid Build Coastguard Worker 	a->chunk = 0;
242*1c60b9acSAndroid Build Coastguard Worker 
243*1c60b9acSAndroid Build Coastguard Worker 	return a->p;
244*1c60b9acSAndroid Build Coastguard Worker }
245*1c60b9acSAndroid Build Coastguard Worker 
246*1c60b9acSAndroid Build Coastguard Worker static int
arg_to_bool(const char * s)247*1c60b9acSAndroid Build Coastguard Worker arg_to_bool(const char *s)
248*1c60b9acSAndroid Build Coastguard Worker {
249*1c60b9acSAndroid Build Coastguard Worker 	static const char * const on[] = { "on", "yes", "true" };
250*1c60b9acSAndroid Build Coastguard Worker 	int n = atoi(s);
251*1c60b9acSAndroid Build Coastguard Worker 
252*1c60b9acSAndroid Build Coastguard Worker 	if (n)
253*1c60b9acSAndroid Build Coastguard Worker 		return 1;
254*1c60b9acSAndroid Build Coastguard Worker 
255*1c60b9acSAndroid Build Coastguard Worker 	for (n = 0; n < (int)LWS_ARRAY_SIZE(on); n++)
256*1c60b9acSAndroid Build Coastguard Worker 		if (!strcasecmp(s, on[n]))
257*1c60b9acSAndroid Build Coastguard Worker 			return 1;
258*1c60b9acSAndroid Build Coastguard Worker 
259*1c60b9acSAndroid Build Coastguard Worker 	return 0;
260*1c60b9acSAndroid Build Coastguard Worker }
261*1c60b9acSAndroid Build Coastguard Worker 
262*1c60b9acSAndroid Build Coastguard Worker static void
set_reset_flag(uint64_t * p,const char * state,uint64_t flag)263*1c60b9acSAndroid Build Coastguard Worker set_reset_flag(uint64_t *p, const char *state, uint64_t flag)
264*1c60b9acSAndroid Build Coastguard Worker {
265*1c60b9acSAndroid Build Coastguard Worker 	if (arg_to_bool(state))
266*1c60b9acSAndroid Build Coastguard Worker 		*p |= flag;
267*1c60b9acSAndroid Build Coastguard Worker 	else
268*1c60b9acSAndroid Build Coastguard Worker 		*p &= ~(flag);
269*1c60b9acSAndroid Build Coastguard Worker }
270*1c60b9acSAndroid Build Coastguard Worker 
271*1c60b9acSAndroid Build Coastguard Worker static signed char
lejp_globals_cb(struct lejp_ctx * ctx,char reason)272*1c60b9acSAndroid Build Coastguard Worker lejp_globals_cb(struct lejp_ctx *ctx, char reason)
273*1c60b9acSAndroid Build Coastguard Worker {
274*1c60b9acSAndroid Build Coastguard Worker 	struct jpargs *a = (struct jpargs *)ctx->user;
275*1c60b9acSAndroid Build Coastguard Worker 	struct lws_protocol_vhost_options *rej;
276*1c60b9acSAndroid Build Coastguard Worker 	int n;
277*1c60b9acSAndroid Build Coastguard Worker 
278*1c60b9acSAndroid Build Coastguard Worker 	/* we only match on the prepared path strings */
279*1c60b9acSAndroid Build Coastguard Worker 	if (!(reason & LEJP_FLAG_CB_IS_VALUE) || !ctx->path_match)
280*1c60b9acSAndroid Build Coastguard Worker 		return 0;
281*1c60b9acSAndroid Build Coastguard Worker 
282*1c60b9acSAndroid Build Coastguard Worker 	/* this catches, eg, vhosts[].headers[].xxx */
283*1c60b9acSAndroid Build Coastguard Worker 	if (reason == LEJPCB_VAL_STR_END &&
284*1c60b9acSAndroid Build Coastguard Worker 	    ctx->path_match == LWJPGP_REJECT_SERVICE_KEYWORDS_NAME + 1) {
285*1c60b9acSAndroid Build Coastguard Worker 		rej = lwsws_align(a);
286*1c60b9acSAndroid Build Coastguard Worker 		a->p += sizeof(*rej);
287*1c60b9acSAndroid Build Coastguard Worker 
288*1c60b9acSAndroid Build Coastguard Worker 		n = lejp_get_wildcard(ctx, 0, a->p, lws_ptr_diff(a->end, a->p));
289*1c60b9acSAndroid Build Coastguard Worker 		rej->next = a->info->reject_service_keywords;
290*1c60b9acSAndroid Build Coastguard Worker 		a->info->reject_service_keywords = rej;
291*1c60b9acSAndroid Build Coastguard Worker 		rej->name = a->p;
292*1c60b9acSAndroid Build Coastguard Worker 		 lwsl_notice("  adding rej %s=%s\n", a->p, ctx->buf);
293*1c60b9acSAndroid Build Coastguard Worker 		a->p += n - 1;
294*1c60b9acSAndroid Build Coastguard Worker 		*(a->p++) = '\0';
295*1c60b9acSAndroid Build Coastguard Worker 		rej->value = a->p;
296*1c60b9acSAndroid Build Coastguard Worker 		rej->options = NULL;
297*1c60b9acSAndroid Build Coastguard Worker 		goto dostring;
298*1c60b9acSAndroid Build Coastguard Worker 	}
299*1c60b9acSAndroid Build Coastguard Worker 
300*1c60b9acSAndroid Build Coastguard Worker 	switch (ctx->path_match - 1) {
301*1c60b9acSAndroid Build Coastguard Worker 	case LEJPGP_UID:
302*1c60b9acSAndroid Build Coastguard Worker 		a->info->uid = (unsigned int)atoi(ctx->buf);
303*1c60b9acSAndroid Build Coastguard Worker 		return 0;
304*1c60b9acSAndroid Build Coastguard Worker 	case LEJPGP_GID:
305*1c60b9acSAndroid Build Coastguard Worker 		a->info->gid = (unsigned int)atoi(ctx->buf);
306*1c60b9acSAndroid Build Coastguard Worker 		return 0;
307*1c60b9acSAndroid Build Coastguard Worker 	case LEJPGP_USERNAME:
308*1c60b9acSAndroid Build Coastguard Worker 		a->info->username = a->p;
309*1c60b9acSAndroid Build Coastguard Worker 		break;
310*1c60b9acSAndroid Build Coastguard Worker 	case LEJPGP_GROUPNAME:
311*1c60b9acSAndroid Build Coastguard Worker 		a->info->groupname = a->p;
312*1c60b9acSAndroid Build Coastguard Worker 		break;
313*1c60b9acSAndroid Build Coastguard Worker 	case LEJPGP_COUNT_THREADS:
314*1c60b9acSAndroid Build Coastguard Worker 		a->info->count_threads = (unsigned int)atoi(ctx->buf);
315*1c60b9acSAndroid Build Coastguard Worker 		return 0;
316*1c60b9acSAndroid Build Coastguard Worker 	case LWJPGP_INIT_SSL:
317*1c60b9acSAndroid Build Coastguard Worker 		if (arg_to_bool(ctx->buf))
318*1c60b9acSAndroid Build Coastguard Worker 			a->info->options |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
319*1c60b9acSAndroid Build Coastguard Worker 		return 0;
320*1c60b9acSAndroid Build Coastguard Worker 	case LEJPGP_SERVER_STRING:
321*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SERVER)
322*1c60b9acSAndroid Build Coastguard Worker 		a->info->server_string = a->p;
323*1c60b9acSAndroid Build Coastguard Worker #endif
324*1c60b9acSAndroid Build Coastguard Worker 		break;
325*1c60b9acSAndroid Build Coastguard Worker 	case LEJPGP_PLUGIN_DIR:
326*1c60b9acSAndroid Build Coastguard Worker 		if (a->count_plugin_dirs == MAX_PLUGIN_DIRS - 1) {
327*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("Too many plugin dirs\n");
328*1c60b9acSAndroid Build Coastguard Worker 			return -1;
329*1c60b9acSAndroid Build Coastguard Worker 		}
330*1c60b9acSAndroid Build Coastguard Worker 		a->plugin_dirs[a->count_plugin_dirs++] = a->p;
331*1c60b9acSAndroid Build Coastguard Worker 		break;
332*1c60b9acSAndroid Build Coastguard Worker 
333*1c60b9acSAndroid Build Coastguard Worker 	case LWJPGP_PINGPONG_SECS: /* deprecated */
334*1c60b9acSAndroid Build Coastguard Worker 		return 0;
335*1c60b9acSAndroid Build Coastguard Worker 
336*1c60b9acSAndroid Build Coastguard Worker 	case LWJPGP_TIMEOUT_SECS:
337*1c60b9acSAndroid Build Coastguard Worker 		a->info->timeout_secs = (unsigned int)atoi(ctx->buf);
338*1c60b9acSAndroid Build Coastguard Worker 		return 0;
339*1c60b9acSAndroid Build Coastguard Worker 
340*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_TLS)
341*1c60b9acSAndroid Build Coastguard Worker 	case LWJPGP_DEFAULT_ALPN:
342*1c60b9acSAndroid Build Coastguard Worker 		a->info->alpn = a->p;
343*1c60b9acSAndroid Build Coastguard Worker 		break;
344*1c60b9acSAndroid Build Coastguard Worker #endif
345*1c60b9acSAndroid Build Coastguard Worker 
346*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_PEER_LIMITS)
347*1c60b9acSAndroid Build Coastguard Worker 	case LWJPGP_IP_LIMIT_AH:
348*1c60b9acSAndroid Build Coastguard Worker 		a->info->ip_limit_ah = (uint16_t)atoi(ctx->buf);
349*1c60b9acSAndroid Build Coastguard Worker 		return 0;
350*1c60b9acSAndroid Build Coastguard Worker 
351*1c60b9acSAndroid Build Coastguard Worker 	case LWJPGP_IP_LIMIT_WSI:
352*1c60b9acSAndroid Build Coastguard Worker 		a->info->ip_limit_wsi = (uint16_t)atoi(ctx->buf);
353*1c60b9acSAndroid Build Coastguard Worker 		return 0;
354*1c60b9acSAndroid Build Coastguard Worker #endif
355*1c60b9acSAndroid Build Coastguard Worker 
356*1c60b9acSAndroid Build Coastguard Worker 	case LWJPGP_FD_LIMIT_PT:
357*1c60b9acSAndroid Build Coastguard Worker 		a->info->rlimit_nofile = atoi(ctx->buf);
358*1c60b9acSAndroid Build Coastguard Worker 		return 0;
359*1c60b9acSAndroid Build Coastguard Worker 
360*1c60b9acSAndroid Build Coastguard Worker 	default:
361*1c60b9acSAndroid Build Coastguard Worker 		return 0;
362*1c60b9acSAndroid Build Coastguard Worker 	}
363*1c60b9acSAndroid Build Coastguard Worker 
364*1c60b9acSAndroid Build Coastguard Worker dostring:
365*1c60b9acSAndroid Build Coastguard Worker 	a->p += lws_snprintf(a->p, lws_ptr_diff_size_t(a->end, a->p), "%s", ctx->buf);
366*1c60b9acSAndroid Build Coastguard Worker 	*(a->p)++ = '\0';
367*1c60b9acSAndroid Build Coastguard Worker 
368*1c60b9acSAndroid Build Coastguard Worker 	return 0;
369*1c60b9acSAndroid Build Coastguard Worker }
370*1c60b9acSAndroid Build Coastguard Worker 
371*1c60b9acSAndroid Build Coastguard Worker static signed char
lejp_vhosts_cb(struct lejp_ctx * ctx,char reason)372*1c60b9acSAndroid Build Coastguard Worker lejp_vhosts_cb(struct lejp_ctx *ctx, char reason)
373*1c60b9acSAndroid Build Coastguard Worker {
374*1c60b9acSAndroid Build Coastguard Worker 	struct jpargs *a = (struct jpargs *)ctx->user;
375*1c60b9acSAndroid Build Coastguard Worker 	struct lws_protocol_vhost_options *pvo, *mp_cgienv, *headers;
376*1c60b9acSAndroid Build Coastguard Worker 	struct lws_http_mount *m;
377*1c60b9acSAndroid Build Coastguard Worker 	char *p, *p1;
378*1c60b9acSAndroid Build Coastguard Worker 	int n;
379*1c60b9acSAndroid Build Coastguard Worker 
380*1c60b9acSAndroid Build Coastguard Worker #if 0
381*1c60b9acSAndroid Build Coastguard Worker 	lwsl_notice(" %d: %s (%d)\n", reason, ctx->path, ctx->path_match);
382*1c60b9acSAndroid Build Coastguard Worker 	for (n = 0; n < ctx->wildcount; n++)
383*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("    %d\n", ctx->wild[n]);
384*1c60b9acSAndroid Build Coastguard Worker #endif
385*1c60b9acSAndroid Build Coastguard Worker 
386*1c60b9acSAndroid Build Coastguard Worker 	if (reason == LEJPCB_OBJECT_START && ctx->path_match == LEJPVP + 1) {
387*1c60b9acSAndroid Build Coastguard Worker 		uint32_t i[4];
388*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SERVER)
389*1c60b9acSAndroid Build Coastguard Worker 		const char *ss;
390*1c60b9acSAndroid Build Coastguard Worker #endif
391*1c60b9acSAndroid Build Coastguard Worker 
392*1c60b9acSAndroid Build Coastguard Worker 		/* set the defaults for this vhost */
393*1c60b9acSAndroid Build Coastguard Worker 		a->reject_ws_with_no_protocol = 0;
394*1c60b9acSAndroid Build Coastguard Worker 		a->valid = 1;
395*1c60b9acSAndroid Build Coastguard Worker 		a->head = NULL;
396*1c60b9acSAndroid Build Coastguard Worker 		a->last = NULL;
397*1c60b9acSAndroid Build Coastguard Worker 
398*1c60b9acSAndroid Build Coastguard Worker 		i[0] = a->info->count_threads;
399*1c60b9acSAndroid Build Coastguard Worker 		i[1] = a->info->options & (
400*1c60b9acSAndroid Build Coastguard Worker 			LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME |
401*1c60b9acSAndroid Build Coastguard Worker 			LWS_SERVER_OPTION_LIBUV |
402*1c60b9acSAndroid Build Coastguard Worker 			LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT |
403*1c60b9acSAndroid Build Coastguard Worker 			LWS_SERVER_OPTION_EXPLICIT_VHOSTS |
404*1c60b9acSAndroid Build Coastguard Worker 			LWS_SERVER_OPTION_UV_NO_SIGSEGV_SIGFPE_SPIN |
405*1c60b9acSAndroid Build Coastguard Worker 			LWS_SERVER_OPTION_LIBEVENT |
406*1c60b9acSAndroid Build Coastguard Worker 			LWS_SERVER_OPTION_LIBEV
407*1c60b9acSAndroid Build Coastguard Worker 				);
408*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SERVER)
409*1c60b9acSAndroid Build Coastguard Worker 		ss = a->info->server_string;
410*1c60b9acSAndroid Build Coastguard Worker #endif
411*1c60b9acSAndroid Build Coastguard Worker 		i[3] = a->info->timeout_secs;
412*1c60b9acSAndroid Build Coastguard Worker 
413*1c60b9acSAndroid Build Coastguard Worker 		memset(a->info, 0, sizeof(*a->info));
414*1c60b9acSAndroid Build Coastguard Worker 
415*1c60b9acSAndroid Build Coastguard Worker 		a->info->count_threads = i[0];
416*1c60b9acSAndroid Build Coastguard Worker 		a->info->options = i[1];
417*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SERVER)
418*1c60b9acSAndroid Build Coastguard Worker 		a->info->server_string = ss;
419*1c60b9acSAndroid Build Coastguard Worker #endif
420*1c60b9acSAndroid Build Coastguard Worker 		a->info->timeout_secs = i[3];
421*1c60b9acSAndroid Build Coastguard Worker 
422*1c60b9acSAndroid Build Coastguard Worker 		a->info->protocols = a->protocols;
423*1c60b9acSAndroid Build Coastguard Worker 		a->info->pprotocols = a->pprotocols;
424*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_ROLE_WS)
425*1c60b9acSAndroid Build Coastguard Worker 		a->info->extensions = a->extensions;
426*1c60b9acSAndroid Build Coastguard Worker #endif
427*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_TLS)
428*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_CLIENT)
429*1c60b9acSAndroid Build Coastguard Worker 		a->info->client_ssl_cipher_list = "ECDHE-ECDSA-AES256-GCM-SHA384:"
430*1c60b9acSAndroid Build Coastguard Worker 			"ECDHE-RSA-AES256-GCM-SHA384:"
431*1c60b9acSAndroid Build Coastguard Worker 			"DHE-RSA-AES256-GCM-SHA384:"
432*1c60b9acSAndroid Build Coastguard Worker 			"ECDHE-RSA-AES256-SHA384:"
433*1c60b9acSAndroid Build Coastguard Worker 			"HIGH:!aNULL:!eNULL:!EXPORT:"
434*1c60b9acSAndroid Build Coastguard Worker 			"!DES:!MD5:!PSK:!RC4:!HMAC_SHA1:"
435*1c60b9acSAndroid Build Coastguard Worker 			"!SHA1:!DHE-RSA-AES128-GCM-SHA256:"
436*1c60b9acSAndroid Build Coastguard Worker 			"!DHE-RSA-AES128-SHA256:"
437*1c60b9acSAndroid Build Coastguard Worker 			"!AES128-GCM-SHA256:"
438*1c60b9acSAndroid Build Coastguard Worker 			"!AES128-SHA256:"
439*1c60b9acSAndroid Build Coastguard Worker 			"!DHE-RSA-AES256-SHA256:"
440*1c60b9acSAndroid Build Coastguard Worker 			"!AES256-GCM-SHA384:"
441*1c60b9acSAndroid Build Coastguard Worker 			"!AES256-SHA256";
442*1c60b9acSAndroid Build Coastguard Worker #endif
443*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SERVER)
444*1c60b9acSAndroid Build Coastguard Worker 		a->info->ssl_cipher_list = "ECDHE-ECDSA-AES256-GCM-SHA384:"
445*1c60b9acSAndroid Build Coastguard Worker 				       "ECDHE-RSA-AES256-GCM-SHA384:"
446*1c60b9acSAndroid Build Coastguard Worker 				       "DHE-RSA-AES256-GCM-SHA384:"
447*1c60b9acSAndroid Build Coastguard Worker 				       "ECDHE-RSA-AES256-SHA384:"
448*1c60b9acSAndroid Build Coastguard Worker 				       "HIGH:!aNULL:!eNULL:!EXPORT:"
449*1c60b9acSAndroid Build Coastguard Worker 				       "!DES:!MD5:!PSK:!RC4:!HMAC_SHA1:"
450*1c60b9acSAndroid Build Coastguard Worker 				       "!SHA1:!DHE-RSA-AES128-GCM-SHA256:"
451*1c60b9acSAndroid Build Coastguard Worker 				       "!DHE-RSA-AES128-SHA256:"
452*1c60b9acSAndroid Build Coastguard Worker 				       "!AES128-GCM-SHA256:"
453*1c60b9acSAndroid Build Coastguard Worker 				       "!AES128-SHA256:"
454*1c60b9acSAndroid Build Coastguard Worker 				       "!DHE-RSA-AES256-SHA256:"
455*1c60b9acSAndroid Build Coastguard Worker 				       "!AES256-GCM-SHA384:"
456*1c60b9acSAndroid Build Coastguard Worker 				       "!AES256-SHA256";
457*1c60b9acSAndroid Build Coastguard Worker #endif
458*1c60b9acSAndroid Build Coastguard Worker #endif
459*1c60b9acSAndroid Build Coastguard Worker 		a->info->keepalive_timeout = 5;
460*1c60b9acSAndroid Build Coastguard Worker 	}
461*1c60b9acSAndroid Build Coastguard Worker 
462*1c60b9acSAndroid Build Coastguard Worker 	if (reason == LEJPCB_OBJECT_START &&
463*1c60b9acSAndroid Build Coastguard Worker 	    ctx->path_match == LEJPVP_MOUNTS + 1) {
464*1c60b9acSAndroid Build Coastguard Worker 		a->fresh_mount = 1;
465*1c60b9acSAndroid Build Coastguard Worker 		memset(&a->m, 0, sizeof(a->m));
466*1c60b9acSAndroid Build Coastguard Worker 	}
467*1c60b9acSAndroid Build Coastguard Worker 
468*1c60b9acSAndroid Build Coastguard Worker 	/* this catches, eg, vhosts[].ws-protocols[].xxx-protocol */
469*1c60b9acSAndroid Build Coastguard Worker 	if (reason == LEJPCB_OBJECT_START &&
470*1c60b9acSAndroid Build Coastguard Worker 	    ctx->path_match == LEJPVP_PROTOCOL_NAME + 1) {
471*1c60b9acSAndroid Build Coastguard Worker 		a->pvo = lwsws_align(a);
472*1c60b9acSAndroid Build Coastguard Worker 		a->p += sizeof(*a->pvo);
473*1c60b9acSAndroid Build Coastguard Worker 
474*1c60b9acSAndroid Build Coastguard Worker 		n = lejp_get_wildcard(ctx, 0, a->p, lws_ptr_diff(a->end, a->p));
475*1c60b9acSAndroid Build Coastguard Worker 		/* ie, enable this protocol, no options yet */
476*1c60b9acSAndroid Build Coastguard Worker 		a->pvo->next = a->info->pvo;
477*1c60b9acSAndroid Build Coastguard Worker 		a->info->pvo = a->pvo;
478*1c60b9acSAndroid Build Coastguard Worker 		a->pvo->name = a->p;
479*1c60b9acSAndroid Build Coastguard Worker 		lwsl_info("  adding protocol %s\n", a->p);
480*1c60b9acSAndroid Build Coastguard Worker 		a->p += n;
481*1c60b9acSAndroid Build Coastguard Worker 		a->pvo->value = a->p;
482*1c60b9acSAndroid Build Coastguard Worker 		a->pvo->options = NULL;
483*1c60b9acSAndroid Build Coastguard Worker 		goto dostring;
484*1c60b9acSAndroid Build Coastguard Worker 	}
485*1c60b9acSAndroid Build Coastguard Worker 
486*1c60b9acSAndroid Build Coastguard Worker 	/* this catches, eg, vhosts[].headers[].xxx */
487*1c60b9acSAndroid Build Coastguard Worker 	if ((reason == LEJPCB_VAL_STR_END || reason == LEJPCB_VAL_STR_CHUNK) &&
488*1c60b9acSAndroid Build Coastguard Worker 	    ctx->path_match == LEJPVP_HEADERS_NAME + 1) {
489*1c60b9acSAndroid Build Coastguard Worker 
490*1c60b9acSAndroid Build Coastguard Worker 		if (!a->chunk) {
491*1c60b9acSAndroid Build Coastguard Worker 			headers = lwsws_align(a);
492*1c60b9acSAndroid Build Coastguard Worker 			a->p += sizeof(*headers);
493*1c60b9acSAndroid Build Coastguard Worker 
494*1c60b9acSAndroid Build Coastguard Worker 			n = lejp_get_wildcard(ctx, 0, a->p,
495*1c60b9acSAndroid Build Coastguard Worker 					lws_ptr_diff(a->end, a->p));
496*1c60b9acSAndroid Build Coastguard Worker 			/* ie, add this header */
497*1c60b9acSAndroid Build Coastguard Worker 			headers->next = a->info->headers;
498*1c60b9acSAndroid Build Coastguard Worker 			a->info->headers = headers;
499*1c60b9acSAndroid Build Coastguard Worker 			headers->name = a->p;
500*1c60b9acSAndroid Build Coastguard Worker 
501*1c60b9acSAndroid Build Coastguard Worker 			lwsl_notice("  adding header %s=%s\n", a->p, ctx->buf);
502*1c60b9acSAndroid Build Coastguard Worker 			a->p += n - 1;
503*1c60b9acSAndroid Build Coastguard Worker 			*(a->p++) = ':';
504*1c60b9acSAndroid Build Coastguard Worker 			if (a->p < a->end)
505*1c60b9acSAndroid Build Coastguard Worker 				*(a->p++) = '\0';
506*1c60b9acSAndroid Build Coastguard Worker 			else
507*1c60b9acSAndroid Build Coastguard Worker 				*(a->p - 1) = '\0';
508*1c60b9acSAndroid Build Coastguard Worker 			headers->value = a->p;
509*1c60b9acSAndroid Build Coastguard Worker 			headers->options = NULL;
510*1c60b9acSAndroid Build Coastguard Worker 		}
511*1c60b9acSAndroid Build Coastguard Worker 		a->chunk = reason == LEJPCB_VAL_STR_CHUNK;
512*1c60b9acSAndroid Build Coastguard Worker 		goto dostring;
513*1c60b9acSAndroid Build Coastguard Worker 	}
514*1c60b9acSAndroid Build Coastguard Worker 
515*1c60b9acSAndroid Build Coastguard Worker 	if (reason == LEJPCB_OBJECT_END &&
516*1c60b9acSAndroid Build Coastguard Worker 	    (ctx->path_match == LEJPVP + 1 || !ctx->path[0]) &&
517*1c60b9acSAndroid Build Coastguard Worker 	    a->valid) {
518*1c60b9acSAndroid Build Coastguard Worker 
519*1c60b9acSAndroid Build Coastguard Worker 		struct lws_vhost *vhost;
520*1c60b9acSAndroid Build Coastguard Worker 
521*1c60b9acSAndroid Build Coastguard Worker 		//lwsl_notice("%s\n", ctx->path);
522*1c60b9acSAndroid Build Coastguard Worker 		if (!a->info->port &&
523*1c60b9acSAndroid Build Coastguard Worker 		    !(a->info->options & LWS_SERVER_OPTION_UNIX_SOCK)) {
524*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("Port required (eg, 443)\n");
525*1c60b9acSAndroid Build Coastguard Worker 			return 1;
526*1c60b9acSAndroid Build Coastguard Worker 		}
527*1c60b9acSAndroid Build Coastguard Worker 		a->valid = 0;
528*1c60b9acSAndroid Build Coastguard Worker 		a->info->mounts = a->head;
529*1c60b9acSAndroid Build Coastguard Worker 
530*1c60b9acSAndroid Build Coastguard Worker 		vhost = lws_create_vhost(a->context, a->info);
531*1c60b9acSAndroid Build Coastguard Worker 		if (!vhost) {
532*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("Failed to create vhost %s\n",
533*1c60b9acSAndroid Build Coastguard Worker 				 a->info->vhost_name);
534*1c60b9acSAndroid Build Coastguard Worker 			return 1;
535*1c60b9acSAndroid Build Coastguard Worker 		}
536*1c60b9acSAndroid Build Coastguard Worker 		a->any_vhosts = 1;
537*1c60b9acSAndroid Build Coastguard Worker 
538*1c60b9acSAndroid Build Coastguard Worker 		if (a->reject_ws_with_no_protocol) {
539*1c60b9acSAndroid Build Coastguard Worker 			a->reject_ws_with_no_protocol = 0;
540*1c60b9acSAndroid Build Coastguard Worker 
541*1c60b9acSAndroid Build Coastguard Worker 			vhost->default_protocol_index = 255;
542*1c60b9acSAndroid Build Coastguard Worker 		}
543*1c60b9acSAndroid Build Coastguard Worker 
544*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_TLS) && defined(LWS_WITH_CLIENT)
545*1c60b9acSAndroid Build Coastguard Worker 		if (a->enable_client_ssl) {
546*1c60b9acSAndroid Build Coastguard Worker 			const char *cert_filepath =
547*1c60b9acSAndroid Build Coastguard Worker 					a->info->client_ssl_cert_filepath;
548*1c60b9acSAndroid Build Coastguard Worker 			const char *private_key_filepath =
549*1c60b9acSAndroid Build Coastguard Worker 				       a->info->client_ssl_private_key_filepath;
550*1c60b9acSAndroid Build Coastguard Worker 			const char *ca_filepath =
551*1c60b9acSAndroid Build Coastguard Worker 					a->info->client_ssl_ca_filepath;
552*1c60b9acSAndroid Build Coastguard Worker 			const char *cipher_list =
553*1c60b9acSAndroid Build Coastguard Worker 					a->info->client_ssl_cipher_list;
554*1c60b9acSAndroid Build Coastguard Worker 
555*1c60b9acSAndroid Build Coastguard Worker 			memset(a->info, 0, sizeof(*a->info));
556*1c60b9acSAndroid Build Coastguard Worker 			a->info->client_ssl_cert_filepath = cert_filepath;
557*1c60b9acSAndroid Build Coastguard Worker 			a->info->client_ssl_private_key_filepath =
558*1c60b9acSAndroid Build Coastguard Worker 							private_key_filepath;
559*1c60b9acSAndroid Build Coastguard Worker 			a->info->client_ssl_ca_filepath = ca_filepath;
560*1c60b9acSAndroid Build Coastguard Worker 			a->info->client_ssl_cipher_list = cipher_list;
561*1c60b9acSAndroid Build Coastguard Worker 			a->info->options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
562*1c60b9acSAndroid Build Coastguard Worker 			lws_init_vhost_client_ssl(a->info, vhost);
563*1c60b9acSAndroid Build Coastguard Worker 		}
564*1c60b9acSAndroid Build Coastguard Worker #endif
565*1c60b9acSAndroid Build Coastguard Worker 
566*1c60b9acSAndroid Build Coastguard Worker 		return 0;
567*1c60b9acSAndroid Build Coastguard Worker 	}
568*1c60b9acSAndroid Build Coastguard Worker 
569*1c60b9acSAndroid Build Coastguard Worker 	if (reason == LEJPCB_OBJECT_END &&
570*1c60b9acSAndroid Build Coastguard Worker 	    ctx->path_match == LEJPVP_MOUNTS + 1) {
571*1c60b9acSAndroid Build Coastguard Worker 		static const char * const mount_protocols[] = {
572*1c60b9acSAndroid Build Coastguard Worker 			"http://",
573*1c60b9acSAndroid Build Coastguard Worker 			"https://",
574*1c60b9acSAndroid Build Coastguard Worker 			"file://",
575*1c60b9acSAndroid Build Coastguard Worker 			"cgi://",
576*1c60b9acSAndroid Build Coastguard Worker 			">http://",
577*1c60b9acSAndroid Build Coastguard Worker 			">https://",
578*1c60b9acSAndroid Build Coastguard Worker 			"callback://",
579*1c60b9acSAndroid Build Coastguard Worker 			"gzip://",
580*1c60b9acSAndroid Build Coastguard Worker 		};
581*1c60b9acSAndroid Build Coastguard Worker 
582*1c60b9acSAndroid Build Coastguard Worker 		if (!a->fresh_mount)
583*1c60b9acSAndroid Build Coastguard Worker 			return 0;
584*1c60b9acSAndroid Build Coastguard Worker 
585*1c60b9acSAndroid Build Coastguard Worker 		if (!a->m.mountpoint || !a->m.origin) {
586*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("mountpoint and origin required\n");
587*1c60b9acSAndroid Build Coastguard Worker 			return 1;
588*1c60b9acSAndroid Build Coastguard Worker 		}
589*1c60b9acSAndroid Build Coastguard Worker 		lwsl_debug("adding mount %s\n", a->m.mountpoint);
590*1c60b9acSAndroid Build Coastguard Worker 		m = lwsws_align(a);
591*1c60b9acSAndroid Build Coastguard Worker 		memcpy(m, &a->m, sizeof(*m));
592*1c60b9acSAndroid Build Coastguard Worker 		if (a->last)
593*1c60b9acSAndroid Build Coastguard Worker 			a->last->mount_next = m;
594*1c60b9acSAndroid Build Coastguard Worker 
595*1c60b9acSAndroid Build Coastguard Worker 		for (n = 0; n < (int)LWS_ARRAY_SIZE(mount_protocols); n++)
596*1c60b9acSAndroid Build Coastguard Worker 			if (!strncmp(a->m.origin, mount_protocols[n],
597*1c60b9acSAndroid Build Coastguard Worker 			     strlen(mount_protocols[n]))) {
598*1c60b9acSAndroid Build Coastguard Worker 				lwsl_info("----%s\n", a->m.origin);
599*1c60b9acSAndroid Build Coastguard Worker 				m->origin_protocol = (uint8_t)(unsigned int)n;
600*1c60b9acSAndroid Build Coastguard Worker 				m->origin = a->m.origin +
601*1c60b9acSAndroid Build Coastguard Worker 					    strlen(mount_protocols[n]);
602*1c60b9acSAndroid Build Coastguard Worker 				break;
603*1c60b9acSAndroid Build Coastguard Worker 			}
604*1c60b9acSAndroid Build Coastguard Worker 
605*1c60b9acSAndroid Build Coastguard Worker 		if (n == (int)LWS_ARRAY_SIZE(mount_protocols)) {
606*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("unsupported protocol:// %s\n", a->m.origin);
607*1c60b9acSAndroid Build Coastguard Worker 			return 1;
608*1c60b9acSAndroid Build Coastguard Worker 		}
609*1c60b9acSAndroid Build Coastguard Worker 
610*1c60b9acSAndroid Build Coastguard Worker 		a->p += sizeof(*m);
611*1c60b9acSAndroid Build Coastguard Worker 		if (!a->head)
612*1c60b9acSAndroid Build Coastguard Worker 			a->head = m;
613*1c60b9acSAndroid Build Coastguard Worker 
614*1c60b9acSAndroid Build Coastguard Worker 		a->last = m;
615*1c60b9acSAndroid Build Coastguard Worker 		a->fresh_mount = 0;
616*1c60b9acSAndroid Build Coastguard Worker 	}
617*1c60b9acSAndroid Build Coastguard Worker 
618*1c60b9acSAndroid Build Coastguard Worker 	/* we only match on the prepared path strings */
619*1c60b9acSAndroid Build Coastguard Worker 	if (!(reason & LEJP_FLAG_CB_IS_VALUE) || !ctx->path_match)
620*1c60b9acSAndroid Build Coastguard Worker 		return 0;
621*1c60b9acSAndroid Build Coastguard Worker 
622*1c60b9acSAndroid Build Coastguard Worker 	switch (ctx->path_match - 1) {
623*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_NAME:
624*1c60b9acSAndroid Build Coastguard Worker 		a->info->vhost_name = a->p;
625*1c60b9acSAndroid Build Coastguard Worker 		break;
626*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_PORT:
627*1c60b9acSAndroid Build Coastguard Worker 		a->info->port = atoi(ctx->buf);
628*1c60b9acSAndroid Build Coastguard Worker 		return 0;
629*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_INTERFACE:
630*1c60b9acSAndroid Build Coastguard Worker 		a->info->iface = a->p;
631*1c60b9acSAndroid Build Coastguard Worker 		break;
632*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_UNIXSKT:
633*1c60b9acSAndroid Build Coastguard Worker 		if (arg_to_bool(ctx->buf))
634*1c60b9acSAndroid Build Coastguard Worker 			a->info->options |= (uint64_t)LWS_SERVER_OPTION_UNIX_SOCK;
635*1c60b9acSAndroid Build Coastguard Worker 		else
636*1c60b9acSAndroid Build Coastguard Worker 			a->info->options &= (uint64_t)~(LWS_SERVER_OPTION_UNIX_SOCK);
637*1c60b9acSAndroid Build Coastguard Worker 		return 0;
638*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_UNIXSKT_PERMS:
639*1c60b9acSAndroid Build Coastguard Worker 		a->info->unix_socket_perms = a->p;
640*1c60b9acSAndroid Build Coastguard Worker 		break;
641*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_STS:
642*1c60b9acSAndroid Build Coastguard Worker 		if (arg_to_bool(ctx->buf))
643*1c60b9acSAndroid Build Coastguard Worker 			a->info->options |= (uint64_t)LWS_SERVER_OPTION_STS;
644*1c60b9acSAndroid Build Coastguard Worker 		else
645*1c60b9acSAndroid Build Coastguard Worker 			a->info->options &= (uint64_t)~(LWS_SERVER_OPTION_STS);
646*1c60b9acSAndroid Build Coastguard Worker 		return 0;
647*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_TLS)
648*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_HOST_SSL_KEY:
649*1c60b9acSAndroid Build Coastguard Worker 		a->info->ssl_private_key_filepath = a->p;
650*1c60b9acSAndroid Build Coastguard Worker 		break;
651*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_HOST_SSL_CERT:
652*1c60b9acSAndroid Build Coastguard Worker 		a->info->ssl_cert_filepath = a->p;
653*1c60b9acSAndroid Build Coastguard Worker 		break;
654*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_HOST_SSL_CA:
655*1c60b9acSAndroid Build Coastguard Worker 		a->info->ssl_ca_filepath = a->p;
656*1c60b9acSAndroid Build Coastguard Worker 		break;
657*1c60b9acSAndroid Build Coastguard Worker #endif
658*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_ACCESS_LOG:
659*1c60b9acSAndroid Build Coastguard Worker 		a->info->log_filepath = a->p;
660*1c60b9acSAndroid Build Coastguard Worker 		break;
661*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_MOUNTPOINT:
662*1c60b9acSAndroid Build Coastguard Worker 		a->m.mountpoint = a->p;
663*1c60b9acSAndroid Build Coastguard Worker 		a->m.mountpoint_len = (unsigned char)strlen(ctx->buf);
664*1c60b9acSAndroid Build Coastguard Worker 		break;
665*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_ORIGIN:
666*1c60b9acSAndroid Build Coastguard Worker 		if (!strncmp(ctx->buf, "callback://", 11))
667*1c60b9acSAndroid Build Coastguard Worker 			a->m.protocol = a->p + 11;
668*1c60b9acSAndroid Build Coastguard Worker 
669*1c60b9acSAndroid Build Coastguard Worker 		if (!a->m.origin)
670*1c60b9acSAndroid Build Coastguard Worker 			a->m.origin = a->p;
671*1c60b9acSAndroid Build Coastguard Worker 		break;
672*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_DEFAULT:
673*1c60b9acSAndroid Build Coastguard Worker 		a->m.def = a->p;
674*1c60b9acSAndroid Build Coastguard Worker 		break;
675*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_DEFAULT_AUTH_MASK:
676*1c60b9acSAndroid Build Coastguard Worker 		a->m.auth_mask = (unsigned int)atoi(ctx->buf);
677*1c60b9acSAndroid Build Coastguard Worker 		return 0;
678*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_MOUNT_CACHE_MAX_AGE:
679*1c60b9acSAndroid Build Coastguard Worker 		a->m.cache_max_age = atoi(ctx->buf);
680*1c60b9acSAndroid Build Coastguard Worker 		return 0;
681*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_MOUNT_CACHE_REUSE:
682*1c60b9acSAndroid Build Coastguard Worker 		a->m.cache_reusable = !!arg_to_bool(ctx->buf);
683*1c60b9acSAndroid Build Coastguard Worker 		return 0;
684*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_MOUNT_CACHE_REVALIDATE:
685*1c60b9acSAndroid Build Coastguard Worker 		a->m.cache_revalidate = !!arg_to_bool(ctx->buf);
686*1c60b9acSAndroid Build Coastguard Worker 		return 0;
687*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_MOUNT_CACHE_INTERMEDIARIES:
688*1c60b9acSAndroid Build Coastguard Worker 		a->m.cache_intermediaries = !!arg_to_bool(ctx->buf);;
689*1c60b9acSAndroid Build Coastguard Worker 		return 0;
690*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_MOUNT_BASIC_AUTH:
691*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_HTTP_BASIC_AUTH)
692*1c60b9acSAndroid Build Coastguard Worker 		a->m.basic_auth_login_file = a->p;
693*1c60b9acSAndroid Build Coastguard Worker #endif
694*1c60b9acSAndroid Build Coastguard Worker 		break;
695*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_CGI_TIMEOUT:
696*1c60b9acSAndroid Build Coastguard Worker 		a->m.cgi_timeout = atoi(ctx->buf);
697*1c60b9acSAndroid Build Coastguard Worker 		return 0;
698*1c60b9acSAndroid Build Coastguard Worker 	case LWJPVP_FO_LISTEN_QUEUE:
699*1c60b9acSAndroid Build Coastguard Worker 		a->info->fo_listen_queue = atoi(ctx->buf);
700*1c60b9acSAndroid Build Coastguard Worker 		return 0;
701*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_KEEPALIVE_TIMEOUT:
702*1c60b9acSAndroid Build Coastguard Worker 		a->info->keepalive_timeout = atoi(ctx->buf);
703*1c60b9acSAndroid Build Coastguard Worker 		return 0;
704*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_TLS)
705*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_CLIENT)
706*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_CLIENT_CIPHERS:
707*1c60b9acSAndroid Build Coastguard Worker 		a->info->client_ssl_cipher_list = a->p;
708*1c60b9acSAndroid Build Coastguard Worker 		break;
709*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_CLIENT_TLS13_CIPHERS:
710*1c60b9acSAndroid Build Coastguard Worker 		a->info->client_tls_1_3_plus_cipher_list = a->p;
711*1c60b9acSAndroid Build Coastguard Worker 		break;
712*1c60b9acSAndroid Build Coastguard Worker #endif
713*1c60b9acSAndroid Build Coastguard Worker 
714*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_CIPHERS:
715*1c60b9acSAndroid Build Coastguard Worker 		a->info->ssl_cipher_list = a->p;
716*1c60b9acSAndroid Build Coastguard Worker 		break;
717*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_TLS13_CIPHERS:
718*1c60b9acSAndroid Build Coastguard Worker 		a->info->tls1_3_plus_cipher_list = a->p;
719*1c60b9acSAndroid Build Coastguard Worker 		break;
720*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_ECDH_CURVE:
721*1c60b9acSAndroid Build Coastguard Worker 		a->info->ecdh_curve = a->p;
722*1c60b9acSAndroid Build Coastguard Worker 		break;
723*1c60b9acSAndroid Build Coastguard Worker #endif
724*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_PMO:
725*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_CGI_ENV:
726*1c60b9acSAndroid Build Coastguard Worker 		mp_cgienv = lwsws_align(a);
727*1c60b9acSAndroid Build Coastguard Worker 		a->p += sizeof(*a->m.cgienv);
728*1c60b9acSAndroid Build Coastguard Worker 
729*1c60b9acSAndroid Build Coastguard Worker 		mp_cgienv->next = a->m.cgienv;
730*1c60b9acSAndroid Build Coastguard Worker 		a->m.cgienv = mp_cgienv;
731*1c60b9acSAndroid Build Coastguard Worker 
732*1c60b9acSAndroid Build Coastguard Worker 		n = lejp_get_wildcard(ctx, 0, a->p, lws_ptr_diff(a->end, a->p));
733*1c60b9acSAndroid Build Coastguard Worker 		mp_cgienv->name = a->p;
734*1c60b9acSAndroid Build Coastguard Worker 		a->p += n;
735*1c60b9acSAndroid Build Coastguard Worker 		mp_cgienv->value = a->p;
736*1c60b9acSAndroid Build Coastguard Worker 		mp_cgienv->options = NULL;
737*1c60b9acSAndroid Build Coastguard Worker 		//lwsl_notice("    adding pmo / cgi-env '%s' = '%s'\n",
738*1c60b9acSAndroid Build Coastguard Worker 		//		mp_cgienv->name, mp_cgienv->value);
739*1c60b9acSAndroid Build Coastguard Worker 		goto dostring;
740*1c60b9acSAndroid Build Coastguard Worker 
741*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_PROTOCOL_NAME_OPT:
742*1c60b9acSAndroid Build Coastguard Worker 		/* this catches, eg,
743*1c60b9acSAndroid Build Coastguard Worker 		 * vhosts[].ws-protocols[].xxx-protocol.yyy-option
744*1c60b9acSAndroid Build Coastguard Worker 		 * ie, these are options attached to a protocol with { }
745*1c60b9acSAndroid Build Coastguard Worker 		 */
746*1c60b9acSAndroid Build Coastguard Worker 		pvo = lwsws_align(a);
747*1c60b9acSAndroid Build Coastguard Worker 		a->p += sizeof(*a->pvo);
748*1c60b9acSAndroid Build Coastguard Worker 
749*1c60b9acSAndroid Build Coastguard Worker 		n = lejp_get_wildcard(ctx, 1, a->p, lws_ptr_diff(a->end, a->p));
750*1c60b9acSAndroid Build Coastguard Worker 		/* ie, enable this protocol, no options yet */
751*1c60b9acSAndroid Build Coastguard Worker 		pvo->next = a->pvo->options;
752*1c60b9acSAndroid Build Coastguard Worker 		a->pvo->options = pvo;
753*1c60b9acSAndroid Build Coastguard Worker 		pvo->name = a->p;
754*1c60b9acSAndroid Build Coastguard Worker 		a->p += n;
755*1c60b9acSAndroid Build Coastguard Worker 		pvo->value = a->p;
756*1c60b9acSAndroid Build Coastguard Worker 		pvo->options = NULL;
757*1c60b9acSAndroid Build Coastguard Worker 		break;
758*1c60b9acSAndroid Build Coastguard Worker 
759*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_MOUNT_EXTRA_MIMETYPES:
760*1c60b9acSAndroid Build Coastguard Worker 		a->pvo_em = lwsws_align(a);
761*1c60b9acSAndroid Build Coastguard Worker 		a->p += sizeof(*a->pvo_em);
762*1c60b9acSAndroid Build Coastguard Worker 
763*1c60b9acSAndroid Build Coastguard Worker 		n = lejp_get_wildcard(ctx, 0, a->p, lws_ptr_diff(a->end, a->p));
764*1c60b9acSAndroid Build Coastguard Worker 		/* ie, enable this protocol, no options yet */
765*1c60b9acSAndroid Build Coastguard Worker 		a->pvo_em->next = a->m.extra_mimetypes;
766*1c60b9acSAndroid Build Coastguard Worker 		a->m.extra_mimetypes = a->pvo_em;
767*1c60b9acSAndroid Build Coastguard Worker 		a->pvo_em->name = a->p;
768*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("  + extra-mimetypes %s -> %s\n", a->p, ctx->buf);
769*1c60b9acSAndroid Build Coastguard Worker 		a->p += n;
770*1c60b9acSAndroid Build Coastguard Worker 		a->pvo_em->value = a->p;
771*1c60b9acSAndroid Build Coastguard Worker 		a->pvo_em->options = NULL;
772*1c60b9acSAndroid Build Coastguard Worker 		break;
773*1c60b9acSAndroid Build Coastguard Worker 
774*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_MOUNT_INTERPRET:
775*1c60b9acSAndroid Build Coastguard Worker 		a->pvo_int = lwsws_align(a);
776*1c60b9acSAndroid Build Coastguard Worker 		a->p += sizeof(*a->pvo_int);
777*1c60b9acSAndroid Build Coastguard Worker 
778*1c60b9acSAndroid Build Coastguard Worker 		n = lejp_get_wildcard(ctx, 0, a->p, lws_ptr_diff(a->end, a->p));
779*1c60b9acSAndroid Build Coastguard Worker 		/* ie, enable this protocol, no options yet */
780*1c60b9acSAndroid Build Coastguard Worker 		a->pvo_int->next = a->m.interpret;
781*1c60b9acSAndroid Build Coastguard Worker 		a->m.interpret = a->pvo_int;
782*1c60b9acSAndroid Build Coastguard Worker 		a->pvo_int->name = a->p;
783*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("  adding interpret %s -> %s\n", a->p,
784*1c60b9acSAndroid Build Coastguard Worker 			    ctx->buf);
785*1c60b9acSAndroid Build Coastguard Worker 		a->p += n;
786*1c60b9acSAndroid Build Coastguard Worker 		a->pvo_int->value = a->p;
787*1c60b9acSAndroid Build Coastguard Worker 		a->pvo_int->options = NULL;
788*1c60b9acSAndroid Build Coastguard Worker 		break;
789*1c60b9acSAndroid Build Coastguard Worker 
790*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_ENABLE_CLIENT_SSL:
791*1c60b9acSAndroid Build Coastguard Worker 		a->enable_client_ssl = !!arg_to_bool(ctx->buf);
792*1c60b9acSAndroid Build Coastguard Worker 		return 0;
793*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_TLS) && defined(LWS_WITH_CLIENT)
794*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_CLIENT_SSL_KEY:
795*1c60b9acSAndroid Build Coastguard Worker 		a->info->client_ssl_private_key_filepath = a->p;
796*1c60b9acSAndroid Build Coastguard Worker 		break;
797*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_CLIENT_SSL_CERT:
798*1c60b9acSAndroid Build Coastguard Worker 		a->info->client_ssl_cert_filepath = a->p;
799*1c60b9acSAndroid Build Coastguard Worker 		break;
800*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_CLIENT_SSL_CA:
801*1c60b9acSAndroid Build Coastguard Worker 		a->info->client_ssl_ca_filepath = a->p;
802*1c60b9acSAndroid Build Coastguard Worker 		break;
803*1c60b9acSAndroid Build Coastguard Worker #endif
804*1c60b9acSAndroid Build Coastguard Worker 
805*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_NOIPV6:
806*1c60b9acSAndroid Build Coastguard Worker 		set_reset_flag(&a->info->options, ctx->buf,
807*1c60b9acSAndroid Build Coastguard Worker 			       LWS_SERVER_OPTION_DISABLE_IPV6);
808*1c60b9acSAndroid Build Coastguard Worker 		return 0;
809*1c60b9acSAndroid Build Coastguard Worker 
810*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_FLAG_ONLYRAW:
811*1c60b9acSAndroid Build Coastguard Worker 		set_reset_flag(&a->info->options, ctx->buf,
812*1c60b9acSAndroid Build Coastguard Worker 			    LWS_SERVER_OPTION_ADOPT_APPLY_LISTEN_ACCEPT_CONFIG);
813*1c60b9acSAndroid Build Coastguard Worker 		return 0;
814*1c60b9acSAndroid Build Coastguard Worker 
815*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_IPV6ONLY:
816*1c60b9acSAndroid Build Coastguard Worker 		a->info->options |= LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY;
817*1c60b9acSAndroid Build Coastguard Worker 		set_reset_flag(&a->info->options, ctx->buf,
818*1c60b9acSAndroid Build Coastguard Worker 			       LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE);
819*1c60b9acSAndroid Build Coastguard Worker 		return 0;
820*1c60b9acSAndroid Build Coastguard Worker 
821*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_FLAG_CLIENT_CERT_REQUIRED:
822*1c60b9acSAndroid Build Coastguard Worker 		if (arg_to_bool(ctx->buf))
823*1c60b9acSAndroid Build Coastguard Worker 			a->info->options |=
824*1c60b9acSAndroid Build Coastguard Worker 			    LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT;
825*1c60b9acSAndroid Build Coastguard Worker 		return 0;
826*1c60b9acSAndroid Build Coastguard Worker 
827*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_IGNORE_MISSING_CERT:
828*1c60b9acSAndroid Build Coastguard Worker 		set_reset_flag(&a->info->options, ctx->buf,
829*1c60b9acSAndroid Build Coastguard Worker 				LWS_SERVER_OPTION_IGNORE_MISSING_CERT);
830*1c60b9acSAndroid Build Coastguard Worker 		return 0;
831*1c60b9acSAndroid Build Coastguard Worker 
832*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_FLAG_STRICT_HOST_CHECK:
833*1c60b9acSAndroid Build Coastguard Worker 		set_reset_flag(&a->info->options, ctx->buf,
834*1c60b9acSAndroid Build Coastguard Worker 			LWS_SERVER_OPTION_VHOST_UPG_STRICT_HOST_CHECK);
835*1c60b9acSAndroid Build Coastguard Worker 		return 0;
836*1c60b9acSAndroid Build Coastguard Worker 
837*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_ERROR_DOCUMENT_404:
838*1c60b9acSAndroid Build Coastguard Worker 		a->info->error_document_404 = a->p;
839*1c60b9acSAndroid Build Coastguard Worker 		break;
840*1c60b9acSAndroid Build Coastguard Worker 
841*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_TLS)
842*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_SSL_OPTION_SET:
843*1c60b9acSAndroid Build Coastguard Worker 		a->info->ssl_options_set |= atol(ctx->buf);
844*1c60b9acSAndroid Build Coastguard Worker 		return 0;
845*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_SSL_OPTION_CLEAR:
846*1c60b9acSAndroid Build Coastguard Worker 		a->info->ssl_options_clear |= atol(ctx->buf);
847*1c60b9acSAndroid Build Coastguard Worker 		return 0;
848*1c60b9acSAndroid Build Coastguard Worker 
849*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_CLIENT)
850*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_SSL_CLIENT_OPTION_SET:
851*1c60b9acSAndroid Build Coastguard Worker 		a->info->ssl_client_options_set |= atol(ctx->buf);
852*1c60b9acSAndroid Build Coastguard Worker 		return 0;
853*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_SSL_CLIENT_OPTION_CLEAR:
854*1c60b9acSAndroid Build Coastguard Worker 		a->info->ssl_client_options_clear |= atol(ctx->buf);
855*1c60b9acSAndroid Build Coastguard Worker 		return 0;
856*1c60b9acSAndroid Build Coastguard Worker #endif
857*1c60b9acSAndroid Build Coastguard Worker 
858*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_ALPN:
859*1c60b9acSAndroid Build Coastguard Worker 		a->info->alpn = a->p;
860*1c60b9acSAndroid Build Coastguard Worker 		break;
861*1c60b9acSAndroid Build Coastguard Worker #endif
862*1c60b9acSAndroid Build Coastguard Worker 
863*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_LISTEN_ACCEPT_ROLE:
864*1c60b9acSAndroid Build Coastguard Worker 		a->info->listen_accept_role = a->p;
865*1c60b9acSAndroid Build Coastguard Worker 		break;
866*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_LISTEN_ACCEPT_PROTOCOL:
867*1c60b9acSAndroid Build Coastguard Worker 		a->info->listen_accept_protocol = a->p;
868*1c60b9acSAndroid Build Coastguard Worker 		break;
869*1c60b9acSAndroid Build Coastguard Worker 
870*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_FLAG_APPLY_LISTEN_ACCEPT:
871*1c60b9acSAndroid Build Coastguard Worker 		set_reset_flag(&a->info->options, ctx->buf,
872*1c60b9acSAndroid Build Coastguard Worker 			LWS_SERVER_OPTION_ADOPT_APPLY_LISTEN_ACCEPT_CONFIG);
873*1c60b9acSAndroid Build Coastguard Worker 		return 0;
874*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_FLAG_FALLBACK_LISTEN_ACCEPT:
875*1c60b9acSAndroid Build Coastguard Worker 		lwsl_notice("vh %s: LEJPVP_FLAG_FALLBACK_LISTEN_ACCEPT: %s\n",
876*1c60b9acSAndroid Build Coastguard Worker 			    a->info->vhost_name, ctx->buf);
877*1c60b9acSAndroid Build Coastguard Worker 		set_reset_flag(&a->info->options, ctx->buf,
878*1c60b9acSAndroid Build Coastguard Worker 		      LWS_SERVER_OPTION_FALLBACK_TO_APPLY_LISTEN_ACCEPT_CONFIG);
879*1c60b9acSAndroid Build Coastguard Worker 		return 0;
880*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_FLAG_ALLOW_NON_TLS:
881*1c60b9acSAndroid Build Coastguard Worker 		set_reset_flag(&a->info->options, ctx->buf,
882*1c60b9acSAndroid Build Coastguard Worker 			       LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT);
883*1c60b9acSAndroid Build Coastguard Worker 		return 0;
884*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_FLAG_REDIRECT_HTTP:
885*1c60b9acSAndroid Build Coastguard Worker 		set_reset_flag(&a->info->options, ctx->buf,
886*1c60b9acSAndroid Build Coastguard Worker 			       LWS_SERVER_OPTION_REDIRECT_HTTP_TO_HTTPS);
887*1c60b9acSAndroid Build Coastguard Worker 		return 0;
888*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_FLAG_ALLOW_HTTP_ON_HTTPS:
889*1c60b9acSAndroid Build Coastguard Worker 		set_reset_flag(&a->info->options, ctx->buf,
890*1c60b9acSAndroid Build Coastguard Worker 			       LWS_SERVER_OPTION_ALLOW_HTTP_ON_HTTPS_LISTENER);
891*1c60b9acSAndroid Build Coastguard Worker 		return 0;
892*1c60b9acSAndroid Build Coastguard Worker 
893*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_FLAG_DISABLE_NO_PROTOCOL_WS_UPGRADES:
894*1c60b9acSAndroid Build Coastguard Worker 		a->reject_ws_with_no_protocol = 1;
895*1c60b9acSAndroid Build Coastguard Worker 		return 0;
896*1c60b9acSAndroid Build Coastguard Worker 
897*1c60b9acSAndroid Build Coastguard Worker 	case LEJPVP_FLAG_H2_HALF_CLOSED_LONG_POLL:
898*1c60b9acSAndroid Build Coastguard Worker 		set_reset_flag(&a->info->options, ctx->buf,
899*1c60b9acSAndroid Build Coastguard Worker 				LWS_SERVER_OPTION_VH_H2_HALF_CLOSED_LONG_POLL);
900*1c60b9acSAndroid Build Coastguard Worker 		return 0;
901*1c60b9acSAndroid Build Coastguard Worker 
902*1c60b9acSAndroid Build Coastguard Worker 	default:
903*1c60b9acSAndroid Build Coastguard Worker 		return 0;
904*1c60b9acSAndroid Build Coastguard Worker 	}
905*1c60b9acSAndroid Build Coastguard Worker 
906*1c60b9acSAndroid Build Coastguard Worker dostring:
907*1c60b9acSAndroid Build Coastguard Worker 	p = ctx->buf;
908*1c60b9acSAndroid Build Coastguard Worker 	p[LEJP_STRING_CHUNK] = '\0';
909*1c60b9acSAndroid Build Coastguard Worker 	p1 = strstr(p, ESC_INSTALL_DATADIR);
910*1c60b9acSAndroid Build Coastguard Worker 	if (p1) {
911*1c60b9acSAndroid Build Coastguard Worker 		n = lws_ptr_diff(p1, p);
912*1c60b9acSAndroid Build Coastguard Worker 		if (n > a->end - a->p)
913*1c60b9acSAndroid Build Coastguard Worker 			n = lws_ptr_diff(a->end, a->p);
914*1c60b9acSAndroid Build Coastguard Worker 		lws_strncpy(a->p, p, (unsigned int)n + 1u);
915*1c60b9acSAndroid Build Coastguard Worker 		a->p += n;
916*1c60b9acSAndroid Build Coastguard Worker 		a->p += lws_snprintf(a->p, lws_ptr_diff_size_t(a->end, a->p), "%s",
917*1c60b9acSAndroid Build Coastguard Worker 				     LWS_INSTALL_DATADIR);
918*1c60b9acSAndroid Build Coastguard Worker 		p += n + (int)strlen(ESC_INSTALL_DATADIR);
919*1c60b9acSAndroid Build Coastguard Worker 	}
920*1c60b9acSAndroid Build Coastguard Worker 
921*1c60b9acSAndroid Build Coastguard Worker 	a->p += lws_snprintf(a->p, lws_ptr_diff_size_t(a->end, a->p), "%s", p);
922*1c60b9acSAndroid Build Coastguard Worker 	if (reason == LEJPCB_VAL_STR_END)
923*1c60b9acSAndroid Build Coastguard Worker 		*(a->p)++ = '\0';
924*1c60b9acSAndroid Build Coastguard Worker 
925*1c60b9acSAndroid Build Coastguard Worker 	return 0;
926*1c60b9acSAndroid Build Coastguard Worker }
927*1c60b9acSAndroid Build Coastguard Worker 
928*1c60b9acSAndroid Build Coastguard Worker /*
929*1c60b9acSAndroid Build Coastguard Worker  * returns 0 = OK, 1 = can't open, 2 = parsing error
930*1c60b9acSAndroid Build Coastguard Worker  */
931*1c60b9acSAndroid Build Coastguard Worker 
932*1c60b9acSAndroid Build Coastguard Worker static int
lwsws_get_config(void * user,const char * f,const char * const * paths,int count_paths,lejp_callback cb)933*1c60b9acSAndroid Build Coastguard Worker lwsws_get_config(void *user, const char *f, const char * const *paths,
934*1c60b9acSAndroid Build Coastguard Worker 		 int count_paths, lejp_callback cb)
935*1c60b9acSAndroid Build Coastguard Worker {
936*1c60b9acSAndroid Build Coastguard Worker 	unsigned char buf[128];
937*1c60b9acSAndroid Build Coastguard Worker 	struct lejp_ctx ctx;
938*1c60b9acSAndroid Build Coastguard Worker 	int n, m = 0, fd;
939*1c60b9acSAndroid Build Coastguard Worker 
940*1c60b9acSAndroid Build Coastguard Worker 	fd = lws_open(f, O_RDONLY);
941*1c60b9acSAndroid Build Coastguard Worker 	if (fd < 0) {
942*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("Cannot open %s\n", f);
943*1c60b9acSAndroid Build Coastguard Worker 		return 2;
944*1c60b9acSAndroid Build Coastguard Worker 	}
945*1c60b9acSAndroid Build Coastguard Worker 	lwsl_info("%s: %s\n", __func__, f);
946*1c60b9acSAndroid Build Coastguard Worker 	lejp_construct(&ctx, cb, user, paths, (uint8_t)(unsigned int)count_paths);
947*1c60b9acSAndroid Build Coastguard Worker 
948*1c60b9acSAndroid Build Coastguard Worker 	do {
949*1c60b9acSAndroid Build Coastguard Worker 		n = (int)read(fd, buf, sizeof(buf));
950*1c60b9acSAndroid Build Coastguard Worker 		if (!n)
951*1c60b9acSAndroid Build Coastguard Worker 			break;
952*1c60b9acSAndroid Build Coastguard Worker 
953*1c60b9acSAndroid Build Coastguard Worker 		m = lejp_parse(&ctx, buf, n);
954*1c60b9acSAndroid Build Coastguard Worker 	} while (m == LEJP_CONTINUE);
955*1c60b9acSAndroid Build Coastguard Worker 
956*1c60b9acSAndroid Build Coastguard Worker 	close(fd);
957*1c60b9acSAndroid Build Coastguard Worker 	n = (int32_t)ctx.line;
958*1c60b9acSAndroid Build Coastguard Worker 	lejp_destruct(&ctx);
959*1c60b9acSAndroid Build Coastguard Worker 
960*1c60b9acSAndroid Build Coastguard Worker 	if (m < 0) {
961*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("%s(%u): parsing error %d: %s\n", f, n, m,
962*1c60b9acSAndroid Build Coastguard Worker 			 lejp_error_to_string(m));
963*1c60b9acSAndroid Build Coastguard Worker 		return 2;
964*1c60b9acSAndroid Build Coastguard Worker 	}
965*1c60b9acSAndroid Build Coastguard Worker 
966*1c60b9acSAndroid Build Coastguard Worker 	return 0;
967*1c60b9acSAndroid Build Coastguard Worker }
968*1c60b9acSAndroid Build Coastguard Worker 
969*1c60b9acSAndroid Build Coastguard Worker struct lws_dir_args {
970*1c60b9acSAndroid Build Coastguard Worker 	void *user;
971*1c60b9acSAndroid Build Coastguard Worker 	const char * const *paths;
972*1c60b9acSAndroid Build Coastguard Worker 	int count_paths;
973*1c60b9acSAndroid Build Coastguard Worker 	lejp_callback cb;
974*1c60b9acSAndroid Build Coastguard Worker };
975*1c60b9acSAndroid Build Coastguard Worker 
976*1c60b9acSAndroid Build Coastguard Worker static int
lwsws_get_config_d_cb(const char * dirpath,void * user,struct lws_dir_entry * lde)977*1c60b9acSAndroid Build Coastguard Worker lwsws_get_config_d_cb(const char *dirpath, void *user,
978*1c60b9acSAndroid Build Coastguard Worker 		      struct lws_dir_entry *lde)
979*1c60b9acSAndroid Build Coastguard Worker {
980*1c60b9acSAndroid Build Coastguard Worker 	struct lws_dir_args *da = (struct lws_dir_args *)user;
981*1c60b9acSAndroid Build Coastguard Worker 	char path[256];
982*1c60b9acSAndroid Build Coastguard Worker 
983*1c60b9acSAndroid Build Coastguard Worker 	if (lde->type != LDOT_FILE && lde->type != LDOT_UNKNOWN /* ZFS */)
984*1c60b9acSAndroid Build Coastguard Worker 		return 0;
985*1c60b9acSAndroid Build Coastguard Worker 
986*1c60b9acSAndroid Build Coastguard Worker 	lws_snprintf(path, sizeof(path) - 1, "%s/%s", dirpath, lde->name);
987*1c60b9acSAndroid Build Coastguard Worker 
988*1c60b9acSAndroid Build Coastguard Worker 	return lwsws_get_config(da->user, path, da->paths,
989*1c60b9acSAndroid Build Coastguard Worker 				da->count_paths, da->cb);
990*1c60b9acSAndroid Build Coastguard Worker }
991*1c60b9acSAndroid Build Coastguard Worker 
992*1c60b9acSAndroid Build Coastguard Worker int
lwsws_get_config_globals(struct lws_context_creation_info * info,const char * d,char ** cs,int * len)993*1c60b9acSAndroid Build Coastguard Worker lwsws_get_config_globals(struct lws_context_creation_info *info, const char *d,
994*1c60b9acSAndroid Build Coastguard Worker 			 char **cs, int *len)
995*1c60b9acSAndroid Build Coastguard Worker {
996*1c60b9acSAndroid Build Coastguard Worker 	struct lws_dir_args da;
997*1c60b9acSAndroid Build Coastguard Worker 	struct jpargs a;
998*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_PLUGINS)
999*1c60b9acSAndroid Build Coastguard Worker 	const char * const *old = info->plugin_dirs;
1000*1c60b9acSAndroid Build Coastguard Worker #endif
1001*1c60b9acSAndroid Build Coastguard Worker 	char dd[128];
1002*1c60b9acSAndroid Build Coastguard Worker 
1003*1c60b9acSAndroid Build Coastguard Worker 	memset(&a, 0, sizeof(a));
1004*1c60b9acSAndroid Build Coastguard Worker 
1005*1c60b9acSAndroid Build Coastguard Worker 	a.info = info;
1006*1c60b9acSAndroid Build Coastguard Worker 	a.p = *cs;
1007*1c60b9acSAndroid Build Coastguard Worker 	a.end = (a.p + *len) - 1;
1008*1c60b9acSAndroid Build Coastguard Worker 	a.valid = 0;
1009*1c60b9acSAndroid Build Coastguard Worker 
1010*1c60b9acSAndroid Build Coastguard Worker 	lwsws_align(&a);
1011*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_PLUGINS)
1012*1c60b9acSAndroid Build Coastguard Worker 	info->plugin_dirs = (void *)a.p;
1013*1c60b9acSAndroid Build Coastguard Worker #endif
1014*1c60b9acSAndroid Build Coastguard Worker 	a.plugin_dirs = (void *)a.p; /* writeable version */
1015*1c60b9acSAndroid Build Coastguard Worker 	a.p += MAX_PLUGIN_DIRS * sizeof(void *);
1016*1c60b9acSAndroid Build Coastguard Worker 
1017*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_PLUGINS)
1018*1c60b9acSAndroid Build Coastguard Worker 	/* copy any default paths */
1019*1c60b9acSAndroid Build Coastguard Worker 
1020*1c60b9acSAndroid Build Coastguard Worker 	while (old && *old) {
1021*1c60b9acSAndroid Build Coastguard Worker 		a.plugin_dirs[a.count_plugin_dirs++] = *old;
1022*1c60b9acSAndroid Build Coastguard Worker 		old++;
1023*1c60b9acSAndroid Build Coastguard Worker 	}
1024*1c60b9acSAndroid Build Coastguard Worker #endif
1025*1c60b9acSAndroid Build Coastguard Worker 
1026*1c60b9acSAndroid Build Coastguard Worker 	lws_snprintf(dd, sizeof(dd) - 1, "%s/conf", d);
1027*1c60b9acSAndroid Build Coastguard Worker 	if (lwsws_get_config(&a, dd, paths_global,
1028*1c60b9acSAndroid Build Coastguard Worker 			     LWS_ARRAY_SIZE(paths_global), lejp_globals_cb) > 1)
1029*1c60b9acSAndroid Build Coastguard Worker 		return 1;
1030*1c60b9acSAndroid Build Coastguard Worker 	lws_snprintf(dd, sizeof(dd) - 1, "%s/conf.d", d);
1031*1c60b9acSAndroid Build Coastguard Worker 
1032*1c60b9acSAndroid Build Coastguard Worker 	da.user = &a;
1033*1c60b9acSAndroid Build Coastguard Worker 	da.paths = paths_global;
1034*1c60b9acSAndroid Build Coastguard Worker 	da.count_paths = LWS_ARRAY_SIZE(paths_global),
1035*1c60b9acSAndroid Build Coastguard Worker 	da.cb = lejp_globals_cb;
1036*1c60b9acSAndroid Build Coastguard Worker 
1037*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dir(dd, &da, lwsws_get_config_d_cb) > 1)
1038*1c60b9acSAndroid Build Coastguard Worker 		return 1;
1039*1c60b9acSAndroid Build Coastguard Worker 
1040*1c60b9acSAndroid Build Coastguard Worker 	a.plugin_dirs[a.count_plugin_dirs] = NULL;
1041*1c60b9acSAndroid Build Coastguard Worker 
1042*1c60b9acSAndroid Build Coastguard Worker 	*cs = a.p;
1043*1c60b9acSAndroid Build Coastguard Worker 	*len = lws_ptr_diff(a.end, a.p);
1044*1c60b9acSAndroid Build Coastguard Worker 
1045*1c60b9acSAndroid Build Coastguard Worker 	return 0;
1046*1c60b9acSAndroid Build Coastguard Worker }
1047*1c60b9acSAndroid Build Coastguard Worker 
1048*1c60b9acSAndroid Build Coastguard Worker int
lwsws_get_config_vhosts(struct lws_context * context,struct lws_context_creation_info * info,const char * d,char ** cs,int * len)1049*1c60b9acSAndroid Build Coastguard Worker lwsws_get_config_vhosts(struct lws_context *context,
1050*1c60b9acSAndroid Build Coastguard Worker 			struct lws_context_creation_info *info, const char *d,
1051*1c60b9acSAndroid Build Coastguard Worker 			char **cs, int *len)
1052*1c60b9acSAndroid Build Coastguard Worker {
1053*1c60b9acSAndroid Build Coastguard Worker 	struct lws_dir_args da;
1054*1c60b9acSAndroid Build Coastguard Worker 	struct jpargs a;
1055*1c60b9acSAndroid Build Coastguard Worker 	char dd[128];
1056*1c60b9acSAndroid Build Coastguard Worker 
1057*1c60b9acSAndroid Build Coastguard Worker 	memset(&a, 0, sizeof(a));
1058*1c60b9acSAndroid Build Coastguard Worker 
1059*1c60b9acSAndroid Build Coastguard Worker 	a.info = info;
1060*1c60b9acSAndroid Build Coastguard Worker 	a.p = *cs;
1061*1c60b9acSAndroid Build Coastguard Worker 	a.end = a.p + *len;
1062*1c60b9acSAndroid Build Coastguard Worker 	a.valid = 0;
1063*1c60b9acSAndroid Build Coastguard Worker 	a.context = context;
1064*1c60b9acSAndroid Build Coastguard Worker 	a.protocols = info->protocols;
1065*1c60b9acSAndroid Build Coastguard Worker 	a.pprotocols = info->pprotocols;
1066*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_ROLE_WS)
1067*1c60b9acSAndroid Build Coastguard Worker 	a.extensions = info->extensions;
1068*1c60b9acSAndroid Build Coastguard Worker #endif
1069*1c60b9acSAndroid Build Coastguard Worker 
1070*1c60b9acSAndroid Build Coastguard Worker 	lws_snprintf(dd, sizeof(dd) - 1, "%s/conf", d);
1071*1c60b9acSAndroid Build Coastguard Worker 	if (lwsws_get_config(&a, dd, paths_vhosts,
1072*1c60b9acSAndroid Build Coastguard Worker 			     LWS_ARRAY_SIZE(paths_vhosts), lejp_vhosts_cb) > 1)
1073*1c60b9acSAndroid Build Coastguard Worker 		return 1;
1074*1c60b9acSAndroid Build Coastguard Worker 	lws_snprintf(dd, sizeof(dd) - 1, "%s/conf.d", d);
1075*1c60b9acSAndroid Build Coastguard Worker 
1076*1c60b9acSAndroid Build Coastguard Worker 	da.user = &a;
1077*1c60b9acSAndroid Build Coastguard Worker 	da.paths = paths_vhosts;
1078*1c60b9acSAndroid Build Coastguard Worker 	da.count_paths = LWS_ARRAY_SIZE(paths_vhosts),
1079*1c60b9acSAndroid Build Coastguard Worker 	da.cb = lejp_vhosts_cb;
1080*1c60b9acSAndroid Build Coastguard Worker 
1081*1c60b9acSAndroid Build Coastguard Worker 	if (lws_dir(dd, &da, lwsws_get_config_d_cb) > 1)
1082*1c60b9acSAndroid Build Coastguard Worker 		return 1;
1083*1c60b9acSAndroid Build Coastguard Worker 
1084*1c60b9acSAndroid Build Coastguard Worker 	*cs = a.p;
1085*1c60b9acSAndroid Build Coastguard Worker 	*len = lws_ptr_diff(a.end, a.p);
1086*1c60b9acSAndroid Build Coastguard Worker 
1087*1c60b9acSAndroid Build Coastguard Worker 	if (!a.any_vhosts) {
1088*1c60b9acSAndroid Build Coastguard Worker 		lwsl_err("Need at least one vhost\n");
1089*1c60b9acSAndroid Build Coastguard Worker 		return 1;
1090*1c60b9acSAndroid Build Coastguard Worker 	}
1091*1c60b9acSAndroid Build Coastguard Worker 
1092*1c60b9acSAndroid Build Coastguard Worker //	lws_finalize_startup(context);
1093*1c60b9acSAndroid Build Coastguard Worker 
1094*1c60b9acSAndroid Build Coastguard Worker 	return 0;
1095*1c60b9acSAndroid Build Coastguard Worker }
1096