compositor: Use weston_load_module

Except the module dir path, they're one and the same. This change
warrants a libweston version bump, if it hasn't been done already.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
This commit is contained in:
Marius Vlad 2022-09-19 14:20:02 +03:00 committed by Pekka Paalanen
parent 21deaee6a9
commit eaf2de3441
8 changed files with 42 additions and 64 deletions

View file

@ -883,53 +883,6 @@ weston_create_listening_socket(struct wl_display *display, const char *socket_na
}
}
WL_EXPORT void *
wet_load_module_entrypoint(const char *name, const char *entrypoint)
{
char path[PATH_MAX];
void *module, *init;
size_t len;
if (name == NULL)
return NULL;
if (name[0] != '/') {
len = weston_module_path_from_env(name, path, sizeof path);
if (len == 0)
len = snprintf(path, sizeof path, "%s/%s", MODULEDIR,
name);
} else {
len = snprintf(path, sizeof path, "%s", name);
}
/* snprintf returns the length of the string it would've written,
* _excluding_ the NUL byte. So even being equal to the size of
* our buffer is an error here. */
if (len >= sizeof path)
return NULL;
module = dlopen(path, RTLD_NOW | RTLD_NOLOAD);
if (module) {
weston_log("Module '%s' already loaded\n", path);
} else {
weston_log("Loading module '%s'\n", path);
module = dlopen(path, RTLD_NOW);
if (!module) {
weston_log("Failed to load module: %s\n", dlerror());
return NULL;
}
}
init = dlsym(module, entrypoint);
if (!init) {
weston_log("Failed to lookup init function: %s\n", dlerror());
dlclose(module);
return NULL;
}
return init;
}
WL_EXPORT int
wet_load_module(struct weston_compositor *compositor,
const char *name, int *argc, char *argv[])
@ -937,7 +890,7 @@ wet_load_module(struct weston_compositor *compositor,
int (*module_init)(struct weston_compositor *ec,
int *argc, char *argv[]);
module_init = wet_load_module_entrypoint(name, "wet_module_init");
module_init = weston_load_module(name, "wet_module_init", MODULEDIR);
if (!module_init)
return -1;
if (module_init(compositor, argc, argv) < 0)
@ -952,7 +905,7 @@ wet_load_shell(struct weston_compositor *compositor,
int (*shell_init)(struct weston_compositor *ec,
int *argc, char *argv[]);
shell_init = wet_load_module_entrypoint(name, "wet_shell_init");
shell_init = weston_load_module(name, "wet_shell_init", MODULEDIR);
if (!shell_init)
return -1;
if (shell_init(compositor, argc, argv) < 0)
@ -2729,7 +2682,8 @@ load_remoting(struct weston_compositor *c, struct weston_config *wc)
&module_name,
"remoting-plugin.so");
module_init = weston_load_module(module_name,
"weston_module_init");
"weston_module_init",
LIBWESTON_MODULEDIR);
free(module_name);
if (!module_init) {
weston_log("Can't load remoting-plugin\n");
@ -2859,7 +2813,8 @@ load_pipewire(struct weston_compositor *c, struct weston_config *wc)
&module_name,
"pipewire-plugin.so");
module_init = weston_load_module(module_name,
"weston_module_init");
"weston_module_init",
LIBWESTON_MODULEDIR);
free(module_name);
if (!module_init) {
weston_log("Can't load pipewire-plugin\n");

View file

@ -62,9 +62,6 @@ wet_watch_process(struct weston_compositor *compositor,
struct weston_config *
wet_get_config(struct weston_compositor *compositor);
void *
wet_load_module_entrypoint(const char *name, const char *entrypoint);
int
wet_shell_init(struct weston_compositor *ec,
int *argc, char *argv[]);

View file

@ -2156,7 +2156,7 @@ int
weston_module_init(struct weston_compositor *compositor);
void *
weston_load_module(const char *name, const char *entrypoint);
weston_load_module(const char *name, const char *entrypoint, const char *module_dir);
size_t
weston_module_path_from_env(const char *name, char *path, size_t path_len);

View file

@ -52,7 +52,8 @@ create_gbm_device(int fd)
struct gbm_device *gbm;
gl_renderer = weston_load_module("gl-renderer.so",
"gl_renderer_interface");
"gl_renderer_interface",
LIBWESTON_MODULEDIR);
if (!gl_renderer)
return NULL;

View file

@ -440,7 +440,9 @@ headless_gl_renderer_init(struct headless_backend *b)
.drm_formats_count = ARRAY_LENGTH(headless_formats),
};
b->glri = weston_load_module("gl-renderer.so", "gl_renderer_interface");
b->glri = weston_load_module("gl-renderer.so",
"gl_renderer_interface",
LIBWESTON_MODULEDIR);
if (!b->glri)
return -1;

