aboutsummaryrefslogtreecommitdiff
path: root/harness/tools/genbuild.pl
diff options
context:
space:
mode:
Diffstat (limited to 'harness/tools/genbuild.pl')
-rw-r--r--harness/tools/genbuild.pl43
1 files changed, 43 insertions, 0 deletions
diff --git a/harness/tools/genbuild.pl b/harness/tools/genbuild.pl
new file mode 100644
index 0000000..b17ab6a
--- /dev/null
+++ b/harness/tools/genbuild.pl
@@ -0,0 +1,43 @@
+#!/usr/bin/env perl
+
+$comment="";
+
+print "#include <stdio.h>\n";
+print "#include <dlfcn.h>\n";
+print "#include <pthread.h>\n";
+print "#include \"plugin.h\"\n\n";
+
+print "int load_plugin_from_dl(dlhandle_t dl, plugin_t* plug)\n";
+print "{\n";
+print " void* ptr;\n";
+print " int ret = 0;\n";
+print "\n";
+print " const char** name = dlsym(dl, \"plugin_name\");\n";
+print " if (name) {\n";
+print " plug->plugin_name = *name;\n";
+print " } else {\n";
+print " plug->plugin_name = NULL;\n";
+print " }\n";
+print " plug->state = NULL;\n";
+print " plug->library_handle = dl;\n";
+print "\n";
+while (<>) {
+ if (/^\s*EXPORT\(\s*((?:\w|\s*\*\s*)+)\s*\(\*(\w+)\)\s*\((.*)\)\);/) {
+ print "\n";
+ print " ptr = dlsym(dl, \"$2\");\n";
+ print " if (!ptr) {\n";
+ print " fprintf(stderr, \"Plugin missing %s\\n\", \"$2\");\n";
+ print " ret |= 1;\n";
+ print " }\n";
+ print " plug->$2 = ptr;\n";
+ $comment="";
+ }
+}
+print "\n if (!ret) {\n";
+print " if(pthread_mutex_init(&plug->lock, NULL)) {\n";
+print " fprintf(stderr, \"Failed to initalize plugin lock\");\n";
+print " ret |= 1;\n";
+print " }\n";
+print " }\n";
+print "\n return ret;\n";
+print "}\n";