1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * libwebsockets - small server side websockets and web server implementation 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com> 5d4afb5ceSopenharmony_ci * 6d4afb5ceSopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy 7d4afb5ceSopenharmony_ci * of this software and associated documentation files (the "Software"), to 8d4afb5ceSopenharmony_ci * deal in the Software without restriction, including without limitation the 9d4afb5ceSopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10d4afb5ceSopenharmony_ci * sell copies of the Software, and to permit persons to whom the Software is 11d4afb5ceSopenharmony_ci * furnished to do so, subject to the following conditions: 12d4afb5ceSopenharmony_ci * 13d4afb5ceSopenharmony_ci * The above copyright notice and this permission notice shall be included in 14d4afb5ceSopenharmony_ci * all copies or substantial portions of the Software. 15d4afb5ceSopenharmony_ci * 16d4afb5ceSopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17d4afb5ceSopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18d4afb5ceSopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19d4afb5ceSopenharmony_ci * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20d4afb5ceSopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21d4afb5ceSopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22d4afb5ceSopenharmony_ci * IN THE SOFTWARE. 23d4afb5ceSopenharmony_ci */ 24d4afb5ceSopenharmony_ci 25d4afb5ceSopenharmony_ci#ifndef _WINSOCK_DEPRECATED_NO_WARNINGS 26d4afb5ceSopenharmony_ci#define _WINSOCK_DEPRECATED_NO_WARNINGS 27d4afb5ceSopenharmony_ci#endif 28d4afb5ceSopenharmony_ci#include "private-lib-core.h" 29d4afb5ceSopenharmony_ci 30d4afb5ceSopenharmony_ci/* 31d4afb5ceSopenharmony_ci * ie, if the plugins api needed at all 32d4afb5ceSopenharmony_ci */ 33d4afb5ceSopenharmony_ci 34d4afb5ceSopenharmony_ci#if defined(LWS_WITH_PLUGINS_API) && (UV_VERSION_MAJOR > 0) 35d4afb5ceSopenharmony_ci 36d4afb5ceSopenharmony_ciconst lws_plugin_header_t * 37d4afb5ceSopenharmony_cilws_plat_dlopen(struct lws_plugin **pplugin, const char *libpath, 38d4afb5ceSopenharmony_ci const char *sofilename, const char *_class, 39d4afb5ceSopenharmony_ci each_plugin_cb_t each, void *each_user) 40d4afb5ceSopenharmony_ci{ 41d4afb5ceSopenharmony_ci const lws_plugin_header_t *hdr; 42d4afb5ceSopenharmony_ci struct lws_plugin *pin; 43d4afb5ceSopenharmony_ci char sym[96], *dot; 44d4afb5ceSopenharmony_ci uv_lib_t lib; 45d4afb5ceSopenharmony_ci void *v; 46d4afb5ceSopenharmony_ci int m; 47d4afb5ceSopenharmony_ci 48d4afb5ceSopenharmony_ci lib.errmsg = NULL; 49d4afb5ceSopenharmony_ci lib.handle = NULL; 50d4afb5ceSopenharmony_ci 51d4afb5ceSopenharmony_ci if (uv_dlopen(libpath, &lib)) { 52d4afb5ceSopenharmony_ci uv_dlerror(&lib); 53d4afb5ceSopenharmony_ci lwsl_err("Error loading DSO: %s\n", lib.errmsg); 54d4afb5ceSopenharmony_ci uv_dlclose(&lib); 55d4afb5ceSopenharmony_ci return NULL; 56d4afb5ceSopenharmony_ci } 57d4afb5ceSopenharmony_ci 58d4afb5ceSopenharmony_ci /* we could open it... can we get his export struct? */ 59d4afb5ceSopenharmony_ci m = lws_snprintf(sym, sizeof(sym) - 1, "%s", sofilename); 60d4afb5ceSopenharmony_ci if (m < 4) 61d4afb5ceSopenharmony_ci goto bail; 62d4afb5ceSopenharmony_ci dot = strchr(sym, '.'); 63d4afb5ceSopenharmony_ci if (dot) 64d4afb5ceSopenharmony_ci *dot = '\0'; /* snip the .so or .lib or what-have-you*/ 65d4afb5ceSopenharmony_ci 66d4afb5ceSopenharmony_ci if (uv_dlsym(&lib, sym, &v)) { 67d4afb5ceSopenharmony_ci uv_dlerror(&lib); 68d4afb5ceSopenharmony_ci lwsl_err("%s: Failed to get '%s' on %s: %s\n", 69d4afb5ceSopenharmony_ci __func__, path, libpath, lib.errmsg); 70d4afb5ceSopenharmony_ci goto bail; 71d4afb5ceSopenharmony_ci } 72d4afb5ceSopenharmony_ci 73d4afb5ceSopenharmony_ci hdr = (const lws_plugin_header_t *)v; 74d4afb5ceSopenharmony_ci if (hdr->api_magic != LWS_PLUGIN_API_MAGIC) { 75d4afb5ceSopenharmony_ci lwsl_info("%s: plugin %s has outdated api %d (vs %d)\n", 76d4afb5ceSopenharmony_ci __func__, libpath, hdr->api_magic, 77d4afb5ceSopenharmony_ci LWS_PLUGIN_API_MAGIC); 78d4afb5ceSopenharmony_ci goto bail; 79d4afb5ceSopenharmony_ci } 80d4afb5ceSopenharmony_ci 81d4afb5ceSopenharmony_ci if (strcmp(hdr->lws_build_hash, LWS_BUILD_HASH)) 82d4afb5ceSopenharmony_ci goto bail; 83d4afb5ceSopenharmony_ci 84d4afb5ceSopenharmony_ci if (strcmp(hdr->_class, _class)) 85d4afb5ceSopenharmony_ci goto bail; 86d4afb5ceSopenharmony_ci 87d4afb5ceSopenharmony_ci /* 88d4afb5ceSopenharmony_ci * We don't already have one of these, right? 89d4afb5ceSopenharmony_ci */ 90d4afb5ceSopenharmony_ci 91d4afb5ceSopenharmony_ci pin = *pplugin; 92d4afb5ceSopenharmony_ci while (pin) { 93d4afb5ceSopenharmony_ci if (!strcmp(pin->hdr->name, hdr->name)) 94d4afb5ceSopenharmony_ci goto bail; 95d4afb5ceSopenharmony_ci pin = pin->list; 96d4afb5ceSopenharmony_ci } 97d4afb5ceSopenharmony_ci 98d4afb5ceSopenharmony_ci /* 99d4afb5ceSopenharmony_ci * OK let's bring it in 100d4afb5ceSopenharmony_ci */ 101d4afb5ceSopenharmony_ci 102d4afb5ceSopenharmony_ci pin = lws_malloc(sizeof(*pin), __func__); 103d4afb5ceSopenharmony_ci if (!pin) 104d4afb5ceSopenharmony_ci goto bail; 105d4afb5ceSopenharmony_ci 106d4afb5ceSopenharmony_ci pin->list = *pplugin; 107d4afb5ceSopenharmony_ci *pplugin = pin; 108d4afb5ceSopenharmony_ci 109d4afb5ceSopenharmony_ci pin->u.lib = lib; 110d4afb5ceSopenharmony_ci pin->hdr = hdr; 111d4afb5ceSopenharmony_ci 112d4afb5ceSopenharmony_ci if (each) 113d4afb5ceSopenharmony_ci each(pin, each_user); 114d4afb5ceSopenharmony_ci 115d4afb5ceSopenharmony_ci return hdr; 116d4afb5ceSopenharmony_ci 117d4afb5ceSopenharmony_cibail: 118d4afb5ceSopenharmony_ci uv_dlclose(&lib); 119d4afb5ceSopenharmony_ci 120d4afb5ceSopenharmony_ci return NULL; 121d4afb5ceSopenharmony_ci} 122d4afb5ceSopenharmony_ci 123d4afb5ceSopenharmony_ciint 124d4afb5ceSopenharmony_cilws_plat_destroy_dl(struct lws_plugin *p) 125d4afb5ceSopenharmony_ci{ 126d4afb5ceSopenharmony_ci uv_dlclose(&p->u.lib); 127d4afb5ceSopenharmony_ci 128d4afb5ceSopenharmony_ci return 0; 129d4afb5ceSopenharmony_ci} 130d4afb5ceSopenharmony_ci 131d4afb5ceSopenharmony_ci#endif 132d4afb5ceSopenharmony_ci 133d4afb5ceSopenharmony_ci/* 134d4afb5ceSopenharmony_ci * Specifically for protocol plugins support 135d4afb5ceSopenharmony_ci */ 136d4afb5ceSopenharmony_ci 137d4afb5ceSopenharmony_ci#if defined(LWS_WITH_PLUGINS) && (UV_VERSION_MAJOR > 0) 138d4afb5ceSopenharmony_ci 139d4afb5ceSopenharmony_cistatic int 140d4afb5ceSopenharmony_ciprotocol_plugin_cb(struct lws_plugin *pin, void *each_user) 141d4afb5ceSopenharmony_ci{ 142d4afb5ceSopenharmony_ci struct lws_context *context = (struct lws_context *)each_user; 143d4afb5ceSopenharmony_ci const lws_plugin_protocol_t *plpr = 144d4afb5ceSopenharmony_ci (const lws_plugin_protocol_t *)pin->hdr; 145d4afb5ceSopenharmony_ci 146d4afb5ceSopenharmony_ci context->plugin_protocol_count += plpr->count_protocols; 147d4afb5ceSopenharmony_ci context->plugin_extension_count += plpr->count_extensions; 148d4afb5ceSopenharmony_ci 149d4afb5ceSopenharmony_ci return 0; 150d4afb5ceSopenharmony_ci} 151d4afb5ceSopenharmony_ci#endif 152d4afb5ceSopenharmony_ci 153d4afb5ceSopenharmony_ciint 154d4afb5ceSopenharmony_cilws_plat_plugins_init(struct lws_context *context, const char * const *d) 155d4afb5ceSopenharmony_ci{ 156d4afb5ceSopenharmony_ci#if defined(LWS_WITH_PLUGINS) && (UV_VERSION_MAJOR > 0) 157d4afb5ceSopenharmony_ci if (info->plugin_dirs) { 158d4afb5ceSopenharmony_ci uv_loop_init(&context->uv.loop); 159d4afb5ceSopenharmony_ci lws_plugins_init(&context->plugin_list, info->plugin_dirs, 160d4afb5ceSopenharmony_ci "lws_protocol_plugin", NULL, 161d4afb5ceSopenharmony_ci protocol_plugin_cb, context); 162d4afb5ceSopenharmony_ci } 163d4afb5ceSopenharmony_ci#endif 164d4afb5ceSopenharmony_ci 165d4afb5ceSopenharmony_ci return 0; 166d4afb5ceSopenharmony_ci} 167d4afb5ceSopenharmony_ci 168d4afb5ceSopenharmony_ciint 169d4afb5ceSopenharmony_cilws_plat_plugins_destroy(struct lws_context * context) 170d4afb5ceSopenharmony_ci{ 171d4afb5ceSopenharmony_ci#if defined(LWS_WITH_PLUGINS) && (UV_VERSION_MAJOR > 0) 172d4afb5ceSopenharmony_ci if (lws_check_opt(context->options, LWS_SERVER_OPTION_LIBUV) && 173d4afb5ceSopenharmony_ci context->plugin_list) { 174d4afb5ceSopenharmony_ci lws_plugins_destroy(&context->plugin_list, NULL, NULL); 175d4afb5ceSopenharmony_ci while (uv_loop_close(&context->uv.loop)) 176d4afb5ceSopenharmony_ci ; 177d4afb5ceSopenharmony_ci } 178d4afb5ceSopenharmony_ci#endif 179d4afb5ceSopenharmony_ci 180d4afb5ceSopenharmony_ci return 0; 181d4afb5ceSopenharmony_ci} 182