xref: /aosp_15_r20/external/libwebsockets/READMEs/README.lws_plugins.md (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker# lws_plugins
2*1c60b9acSAndroid Build Coastguard Worker
3*1c60b9acSAndroid Build Coastguard WorkerLws now offers apis to manage your own user plugins with `LWS_WITH_PLUGINS_API`.
4*1c60b9acSAndroid Build Coastguard WorkerLws uses these apis internally for protocol plugins and event loop plugins
5*1c60b9acSAndroid Build Coastguard Workerif they're selected for build.  But they are also exported for user code to
6*1c60b9acSAndroid Build Coastguard Workeruse them how you like.
7*1c60b9acSAndroid Build Coastguard Worker
8*1c60b9acSAndroid Build Coastguard Worker## Creating your plugin export
9*1c60b9acSAndroid Build Coastguard Worker
10*1c60b9acSAndroid Build Coastguard Worker### Specifying your plugin export type
11*1c60b9acSAndroid Build Coastguard Worker
12*1c60b9acSAndroid Build Coastguard WorkerLws plugins have a single exported struct with a specified header and a user
13*1c60b9acSAndroid Build Coastguard Workerdefined remainder.  The public `lws_plugin_header_t` describes the common
14*1c60b9acSAndroid Build Coastguard Workerplugin export header, it's defined via libwebsockets.h as
15*1c60b9acSAndroid Build Coastguard Worker
16*1c60b9acSAndroid Build Coastguard Worker```
17*1c60b9acSAndroid Build Coastguard Workertypedef struct lws_plugin_header {
18*1c60b9acSAndroid Build Coastguard Worker	const char *name;
19*1c60b9acSAndroid Build Coastguard Worker	const char *_class;
20*1c60b9acSAndroid Build Coastguard Worker
21*1c60b9acSAndroid Build Coastguard Worker	unsigned int api_magic;
22*1c60b9acSAndroid Build Coastguard Worker	/* set to LWS_PLUGIN_API_MAGIC at plugin build time */
23*1c60b9acSAndroid Build Coastguard Worker
24*1c60b9acSAndroid Build Coastguard Worker	/* plugin-class specific superclass data follows */
25*1c60b9acSAndroid Build Coastguard Worker} lws_plugin_header_t;
26*1c60b9acSAndroid Build Coastguard Worker```
27*1c60b9acSAndroid Build Coastguard Worker
28*1c60b9acSAndroid Build Coastguard WorkerThe exported symbol name itself must match the plugin filename, for
29*1c60b9acSAndroid Build Coastguard Workerexample if the symbol name is `my_plugin`, then the filename of the
30*1c60b9acSAndroid Build Coastguard Workerplugin might be `libmyapp-my_plugin.so` or similar... the matching
31*1c60b9acSAndroid Build Coastguard Workerpart is after the first `-` or `_`, up to the first `.`.  The exact
32*1c60b9acSAndroid Build Coastguard Workerdetails differ by platform but these rules cover the supported
33*1c60b9acSAndroid Build Coastguard Workerplatforms.  If lws has the filename of the plugin, it can then
34*1c60b9acSAndroid Build Coastguard Workerdeduce the symbol export it should look for in the plugin.
35*1c60b9acSAndroid Build Coastguard Worker
36*1c60b9acSAndroid Build Coastguard Worker`name` is a freeform human-readable description for the plugin.
37*1c60b9acSAndroid Build Coastguard Worker
38*1c60b9acSAndroid Build Coastguard Worker`_class` is shared by your plugins and used to select them from other kinds
39*1c60b9acSAndroid Build Coastguard Workerof plugin that may be in the same dir.  So choose a unique name like
40*1c60b9acSAndroid Build Coastguard Worker`"myapp xxx plugin"` or whatever shared by all plugins of that class.
41*1c60b9acSAndroid Build Coastguard Worker
42*1c60b9acSAndroid Build Coastguard Worker`api_magic` is set to `LWS_PLUGIN_API_MAGIC` to detect if the plugin is
43*1c60b9acSAndroid Build Coastguard Workerincompatible with the lws plugin apis version.
44*1c60b9acSAndroid Build Coastguard Worker
45*1c60b9acSAndroid Build Coastguard WorkerSo for example your plugin type wrapping the header might look like
46*1c60b9acSAndroid Build Coastguard Worker
47*1c60b9acSAndroid Build Coastguard Worker```
48*1c60b9acSAndroid Build Coastguard Workertypedef struct myapp_plugin {
49*1c60b9acSAndroid Build Coastguard Worker        lws_plugin_header_t	hdr; /* must be first */
50*1c60b9acSAndroid Build Coastguard Worker
51*1c60b9acSAndroid Build Coastguard Worker	/* optional extra data like function pointers from your plugin */
52*1c60b9acSAndroid Build Coastguard Worker	mytype_t		mymember;
53*1c60b9acSAndroid Build Coastguard Worker	/* ... */
54*1c60b9acSAndroid Build Coastguard Worker} myapp_plugin_t;
55*1c60b9acSAndroid Build Coastguard Worker```
56*1c60b9acSAndroid Build Coastguard Worker
57*1c60b9acSAndroid Build Coastguard WorkerTypically, you will put function pointers to whatever capability your plugin
58*1c60b9acSAndroid Build Coastguard Workerclass offers as the additional members.
59*1c60b9acSAndroid Build Coastguard Worker
60*1c60b9acSAndroid Build Coastguard Worker## Building your own plugins
61*1c60b9acSAndroid Build Coastguard Worker
62*1c60b9acSAndroid Build Coastguard WorkerPlugins are built standalone, cmake is recommended but you can do what you want.
63*1c60b9acSAndroid Build Coastguard Worker
64*1c60b9acSAndroid Build Coastguard WorkerThe only requirement is the single visible export of the plugin name, eg
65*1c60b9acSAndroid Build Coastguard Worker
66*1c60b9acSAndroid Build Coastguard Worker```
67*1c60b9acSAndroid Build Coastguard Workerconst myapp_plugin_t my_plugin = {
68*1c60b9acSAndroid Build Coastguard Worker	.hdr = {
69*1c60b9acSAndroid Build Coastguard Worker		"my_plugin",
70*1c60b9acSAndroid Build Coastguard Worker		"myapp xxx plugin",
71*1c60b9acSAndroid Build Coastguard Worker		LWS_PLUGIN_API_MAGIC
72*1c60b9acSAndroid Build Coastguard Worker	},
73*1c60b9acSAndroid Build Coastguard Worker
74*1c60b9acSAndroid Build Coastguard Worker	.mymember	= my_plugin_init,
75*1c60b9acSAndroid Build Coastguard Worker	/*...*/
76*1c60b9acSAndroid Build Coastguard Worker};
77*1c60b9acSAndroid Build Coastguard Worker```
78*1c60b9acSAndroid Build Coastguard Worker
79*1c60b9acSAndroid Build Coastguard Worker## Bringing in plugins at runtime
80*1c60b9acSAndroid Build Coastguard Worker
81*1c60b9acSAndroid Build Coastguard WorkerLws provides an api to import plugins into the process space and another to
82*1c60b9acSAndroid Build Coastguard Workerremove and destroy plugins.
83*1c60b9acSAndroid Build Coastguard Worker
84*1c60b9acSAndroid Build Coastguard WorkerYou can take two approaches depending on what you're doing, either bring in and
85*1c60b9acSAndroid Build Coastguard Workerlater destroy a whole class of plugins at once, and walk them via a linked-list,
86*1c60b9acSAndroid Build Coastguard Workeror bring in and later destroy a single specific plugin from the class by filtering
87*1c60b9acSAndroid Build Coastguard Workeron its specific export name.
88*1c60b9acSAndroid Build Coastguard Worker
89*1c60b9acSAndroid Build Coastguard WorkerSee `include/libwebsockets/lws-protocols-plugins.h` for documentation.
90*1c60b9acSAndroid Build Coastguard Worker
91*1c60b9acSAndroid Build Coastguard Worker```
92*1c60b9acSAndroid Build Coastguard WorkerLWS_VISIBLE LWS_EXTERN int
93*1c60b9acSAndroid Build Coastguard Workerlws_plugins_init(struct lws_plugin **pplugin, const char * const *d,
94*1c60b9acSAndroid Build Coastguard Worker		 const char *_class, const char *filter,
95*1c60b9acSAndroid Build Coastguard Worker		 each_plugin_cb_t each, void *each_user);
96*1c60b9acSAndroid Build Coastguard Worker
97*1c60b9acSAndroid Build Coastguard WorkerLWS_VISIBLE LWS_EXTERN int
98*1c60b9acSAndroid Build Coastguard Workerlws_plugins_destroy(struct lws_plugin **pplugin, each_plugin_cb_t each,
99*1c60b9acSAndroid Build Coastguard Worker		    void *each_user);
100*1c60b9acSAndroid Build Coastguard Worker```
101*1c60b9acSAndroid Build Coastguard Worker
102*1c60b9acSAndroid Build Coastguard Worker`struct lws_plugin` is a public struct that contains the linked-list of loaded
103*1c60b9acSAndroid Build Coastguard Workerplugins and a pointer to its exported header object, so you can walk this
104*1c60b9acSAndroid Build Coastguard Workerafter loading.
105*1c60b9acSAndroid Build Coastguard Worker
106