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