]> git.cworth.org Git - fips/blobdiff - glxwrap.c
Add wrappers for dlopen, dlsym, and glXGetProcAddressARB
[fips] / glxwrap.c
index 51b5faf58f83f8017c822d7d287f7eb72dbb12d0..9ebe799c70aea1f5678d0c3283ecd4162aa67d98 100644 (file)
--- a/glxwrap.c
+++ b/glxwrap.c
@@ -22,6 +22,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include <string.h>
+
 #include <dlfcn.h>
 
 #include <X11/Xlib.h>
@@ -31,6 +33,8 @@
 
 #include <sys/time.h>
 
+#include "dlwrap.h"
+
 typedef void (* fips_glXSwapBuffers_t)(Display *dpy, GLXDrawable drawable);
 
 static void *
@@ -40,7 +44,7 @@ lookup (const char *name)
        static void *libgl_handle = NULL;
 
        if (! libgl_handle) {
-               libgl_handle = dlopen (libgl_filename, RTLD_NOW);
+               libgl_handle = dlwrap_real_dlopen (libgl_filename, RTLD_NOW | RTLD_DEEPBIND);
                if (! libgl_handle) {
                        fprintf (stderr, "Error: Failed to dlopen %s\n",
                                 libgl_filename);
@@ -48,7 +52,7 @@ lookup (const char *name)
                }
        }
 
-       return dlsym (libgl_handle, name);
+       return dlwrap_real_dlsym (libgl_handle, name);
 }
 
 static void
@@ -94,3 +98,26 @@ glXSwapBuffers (Display *dpy, GLXDrawable drawable)
                printf("FPS: %.3f\n", fps);
        }
 }
+
+
+typedef __GLXextFuncPtr (* fips_glXGetProcAddressARB_t)(const GLubyte *func);
+__GLXextFuncPtr
+glXGetProcAddressARB (const GLubyte *func)
+{
+       static fips_glXGetProcAddressARB_t real_glXGetProcAddressARB = NULL;
+       const char *name = "glXGetProcAddressARB";
+
+       if (! real_glXGetProcAddressARB) {
+               real_glXGetProcAddressARB = (fips_glXGetProcAddressARB_t) lookup (name);
+               if (! real_glXGetProcAddressARB) {
+                       fprintf (stderr, "Error: Failed to find function %s.\n",
+                                name);
+                       return NULL;
+               }
+       }
+
+       if (strcmp ((const char *)func, "glXSwapBuffers") == 0)
+               return (__GLXextFuncPtr) glXSwapBuffers;
+       else
+               return real_glXGetProcAddressARB (func);
+}