aboutsummaryrefslogtreecommitdiff
path: root/harness/src
diff options
context:
space:
mode:
authorJosh Rahm <rahm@google.com>2024-02-09 13:17:43 -0700
committerJosh Rahm <rahm@google.com>2024-02-09 13:17:43 -0700
commit50d91022f328c6f3dd7d166967732dec9734887c (patch)
treea88b5ae0485db6caf811b569162773ffa15ebc4d /harness/src
parentebde8665851ca21ff00685eeaf5057ccec6eb05d (diff)
downloadmontis-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.c69
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;
+}