From: Nicolai Hähnle <[email protected]> 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 <[email protected]> --- glx/glxdricommon.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/glx/glxdricommon.c b/glx/glxdricommon.c index f6c6fcd..a370845 100644 --- a/glx/glxdricommon.c +++ b/glx/glxdricommon.c @@ -241,28 +241,58 @@ static const char dri_driver_path[] = DRI_DRIVER_PATH; void * glxProbeDriver(const char *driverName, void **coreExt, const char *coreName, int coreVersion, void **renderExt, const char *renderName, int renderVersion) { int i; void *driver; 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; } if (asprintf(&get_extensions_name, "%s_%s", __DRI_DRIVER_GET_EXTENSIONS, driverName) != -1) { const __DRIextension **(*get_extensions)(void); get_extensions = dlsym(driver, get_extensions_name); if (get_extensions) extensions = get_extensions(); -- 2.7.4 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel
