libwebsockets
Lightweight C library for HTML5 websockets
lws-protocols-plugins.h
1 /*
2  * libwebsockets - small server side websockets and web server implementation
3  *
4  * Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22  * IN THE SOFTWARE.
23  */
24 
41 
44 struct lws_protocols {
45  const char *name;
66  unsigned int id;
73  void *user;
85  /* Add new things just above here ---^
86  * This is part of the ABI, don't needlessly break compatibility */
87 };
88 
97 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
98 lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name);
99 
109 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
110 lws_get_protocol(struct lws *wsi);
111 
113 LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
114 lws_protocol_get(struct lws *wsi) LWS_WARN_DEPRECATED;
115 
126 LWS_VISIBLE LWS_EXTERN void *
127 lws_protocol_vh_priv_zalloc(struct lws_vhost *vhost,
128  const struct lws_protocols *prot, int size);
129 
139 LWS_VISIBLE LWS_EXTERN void *
140 lws_protocol_vh_priv_get(struct lws_vhost *vhost,
141  const struct lws_protocols *prot);
142 
173 LWS_VISIBLE LWS_EXTERN void *
174 lws_vhd_find_by_pvo(struct lws_context *cx, const char *protname,
175  const char *pvo_name, const char *pvo_value);
176 
177 
192 LWS_VISIBLE LWS_EXTERN void *
193 lws_adjust_protocol_psds(struct lws *wsi, size_t new_size);
194 
203 LWS_VISIBLE LWS_EXTERN int
204 lws_finalize_startup(struct lws_context *context);
205 
214 LWS_VISIBLE LWS_EXTERN const struct lws_protocol_vhost_options *
215 lws_pvo_search(const struct lws_protocol_vhost_options *pvo, const char *name);
216 
226 LWS_VISIBLE LWS_EXTERN int
227 lws_pvo_get_str(void *in, const char *name, const char **result);
228 
229 LWS_VISIBLE LWS_EXTERN int
230 lws_protocol_init(struct lws_context *context);
231 
232 #define LWS_PLUGIN_API_MAGIC 191
233 
234 /*
235  * Abstract plugin header for any kind of plugin class, always at top of
236  * actual class plugin export type.
237  *
238  * The export type object must be exported with the same name as the plugin
239  * file, eg, libmyplugin.so must export a const one of these as the symbol
240  * "myplugin".
241  *
242  * That is the only expected export from the plugin.
243  */
244 
245 typedef struct lws_plugin_header {
246  const char *name;
247  const char *_class;
248  const char *lws_build_hash; /* set to LWS_BUILD_HASH */
249 
250  unsigned int api_magic;
251  /* set to LWS_PLUGIN_API_MAGIC at plugin build time */
252 
253  /* plugin-class specific superclass data follows */
255 
256 /*
257  * "lws_protocol_plugin" class export, for lws_protocol implementations done
258  * as plugins
259  */
260 typedef struct lws_plugin_protocol {
262 
263  const struct lws_protocols *protocols;
264  const struct lws_extension *extensions;
268 
269 
270 /*
271  * This is the dynamic, runtime created part of the plugin instantiation.
272  * These are kept in a linked-list and destroyed with the context.
273  */
274 
275 struct lws_plugin {
276  struct lws_plugin *list;
278  const lws_plugin_header_t *hdr;
279 
280  union {
281 #if defined(LWS_WITH_LIBUV) && defined(UV_ERRNO_MAP)
282 #if (UV_VERSION_MAJOR > 0)
283  uv_lib_t lib;
284 #endif
285 #endif
286  void *l;
287  } u;
288 };
289 
290 /*
291  * Event lib library plugin type (when LWS_WITH_EVLIB_PLUGINS)
292  * Public so new event libs can equally be supported outside lws itself
293  */
294 
295 typedef struct lws_plugin_evlib {
297  const struct lws_event_loop_ops *ops;
299 
300 typedef int (*each_plugin_cb_t)(struct lws_plugin *p, void *user);
301 
323 LWS_VISIBLE LWS_EXTERN int
324 lws_plugins_init(struct lws_plugin **pplugin, const char * const *d,
325  const char *_class, const char *filter,
326  each_plugin_cb_t each, void *each_user);
327 
341 LWS_VISIBLE LWS_EXTERN int
342 lws_plugins_destroy(struct lws_plugin **pplugin, each_plugin_cb_t each,
343  void *each_user);
344 
345 #if defined(LWS_WITH_PLUGINS_BUILTIN)
346 
347 /* provide exports for builtin plugin protocols */
348 
349 extern const struct lws_protocols post_demo_protocols[1];
350 extern const struct lws_protocols lws_raw_proxy_protocols[1];
351 extern const struct lws_protocols lws_status_protocols[1];
352 extern const struct lws_protocols lws_mirror_protocols[1];
353 extern const struct lws_protocols lws_ssh_base_protocols[2];
354 extern const struct lws_protocols post_demo_protocols[1];
355 extern const struct lws_protocols dumb_increment_protocols[1];
356 extern const struct lws_protocols deaddrop_protocols[1];
357 extern const struct lws_protocols lws_raw_test_protocols[1];
358 extern const struct lws_protocols lws_sshd_demo_protocols[1];
359 extern const struct lws_protocols lws_acme_client_protocols[1];
360 extern const struct lws_protocols client_loopback_test_protocols[1];
361 extern const struct lws_protocols fulltext_demo_protocols[1];
362 extern const struct lws_protocols lws_openmetrics_export_protocols[
363 #if defined(LWS_WITH_SERVER) && defined(LWS_WITH_CLIENT) && defined(LWS_ROLE_WS)
364  4
365 #else
366 #if defined(LWS_WITH_SERVER)
367  3
368 #else
369  1
370 #endif
371 #endif
372  ];
373 
374 #define LWSOMPROIDX_DIRECT_HTTP_SERVER 0
375 #define LWSOMPROIDX_PROX_HTTP_SERVER 1
376 #define LWSOMPROIDX_PROX_WS_SERVER 2
377 #define LWSOMPROIDX_PROX_WS_CLIENT 3
378 
379 #endif
380 
LWS_VISIBLE LWS_EXTERN int lws_finalize_startup(struct lws_context *context)
LWS_VISIBLE LWS_EXTERN int lws_pvo_get_str(void *in, const char *name, const char **result)
LWS_VISIBLE LWS_EXTERN const struct lws_protocols * lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name)
LWS_VISIBLE LWS_EXTERN void * lws_adjust_protocol_psds(struct lws *wsi, size_t new_size)
LWS_VISIBLE LWS_EXTERN const struct lws_protocols * lws_get_protocol(struct lws *wsi)
LWS_VISIBLE LWS_EXTERN const struct lws_protocols * lws_protocol_get(struct lws *wsi) LWS_WARN_DEPRECATED
LWS_VISIBLE LWS_EXTERN void * lws_vhd_find_by_pvo(struct lws_context *cx, const char *protname, const char *pvo_name, const char *pvo_value)
LWS_VISIBLE LWS_EXTERN int lws_plugins_init(struct lws_plugin **pplugin, const char *const *d, const char *_class, const char *filter, each_plugin_cb_t each, void *each_user)
LWS_VISIBLE LWS_EXTERN void * lws_protocol_vh_priv_zalloc(struct lws_vhost *vhost, const struct lws_protocols *prot, int size)
LWS_VISIBLE LWS_EXTERN void * lws_protocol_vh_priv_get(struct lws_vhost *vhost, const struct lws_protocols *prot)
LWS_VISIBLE LWS_EXTERN const struct lws_protocol_vhost_options * lws_pvo_search(const struct lws_protocol_vhost_options *pvo, const char *name)
LWS_VISIBLE LWS_EXTERN int lws_plugins_destroy(struct lws_plugin **pplugin, each_plugin_cb_t each, void *each_user)
int lws_callback_function(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
Definition: lws-callbacks.h:910
Definition: lws-ws-ext.h:139
Definition: lws-protocols-plugins.h:295
Definition: lws-protocols-plugins.h:245
Definition: lws-protocols-plugins.h:260
const struct lws_protocols * protocols
Definition: lws-protocols-plugins.h:263
int count_protocols
Definition: lws-protocols-plugins.h:265
int count_extensions
Definition: lws-protocols-plugins.h:266
const struct lws_extension * extensions
Definition: lws-protocols-plugins.h:264
Definition: lws-protocols-plugins.h:275
struct lws_plugin * list
Definition: lws-protocols-plugins.h:276
Definition: lws-context-vhost.h:1194
const char * name
Definition: lws-context-vhost.h:1197
Definition: lws-protocols-plugins.h:44
size_t rx_buffer_size
Definition: lws-protocols-plugins.h:57
const char * name
Definition: lws-protocols-plugins.h:45
void * user
Definition: lws-protocols-plugins.h:73
unsigned int id
Definition: lws-protocols-plugins.h:66
size_t per_session_data_size
Definition: lws-protocols-plugins.h:52
size_t tx_packet_size
Definition: lws-protocols-plugins.h:75
lws_callback_function * callback
Definition: lws-protocols-plugins.h:48