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