mirror of
https://github.com/autc04/Retro68.git
synced 2025-02-27 05:30:18 +00:00
61 lines
1.7 KiB
C
61 lines
1.7 KiB
C
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <dlfcn.h>
|
|
#include <assert.h>
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
#if defined(__FreeBSD__)
|
|
// workaround for Bugzilla 14824
|
|
void *druntime = dlopen(argv[1], RTLD_LAZY); // load druntime
|
|
assert(druntime);
|
|
#endif
|
|
|
|
const size_t pathlen = strrchr(argv[0], '/') - argv[0] + 1;
|
|
char *name = malloc(pathlen + sizeof("plugin1.so"));
|
|
memcpy(name, argv[0], pathlen);
|
|
memcpy(name+pathlen, "plugin1.so", sizeof("plugin1.so"));
|
|
|
|
void* plugin1 = dlopen(name, RTLD_LAZY);
|
|
name[pathlen + sizeof("plugin1.so") - 5] = '2';
|
|
void* plugin2 = dlopen(name, RTLD_LAZY);
|
|
|
|
int (*plugin1_init)() = dlsym(plugin1, "plugin_init");
|
|
int (*plugin1_term)() = dlsym(plugin1, "plugin_term");
|
|
int (*runTests1)() = dlsym(plugin1, "runTests");
|
|
int (*plugin2_init)() = dlsym(plugin2, "plugin_init");
|
|
int (*plugin2_term)() = dlsym(plugin2, "plugin_term");
|
|
int (*runTests2)() = dlsym(plugin2, "runTests");
|
|
assert(plugin1_init());
|
|
assert(runTests1());
|
|
assert(plugin2_init());
|
|
assert(runTests2());
|
|
|
|
assert(plugin1_term());
|
|
assert(dlclose(plugin1) == 0);
|
|
assert(runTests2());
|
|
|
|
name[pathlen + sizeof("plugin1.so") - 5] = '1';
|
|
plugin1 = dlopen(name, RTLD_LAZY);
|
|
plugin1_init = dlsym(plugin1, "plugin_init");
|
|
plugin1_term = dlsym(plugin1, "plugin_term");
|
|
runTests1 = dlsym(plugin1, "runTests");
|
|
assert(plugin1_init());
|
|
assert(runTests1());
|
|
assert(runTests2());
|
|
|
|
assert(plugin2_term());
|
|
assert(dlclose(plugin2) == 0);
|
|
assert(runTests1());
|
|
|
|
assert(plugin1_term());
|
|
assert(dlclose(plugin1) == 0);
|
|
|
|
free(name);
|
|
|
|
#if defined(__FreeBSD__)
|
|
dlclose(druntime);
|
|
#endif
|
|
return EXIT_SUCCESS;
|
|
}
|