X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glaze.c;h=9a3e0553474783e2f95b63dded7ff3d4726354a6;hb=85faa290c2777d8e89af05648c229b0da395d4f7;hp=0c2eada8d458ea1ca672a1e9a90df365032909ce;hpb=adf4faac47e4136b879913b6ae9e2018de64af93;p=glaze diff --git a/glaze.c b/glaze.c index 0c2eada..9a3e055 100644 --- a/glaze.c +++ b/glaze.c @@ -19,84 +19,66 @@ * THE SOFTWARE. */ -#define _GNU_SOURCE -#include - #include #include +#include +#include -void *libgl_handle; -void *wrapper_handle; +#include static void -open_libgl_handle (void) +usage (void) { - const char *path; - - if (libgl_handle) - return; - - path = getenv ("GLAZE_LIBGL"); - if (path == NULL) { - fprintf (stderr, "GLAZE_LIBGL unset. Please set to path of real libGL.so under glaze.\n"); - exit (1); - } - - libgl_handle = dlopen (path, RTLD_LAZY | RTLD_GLOBAL); - if (libgl_handle == NULL) { - fprintf (stderr, "Error: Failed to dlopen %s\n", path); - exit (1); - } + printf ("Usage: glaze --wrapper= [program args...]\n" + "\n" + "Execute with providing alternate OpenGL functions.\n"); } -static void -open_wrapper_handle (void) -{ - const char *path; - - if (wrapper_handle) - return; +enum { + WRAPPER_OPT = CHAR_MAX + 1 +}; - 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); +int +main (int argc, char *argv[]) +{ + const char *wrapper = NULL; + int opt; + + const char *short_options="h"; + const struct option long_options[] = { + {"help", no_argument, 0, 'h'}, + {"wrapper", required_argument, 0, WRAPPER_OPT}, + {0, 0, 0, 0} + }; + + while (1) + { + opt = getopt_long (argc, argv, short_options, long_options, NULL); + if (opt == -1) + break; + + switch (opt) { + case 'h': + usage (); + return 0; + case WRAPPER_OPT: + wrapper = optarg; + break; + default: + fprintf (stderr, "Internal error: " + "unexpected getopt value: %d\n", opt); + exit (1); + } } - wrapper_handle = dlopen (path, RTLD_LAZY); - if (wrapper_handle == NULL) { - fprintf (stderr, "Error: Failed to dlopen %s\n", path); + if (optind >= argc) { + fprintf (stderr, "Error: No program name provided, " + "see (glaze --help)\n"); exit (1); } -} - -static void -glaze_init (void) __attribute__((constructor)); - -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; + glaze_execute (argc - optind, &argv[optind], wrapper); - return dlsym (libgl_handle, name); + /* If glaze_execute returns then something went wrong. */ + return 1; } - -#define GLAZE_API(name) \ -void * name() __attribute__((ifunc(#name "_resolver"))); \ -static void * \ -name ## _resolver (void) { return resolve (#name); } - -#include "specs/gl.def" -#include "specs/glx.def"