summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/glx/x11/dri_glx.c77
1 files changed, 46 insertions, 31 deletions
diff --git a/src/glx/x11/dri_glx.c b/src/glx/x11/dri_glx.c
index f0b5f19eedd..b703c4fa9eb 100644
--- a/src/glx/x11/dri_glx.c
+++ b/src/glx/x11/dri_glx.c
@@ -119,18 +119,26 @@ static void *DummyCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
-/*
- * Extract the ith directory path out of a colon-separated list of
- * paths.
- * Input:
- * index - index of path to extract (starting at zero)
- * paths - the colon-separated list of paths
- * dirLen - max length of result to store in <dir>
- * Output:
- * dir - the extracted directory path, dir[0] will be zero when
- * extraction fails.
+/**
+ * Extract the ith directory path out of a colon-separated list of paths. No
+ * more than \c dirLen characters, including the terminating \c NUL, will be
+ * written to \c dir.
+ *
+ * \param index Index of path to extract (starting at zero)
+ * \param paths The colon-separated list of paths
+ * \param dirLen Maximum length of result to store in \c dir
+ * \param dir Buffer to hold the extracted directory path
+ *
+ * \returns
+ * The number of characters that would have been written to \c dir had there
+ * been enough room. This does not include the terminating \c NUL. When
+ * extraction fails, zero will be returned.
+ *
+ * \todo
+ * It seems like this function could be rewritten to use \c strchr.
*/
-static void ExtractDir(int index, const char *paths, int dirLen, char *dir)
+static size_t
+ExtractDir(int index, const char *paths, int dirLen, char *dir)
{
int i, len;
const char *start, *end;
@@ -146,7 +154,7 @@ static void ExtractDir(int index, const char *paths, int dirLen, char *dir)
else if (*start == 0) {
/* end of string and couldn't find ith colon */
dir[0] = 0;
- return;
+ return 0;
}
else {
start++;
@@ -168,22 +176,27 @@ static void ExtractDir(int index, const char *paths, int dirLen, char *dir)
len = dirLen - 1;
strncpy(dir, start, len);
dir[len] = 0;
+
+ return( end - start );
}
-/*
- * Try to dlopen() the named driver. This function adds the
- * "_dri.so" suffix to the driver name and searches the
- * directories specified by the LIBGL_DRIVERS_PATH env var
- * in order to find the driver.
- * Input:
- * driverName - a name like "tdfx", "i810", "mga", etc.
- * Return:
- * handle from dlopen, or NULL if driver file not found.
+/**
+ * Try to \c dlopen the named driver.
+ *
+ * This function adds the "_dri.so" suffix to the driver name and searches the
+ * directories specified by the \c LIBGL_DRIVERS_PATH environment variable in
+ * order to find the driver.
+ *
+ * \param driverName - a name like "tdfx", "i810", "mga", etc.
+ *
+ * \returns
+ * A handle from \c dlopen, or \c NULL if driver file not found.
*/
static __DRIdriver *OpenDriver(const char *driverName)
{
char *libPaths = NULL;
+ char libDir[1000];
int i;
__DRIdriver *driver;
@@ -204,16 +217,18 @@ static __DRIdriver *OpenDriver(const char *driverName)
if (!libPaths)
libPaths = DEFAULT_DRIVER_DIR;
- for (i = 0; ; i++) {
- char libDir[1000], realDriverName[200];
- void *handle;
- ExtractDir(i, libPaths, 1000, libDir);
- if (!libDir[0])
- break; /* ran out of paths to search */
- snprintf(realDriverName, 200, "%s/%s_dri.so", libDir, driverName);
- InfoMessageF("OpenDriver: trying %s\n", realDriverName);
- handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL);
- if (handle) {
+ for ( i = 0 ; ExtractDir(i, libPaths, 1000, libDir) != 0 ; i++ ) {
+ char realDriverName[200];
+ void *handle = NULL;
+
+
+ if ( handle == NULL ) {
+ snprintf(realDriverName, 200, "%s/%s_dri.so", libDir, driverName);
+ InfoMessageF("OpenDriver: trying %s\n", realDriverName);
+ handle = dlopen(realDriverName, RTLD_NOW | RTLD_GLOBAL);
+ }
+
+ if ( handle != NULL ) {
/* allocate __DRIdriver struct */
driver = (__DRIdriver *) Xmalloc(sizeof(__DRIdriver));
if (!driver)