diff options
author | Nicolai Hähnle <nicolai.haehnle@amd.com> | 2018-03-13 17:46:37 -0400 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2018-03-21 11:14:46 -0400 |
commit | 319af6f471912160ab3eb6395ef50f9950063d43 (patch) | |
tree | 590765ad998b9774e1603e42905dc00904786e88 /glx | |
parent | 75a869a4e7c06072380931b714ac83b1037d3bbe (diff) |
glx: honor LIBGL_DRIVERS_PATH when loading DRI drivers
Allow switching to another driver build without a full installation.
Glamor already takes LIBGL_DRIVERS_PATH into account, so this change
makes sure that the same driver is used in both parts of the server.
Signed-off-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Reviewed-by: Ben Crocker <bcrocker@redhat.com>
Reviewed-by: Antoine Martin <antoine@nagafix.co.uk>
Tested-by: Ben Crocker <bcrocker@redhat.com>
Diffstat (limited to 'glx')
-rw-r--r-- | glx/glxdricommon.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/glx/glxdricommon.c b/glx/glxdricommon.c index a16e72849..a6602f930 100644 --- a/glx/glxdricommon.c +++ b/glx/glxdricommon.c @@ -272,14 +272,44 @@ glxProbeDriver(const char *driverName, char filename[PATH_MAX]; char *get_extensions_name; const __DRIextension **extensions = NULL; + const char *path = NULL; + + /* Search in LIBGL_DRIVERS_PATH if we're not setuid. */ + if (!PrivsElevated()) + path = getenv("LIBGL_DRIVERS_PATH"); + + if (!path) + path = dri_driver_path; + + do { + const char *next; + int path_len; + + next = strchr(path, ':'); + if (next) { + path_len = next - path; + next++; + } else { + path_len = strlen(path); + next = NULL; + } - snprintf(filename, sizeof filename, "%s/%s_dri.so", - dri_driver_path, driverName); + snprintf(filename, sizeof filename, "%.*s/%s_dri.so", path_len, path, + driverName); + + driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL); + if (driver != NULL) + break; - driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL); - if (driver == NULL) { LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n", filename, dlerror()); + + path = next; + } while (path); + + if (driver == NULL) { + LogMessage(X_ERROR, "AIGLX error: unable to load driver %s\n", + driverName); goto cleanup_failure; } |