egl: Rework _eglGetSearchPath.
authorChia-I Wu <olv@lunarg.com>
Mon, 1 Nov 2010 17:23:13 +0000 (01:23 +0800)
committerChia-I Wu <olv@lunarg.com>
Mon, 1 Nov 2010 17:37:16 +0000 (01:37 +0800)
So that the directory part of EGL_DRIVER, if exists, is prepended to the
search path.  This commit also adds a sanity check to _eglLog.

docs/egl.html
src/egl/main/egldriver.c
src/egl/main/egllog.c

index cc6462d97870aee1e6f7893d51cca18995157c41..c86e543859267ca0687ab528d321415f2195076f 100644 (file)
@@ -136,11 +136,6 @@ binaries.</p>
 specified EGL driver to be loaded.  It comes in handy when one wants to test a
 specific driver.  This variable is ignored for setuid/setgid binaries.</p>
 
-<p><code>egl_gallium</code> dynamically loads hardware drivers and client API
-modules found in <code>EGL_DRIVERS_PATH</code>.  Thus, specifying this variable
-alone is not sufficient for <code>egl_gallium</code> for an uninstalled
-build.</p>
-
 </li>
 
 <li><code>EGL_PLATFORM</code>
index 2359253ff137a0350fead125cba3a76370fa25af..ff0011c4b15f3e0913e19a59b5061183daa5085c 100644 (file)
@@ -395,35 +395,62 @@ _eglPreloadForEach(const char *search_path,
 static const char *
 _eglGetSearchPath(void)
 {
-   static const char *search_path;
+   static char search_path[1024];
 
 #if defined(_EGL_OS_UNIX) || defined(_EGL_OS_WINDOWS)
-   if (!search_path) {
-      static char buffer[1024];
-      const char *p;
+   if (search_path[0] == '\0') {
+      char *buf = search_path;
+      size_t len = sizeof(search_path);
+      EGLBoolean use_env;
+      char dir_sep;
       int ret;
 
-      p = getenv("EGL_DRIVERS_PATH");
 #if defined(_EGL_OS_UNIX)
-      if (p && (geteuid() != getuid() || getegid() != getgid())) {
+      use_env = (geteuid() == getuid() && getegid() == getgid());
+      dir_sep = '/';
+#else
+      use_env = EGL_TRUE;
+      dir_sep = '\\';
+#endif
+
+      if (use_env) {
+         char *p;
+
+         /* extract the dirname from EGL_DRIVER */
+         p = getenv("EGL_DRIVER");
+         if (p && strchr(p, dir_sep)) {
+            ret = _eglsnprintf(buf, len, "%s", p);
+            if (ret > 0 && ret < len) {
+               p = strrchr(buf, dir_sep);
+               *p++ = ':';
+
+               len -= p - buf;
+               buf = p;
+            }
+         }
+
+         /* append EGL_DRIVERS_PATH */
+         p = getenv("EGL_DRIVERS_PATH");
+         if (p) {
+            ret = _eglsnprintf(buf, len, "%s:", p);
+            if (ret > 0 && ret < len) {
+               buf += ret;
+               len -= ret;
+            }
+         }
+      }
+      else {
          _eglLog(_EGL_DEBUG,
                "ignore EGL_DRIVERS_PATH for setuid/setgid binaries");
-         p = NULL;
       }
-#endif /* _EGL_OS_UNIX */
 
-      if (p) {
-         ret = _eglsnprintf(buffer, sizeof(buffer),
-               "%s:%s", p, _EGL_DRIVER_SEARCH_DIR);
-         if (ret > 0 && ret < sizeof(buffer))
-            search_path = buffer;
-      }
+      ret = _eglsnprintf(buf, len, "%s", _EGL_DRIVER_SEARCH_DIR);
+      if (ret < 0 || ret >= len)
+         search_path[0] = '\0';
+
+      _eglLog(_EGL_DEBUG, "EGL search path is %s", search_path);
    }
-   if (!search_path)
-      search_path = _EGL_DRIVER_SEARCH_DIR;
-#else
-   search_path = "";
-#endif
+#endif /* defined(_EGL_OS_UNIX) || defined(_EGL_OS_WINDOWS) */
 
    return search_path;
 }
index 8f3bae2243d9e512a591bf3c836163137def0d5f..12c55f901a576cc0706f797df68fc8dfa8d03e93 100644 (file)
@@ -151,6 +151,7 @@ _eglLog(EGLint level, const char *fmtStr, ...)
 {
    va_list args;
    char msg[MAXSTRING];
+   int ret;
 
    /* one-time initialization; a little race here is fine */
    if (!logging.initialized)
@@ -162,7 +163,9 @@ _eglLog(EGLint level, const char *fmtStr, ...)
 
    if (logging.logger) {
       va_start(args, fmtStr);
-      vsnprintf(msg, MAXSTRING, fmtStr, args);
+      ret = vsnprintf(msg, MAXSTRING, fmtStr, args);
+      if (ret < 0 || ret >= MAXSTRING)
+         strcpy(msg, "<message truncated>");
       va_end(args);
 
       logging.logger(level, msg);