From 7c9f1ca0a6917290f8848594ba23d4a66196a83e Mon Sep 17 00:00:00 2001 From: Andy Green Date: Sun, 7 Nov 2021 05:22:32 +0000 Subject: [PATCH] plugins: iterate builtin plugins as if loaded For plugins that handle PROTOCOL_INIT, we have to iterate any PLUGINS_BUILTIN plugins as if we had just discovered and loaded them from plugin files, so they bind to vhosts appropriately. Add some private helpers to keep the guts from duplication in plat. --- cmake/lws_config.h.in | 1 + lib/core-net/private-lib-core-net.h | 6 ++++ lib/misc/dir.c | 49 ++++++++++++++++++++++++++++- lib/plat/unix/unix-init.c | 7 ++++- lib/plat/unix/unix-plugins.c | 5 +-- lib/plat/windows/windows-init.c | 7 ++++- 6 files changed, 68 insertions(+), 7 deletions(-) diff --git a/cmake/lws_config.h.in b/cmake/lws_config.h.in index bfc591d4c..28c5ecf47 100644 --- a/cmake/lws_config.h.in +++ b/cmake/lws_config.h.in @@ -27,6 +27,7 @@ #cmakedefine LWS_AVOID_SIGPIPE_IGN #cmakedefine LWS_BUILD_HASH "${LWS_BUILD_HASH}" #cmakedefine LWS_BUILTIN_GETIFADDRS +#cmakedefine LWS_BUILTIN_PLUGIN_NAMES "${LWS_BUILTIN_PLUGIN_NAMES}" #cmakedefine LWS_CLIENT_HTTP_PROXYING #cmakedefine LWS_DETECTED_PLAT_IOS #cmakedefine LWS_FALLBACK_GETHOSTBYNAME diff --git a/lib/core-net/private-lib-core-net.h b/lib/core-net/private-lib-core-net.h index 02c261058..51b66c806 100644 --- a/lib/core-net/private-lib-core-net.h +++ b/lib/core-net/private-lib-core-net.h @@ -1402,6 +1402,12 @@ lws_broadcast(struct lws_context_per_thread *pt, int reason, void *in, size_t le const char * lws_errno_describe(int en, char *result, size_t len); +struct lws_plugin * +lws_plugin_alloc(struct lws_plugin **pplugin); + +int +lws_plugins_handle_builtin(struct lws_plugin **pplugin, + each_plugin_cb_t each, void *each_user); #if defined(LWS_WITH_PEER_LIMITS) void diff --git a/lib/misc/dir.c b/lib/misc/dir.c index 94a07ca92..30ace0af1 100644 --- a/lib/misc/dir.c +++ b/lib/misc/dir.c @@ -286,6 +286,52 @@ lws_dir_rm_rf_cb(const char *dirpath, void *user, struct lws_dir_entry *lde) #if defined(LWS_WITH_PLUGINS_API) +struct lws_plugin * +lws_plugin_alloc(struct lws_plugin **pplugin) +{ + struct lws_plugin *pin = lws_malloc(sizeof(*pin), __func__); + + if (!pin) + return NULL; + + pin->list = *pplugin; + *pplugin = pin; + + return pin; +} + +#if defined(LWS_BUILTIN_PLUGIN_NAMES) + +extern lws_plugin_protocol_t lws_sshd_demo, lws_ssh_base; + +lws_plugin_protocol_t *builtin_pcols[] = { + &lws_sshd_demo, &lws_ssh_base +}; + +int +lws_plugins_handle_builtin(struct lws_plugin **pplugin, + each_plugin_cb_t each, void *each_user) +{ + size_t n = 0; + + while (n < LWS_ARRAY_SIZE(builtin_pcols)) { + struct lws_plugin *pin = lws_plugin_alloc(pplugin); + if (!pin) + return 1; + + pin->u.l = NULL; + pin->hdr = &builtin_pcols[n]->hdr; + + if (each) + each(pin, each_user); + + n++; + } + + return 0; +} +#endif + struct lws_plugins_args { struct lws_plugin **pplugin; const char *_class; @@ -411,7 +457,8 @@ lws_plugins_destroy(struct lws_plugin **pplugin, each_plugin_cb_t each, while (p) { if (each) each(p, each_user); - lws_plat_destroy_dl(p); + if (p->u.l) + lws_plat_destroy_dl(p); p1 = p->list; p->list = NULL; lws_free(p); diff --git a/lib/plat/unix/unix-init.c b/lib/plat/unix/unix-init.c index 46f072f9b..cbdfdb376 100644 --- a/lib/plat/unix/unix-init.c +++ b/lib/plat/unix/unix-init.c @@ -178,7 +178,7 @@ lws_plat_init(struct lws_context *context, return 1; } -#if defined(LWS_WITH_PLUGINS) +#if defined(LWS_WITH_PLUGINS) && !defined(LWS_WITH_PLUGINS_BUILTIN) { char *ld_env = getenv("LD_LIBRARY_PATH"); @@ -196,6 +196,11 @@ lws_plat_init(struct lws_context *context, "lws_protocol_plugin", NULL, protocol_plugin_cb, context); } + +#endif +#if defined(LWS_BUILTIN_PLUGIN_NAMES) + lws_plugins_handle_builtin(&context->plugin_list, + protocol_plugin_cb, context); #endif diff --git a/lib/plat/unix/unix-plugins.c b/lib/plat/unix/unix-plugins.c index 55271bb59..8bc038c06 100644 --- a/lib/plat/unix/unix-plugins.c +++ b/lib/plat/unix/unix-plugins.c @@ -97,13 +97,10 @@ lws_plat_dlopen(struct lws_plugin **pplugin, const char *libpath, * OK let's bring it in */ - pin = lws_malloc(sizeof(*pin), __func__); + pin = lws_plugin_alloc(pplugin); if (!pin) goto bail; - pin->list = *pplugin; - *pplugin = pin; - pin->u.l = l; pin->hdr = hdr; diff --git a/lib/plat/windows/windows-init.c b/lib/plat/windows/windows-init.c index 00190c710..492b531e6 100644 --- a/lib/plat/windows/windows-init.c +++ b/lib/plat/windows/windows-init.c @@ -121,12 +121,17 @@ lws_plat_init(struct lws_context *context, context->fd_random = 0; -#if defined(LWS_WITH_PLUGINS) +#if defined(LWS_WITH_PLUGINS) && !defined(LWS_WITH_PLUGINS_BUILTIN) if (info->plugin_dirs) lws_plat_plugins_init(&context->plugin_list, info->plugin_dirs, "lws_protocol_plugin", protocol_plugin_cb, context); #endif +#if defined(LWS_BUILTIN_PLUGIN_NAMES) + lws_plugins_handle_builtin(&context->plugin_list, + protocol_plugin_cb, context); +#endif + return 0; }