diff options
| author | Josh Rahm <rahm@google.com> | 2024-02-09 13:17:43 -0700 |
|---|---|---|
| committer | Josh Rahm <rahm@google.com> | 2024-02-09 13:17:43 -0700 |
| commit | 50d91022f328c6f3dd7d166967732dec9734887c (patch) | |
| tree | a88b5ae0485db6caf811b569162773ffa15ebc4d /harness/src | |
| parent | ebde8665851ca21ff00685eeaf5057ccec6eb05d (diff) | |
| download | montis-50d91022f328c6f3dd7d166967732dec9734887c.tar.gz montis-50d91022f328c6f3dd7d166967732dec9734887c.tar.bz2 montis-50d91022f328c6f3dd7d166967732dec9734887c.zip | |
Move the harness to its own CMake project.
Diffstat (limited to 'harness/src')
| -rw-r--r-- | harness/src/main.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/harness/src/main.c b/harness/src/main.c new file mode 100644 index 0000000..1580bd6 --- /dev/null +++ b/harness/src/main.c @@ -0,0 +1,69 @@ +#include <stdio.h> + +#include <dlfcn.h> + +typedef void* dllib_t; + +typedef void* opqst_t; + +dllib_t open_library(const char* library, int* err) +{ + dllib_t lib = dlopen(library, RTLD_LAZY); + + if (!lib) { + fprintf(stderr, "Error opening shared library: %s\n", dlerror()); + *err = 1; + } + *err = 0; + return lib; +} + +void* getsym(dllib_t handle, char* sym, int* err) +{ + void* ret = dlsym(handle, sym); + if (!ret) { + fprintf(stderr, "Unable to read symbol '%s'\n", sym); + *err |= 1; + return NULL; + } + return ret; +} + +void use_library(int argc, char** argv, dllib_t lib, int* err) +{ + *err = 0; + + opqst_t (*init)(int* argc, char*** argv) = getsym(lib, "plugin_init", err); + void (*teardown)() = getsym(lib, "plugin_teardown", err); + opqst_t (*sym)(opqst_t) = getsym(lib, "handle_thing", err); + + if (*err) { + fprintf(stderr, "Unable to find symbol call_in.\n"); + return; + } + + opqst_t st = init(&argc, &argv); + for (int i = 0; i < 100000; ++ i) { + st = sym(st); + printf("stable_ptr: %p\n", st); + } + teardown(); +} + +int main(int argc, char** argv) +{ + if (!argv[0] && !argv[1]) { + fprintf(stderr, "Missing argument.\n"); + return 1; + } + + int err = 0; + dllib_t lib = open_library(argv[1], &err); + + if (err) { + return err; + } + + use_library(argc, argv, lib, &err); + return 0; +} |