1d4afb5ceSopenharmony_ci/*
2d4afb5ceSopenharmony_ci * lws-minimal-secure-streams-server
3d4afb5ceSopenharmony_ci *
4d4afb5ceSopenharmony_ci * Written in 2010-2020 by Andy Green <andy@warmcat.com>
5d4afb5ceSopenharmony_ci *
6d4afb5ceSopenharmony_ci * This file is made available under the Creative Commons CC0 1.0
7d4afb5ceSopenharmony_ci * Universal Public Domain Dedication.
8d4afb5ceSopenharmony_ci */
9d4afb5ceSopenharmony_ci
10d4afb5ceSopenharmony_ci#include <libwebsockets.h>
11d4afb5ceSopenharmony_ci#include <string.h>
12d4afb5ceSopenharmony_ci#include <signal.h>
13d4afb5ceSopenharmony_ci
14d4afb5ceSopenharmony_ciextern const lws_ss_info_t ssi_client, ssi_server;
15d4afb5ceSopenharmony_ci
16d4afb5ceSopenharmony_cistatic struct lws_context *context;
17d4afb5ceSopenharmony_ciint interrupted, bad = 1;
18d4afb5ceSopenharmony_cistatic const char * const default_ss_policy =
19d4afb5ceSopenharmony_ci	"{"
20d4afb5ceSopenharmony_ci	  "\"release\":"			"\"01234567\","
21d4afb5ceSopenharmony_ci	  "\"product\":"			"\"myproduct\","
22d4afb5ceSopenharmony_ci	  "\"schema-version\":"			"1,"
23d4afb5ceSopenharmony_ci	  "\"s\": ["
24d4afb5ceSopenharmony_ci
25d4afb5ceSopenharmony_ci		/*
26d4afb5ceSopenharmony_ci		 * This streamtype represents a raw server listening on :7681,
27d4afb5ceSopenharmony_ci		 * without tls
28d4afb5ceSopenharmony_ci		 */
29d4afb5ceSopenharmony_ci
30d4afb5ceSopenharmony_ci		"{\"myrawserver\": {"
31d4afb5ceSopenharmony_ci			/* if given, "endpoint" is network if to bind to */
32d4afb5ceSopenharmony_ci			"\"server\":"		"true,"
33d4afb5ceSopenharmony_ci			"\"port\":"		"7681,"
34d4afb5ceSopenharmony_ci			"\"protocol\":"		"\"raw\""
35d4afb5ceSopenharmony_ci		"}}"
36d4afb5ceSopenharmony_ci
37d4afb5ceSopenharmony_ci	  "]"
38d4afb5ceSopenharmony_ci	"}"
39d4afb5ceSopenharmony_ci;
40d4afb5ceSopenharmony_ci
41d4afb5ceSopenharmony_cistatic int
42d4afb5ceSopenharmony_cismd_cb(void *opaque, lws_smd_class_t c, lws_usec_t ts, void *buf, size_t len)
43d4afb5ceSopenharmony_ci{
44d4afb5ceSopenharmony_ci	if ((c & LWSSMDCL_SYSTEM_STATE) &&
45d4afb5ceSopenharmony_ci	    !lws_json_simple_strcmp(buf, len, "\"state\":", "OPERATIONAL")) {
46d4afb5ceSopenharmony_ci
47d4afb5ceSopenharmony_ci		/* create the secure streams */
48d4afb5ceSopenharmony_ci
49d4afb5ceSopenharmony_ci		lwsl_notice("%s: creating server stream\n", __func__);
50d4afb5ceSopenharmony_ci
51d4afb5ceSopenharmony_ci		if (lws_ss_create(context, 0, &ssi_server, NULL, NULL,
52d4afb5ceSopenharmony_ci				  NULL, NULL)) {
53d4afb5ceSopenharmony_ci			lwsl_err("%s: failed to create secure stream\n",
54d4afb5ceSopenharmony_ci				 __func__);
55d4afb5ceSopenharmony_ci			return -1;
56d4afb5ceSopenharmony_ci		}
57d4afb5ceSopenharmony_ci	}
58d4afb5ceSopenharmony_ci
59d4afb5ceSopenharmony_ci	return 0;
60d4afb5ceSopenharmony_ci}
61d4afb5ceSopenharmony_ci
62d4afb5ceSopenharmony_cistatic void
63d4afb5ceSopenharmony_cisigint_handler(int sig)
64d4afb5ceSopenharmony_ci{
65d4afb5ceSopenharmony_ci	interrupted = 1;
66d4afb5ceSopenharmony_ci}
67d4afb5ceSopenharmony_ci
68d4afb5ceSopenharmony_ciint main(int argc, const char **argv)
69d4afb5ceSopenharmony_ci{
70d4afb5ceSopenharmony_ci	struct lws_context_creation_info info;
71d4afb5ceSopenharmony_ci	int n = 0;
72d4afb5ceSopenharmony_ci
73d4afb5ceSopenharmony_ci	signal(SIGINT, sigint_handler);
74d4afb5ceSopenharmony_ci
75d4afb5ceSopenharmony_ci	memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */
76d4afb5ceSopenharmony_ci	lws_cmdline_option_handle_builtin(argc, argv, &info);
77d4afb5ceSopenharmony_ci	lwsl_user("LWS Secure Streams Server Raw\n");
78d4afb5ceSopenharmony_ci
79d4afb5ceSopenharmony_ci	info.options			= LWS_SERVER_OPTION_EXPLICIT_VHOSTS |
80d4afb5ceSopenharmony_ci					  LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
81d4afb5ceSopenharmony_ci	info.fd_limit_per_thread	= 1 + 6 + 1;
82d4afb5ceSopenharmony_ci	info.pss_policies_json		= default_ss_policy;
83d4afb5ceSopenharmony_ci	info.port			= CONTEXT_PORT_NO_LISTEN;
84d4afb5ceSopenharmony_ci	info.early_smd_cb		= smd_cb;
85d4afb5ceSopenharmony_ci	info.early_smd_class_filter	= LWSSMDCL_SYSTEM_STATE;
86d4afb5ceSopenharmony_ci
87d4afb5ceSopenharmony_ci	context = lws_create_context(&info);
88d4afb5ceSopenharmony_ci	if (!context) {
89d4afb5ceSopenharmony_ci		lwsl_err("lws init failed\n");
90d4afb5ceSopenharmony_ci		return 1;
91d4afb5ceSopenharmony_ci	}
92d4afb5ceSopenharmony_ci
93d4afb5ceSopenharmony_ci	/* the event loop */
94d4afb5ceSopenharmony_ci
95d4afb5ceSopenharmony_ci	while (n >= 0 && !interrupted)
96d4afb5ceSopenharmony_ci		n = lws_service(context, 0);
97d4afb5ceSopenharmony_ci
98d4afb5ceSopenharmony_ci	bad = 0;
99d4afb5ceSopenharmony_ci
100d4afb5ceSopenharmony_ci	lws_context_destroy(context);
101d4afb5ceSopenharmony_ci	lwsl_user("Completed: %s\n", bad ? "failed" : "OK");
102d4afb5ceSopenharmony_ci
103d4afb5ceSopenharmony_ci	return bad;
104d4afb5ceSopenharmony_ci}
105