View file

@ -2857,7 +2857,8 @@ wayland_backend_create(struct weston_compositor *compositor,
if (!b->use_pixman) {
gl_renderer = weston_load_module("gl-renderer.so",
"gl_renderer_interface");
"gl_renderer_interface",
LIBWESTON_MODULEDIR);
if (!gl_renderer)
b->use_pixman = true;
}

View file

@ -1853,7 +1853,8 @@ init_gl_renderer(struct x11_backend *b)
};
gl_renderer = weston_load_module("gl-renderer.so",
"gl_renderer_interface");
"gl_renderer_interface",
LIBWESTON_MODULEDIR);
if (!gl_renderer)
return -1;

View file

@ -8512,8 +8512,23 @@ weston_module_path_from_env(const char *name, char *path, size_t path_len)
return 0;
}
/** A wrapper function to open and return the entry point of a shared library
* module
*
* This function loads the module and provides the caller with the entry point
* address which can be later used to execute shared library code. It can be
* used to load-up libweston modules but also other modules, specific to the
* compositor (i.e., weston).
*
* \param name the name of the shared library
* \param entrypoint the entry point of the shared library
* \param module_dir the path where to look for the shared library module
* \return the address of the module specified the entry point, or NULL otherwise
*
*/
WL_EXPORT void *
weston_load_module(const char *name, const char *entrypoint)
weston_load_module(const char *name, const char *entrypoint,
const char *module_dir)
{
char path[PATH_MAX];
void *module, *init;
@ -8526,7 +8541,7 @@ weston_load_module(const char *name, const char *entrypoint)
len = weston_module_path_from_env(name, path, sizeof path);
if (len == 0)
len = snprintf(path, sizeof path, "%s/%s",
LIBWESTON_MODULEDIR, name);
module_dir, name);
} else {
len = snprintf(path, sizeof path, "%s", name);
}
@ -8708,7 +8723,9 @@ weston_compositor_load_backend(struct weston_compositor *compositor,
if (backend >= ARRAY_LENGTH(backend_map))
return -1;
backend_init = weston_load_module(backend_map[backend], "weston_backend_init");
backend_init = weston_load_module(backend_map[backend],
"weston_backend_init",
LIBWESTON_MODULEDIR);
if (!backend_init)
return -1;
@ -8741,7 +8758,9 @@ weston_compositor_load_xwayland(struct weston_compositor *compositor)
{
int (*module_init)(struct weston_compositor *ec);
module_init = weston_load_module("xwayland.so", "weston_module_init");
module_init = weston_load_module("xwayland.so",
"weston_module_init",
LIBWESTON_MODULEDIR);
if (!module_init)
return -1;
if (module_init(compositor) < 0)
@ -8769,7 +8788,9 @@ weston_compositor_load_color_manager(struct weston_compositor *compositor)
return -1;
}
cm_create = weston_load_module("color-lcms.so", "weston_color_manager_create");
cm_create = weston_load_module("color-lcms.so",
"weston_color_manager_create",
LIBWESTON_MODULEDIR);
if (!cm_create) {
weston_log("Error: Could not load color-lcms.so.\n");
return -1;