X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glaze.c;h=0c2eada8d458ea1ca672a1e9a90df365032909ce;hb=adf4faac47e4136b879913b6ae9e2018de64af93;hp=af2aade6cbe0f2312cfb00368b3ab240b826f9e1;hpb=5341dd2062919031591f197abab8d2e44fa5d191;p=glaze diff --git a/glaze.c b/glaze.c index af2aade..0c2eada 100644 --- a/glaze.c +++ b/glaze.c @@ -26,6 +26,7 @@ #include void *libgl_handle; +void *wrapper_handle; static void open_libgl_handle (void) @@ -48,6 +49,27 @@ open_libgl_handle (void) } } +static void +open_wrapper_handle (void) +{ + const char *path; + + if (wrapper_handle) + return; + + path = getenv ("GLAZE_WRAPPER"); + if (path == NULL) { + fprintf (stderr, "GLAZE_WRAPPER unset. Please set to path of real libGL.so under glaze.\n"); + exit (1); + } + + wrapper_handle = dlopen (path, RTLD_LAZY); + if (wrapper_handle == NULL) { + fprintf (stderr, "Error: Failed to dlopen %s\n", path); + exit (1); + } +} + static void glaze_init (void) __attribute__((constructor)); @@ -55,11 +77,19 @@ static void glaze_init (void) { open_libgl_handle (); + open_wrapper_handle (); } static void * resolve (const char *name) { + void *symbol; + + /* The wrapper gets first choice on all symbols. */ + symbol = dlsym (wrapper_handle, name); + if (symbol) + return symbol; + return dlsym (libgl_handle, name); }