summaryrefslogtreecommitdiff
path: root/glx
diff options
context:
space:
mode:
authorNicolai Hähnle <nicolai.haehnle@amd.com>2018-03-13 17:46:37 -0400
committerAdam Jackson <ajax@redhat.com>2018-03-21 11:14:46 -0400
commit319af6f471912160ab3eb6395ef50f9950063d43 (patch)
tree590765ad998b9774e1603e42905dc00904786e88 /glx
parent75a869a4e7c06072380931b714ac83b1037d3bbe (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.c38
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;
}