[PATCH weston v2 4/7] weston: Allow relative paths for modules

Quentin Glidic sardemff7+wayland at sardemff7.net
Fri Apr 26 06:16:03 PDT 2013


From: Quentin Glidic <sardemff7+git at sardemff7.net>

This is to be used by tests or when developping to load modules directly
from the build tree

Signed-off-by: Quentin Glidic <sardemff7+git at sardemff7.net>
---
 man/weston.man   | 5 +++--
 src/compositor.c | 9 ++++++---
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/man/weston.man b/man/weston.man
index 6175b0e..03307a0 100644
--- a/man/weston.man
+++ b/man/weston.man
@@ -103,7 +103,8 @@ Load
 .I backend.so
 instead of the default backend. The file is searched for in
 .IR "__weston_modules_dir__" ,
-or you can pass an absolute path. The default backend is 
+or you can pass a path (absolute, .-relative or ..-relative). The default 
+backend is
 .I __weston_native_backend__
 unless the environment suggests otherwise, see
 .IR DISPLAY " and " WAYLAND_DISPLAY .
@@ -132,7 +133,7 @@ instead of writing them to stderr.
 Load the modules (the option may be specified multiple times).
 Only used by the test suite. The file is searched for in
 .IR "__weston_modules_dir__" ,
-or you can pass an absolute path.
+or you can pass a path (absolute, .-relative or ..-relative).
 .TP
 \fB\-\^S\fR\fIname\fR, \fB\-\-socket\fR=\fIname\fR
 Weston will listen in the Wayland socket called
diff --git a/src/compositor.c b/src/compositor.c
index 15196a7..d616ca3 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -3349,10 +3349,13 @@ load_module(const char *name, const char *entrypoint)
 	char path[PATH_MAX];
 	void *module, *init;
 
-	if (name[0] != '/')
-		snprintf(path, sizeof path, "%s/%s", MODULEDIR, name);
+	if (name[0] == '/' || /* If the path is absolute or .. */
+	    (name[0] == '.' && /* ... relative to ... */
+	     (name[1] == '/' || /* ... current dir or ... */
+	      (name[1] == '.' && name[2] == '/')))) /* ... parent dir ... */
+		snprintf(path, sizeof path, "%s", name); /* ... load the exact specified module */
 	else
-		snprintf(path, sizeof path, "%s", name);
+		snprintf(path, sizeof path, "%s/%s", MODULEDIR, name);
 
 	module = dlopen(path, RTLD_NOW | RTLD_NOLOAD);
 	if (module) {
-- 
1.8.2.1



More information about the wayland-devel mailing list