Home | History | Annotate | Line # | Download | only in libphobos.shared
      1      1.1  mrg #include <stdlib.h>
      2      1.1  mrg #include <string.h>
      3      1.1  mrg #include <dlfcn.h>
      4      1.1  mrg #include <assert.h>
      5      1.1  mrg 
      6      1.1  mrg int main(int argc, char* argv[])
      7      1.1  mrg {
      8      1.1  mrg #if defined(__FreeBSD__)
      9      1.1  mrg     // workaround for Bugzilla 14824
     10      1.1  mrg     void *druntime = dlopen(argv[1], RTLD_LAZY); // load druntime
     11      1.1  mrg     assert(druntime);
     12      1.1  mrg #endif
     13  1.1.1.2  mrg #if defined(__DragonFly__)
     14  1.1.1.2  mrg     // workaround for Bugzilla 14824
     15  1.1.1.2  mrg     void *druntime = dlopen(argv[1], RTLD_LAZY); // load druntime
     16  1.1.1.2  mrg     assert(druntime);
     17  1.1.1.2  mrg #endif
     18      1.1  mrg 
     19      1.1  mrg     const size_t pathlen = strrchr(argv[0], '/') - argv[0] + 1;
     20      1.1  mrg     char *name = malloc(pathlen + sizeof("plugin1.so"));
     21      1.1  mrg     memcpy(name, argv[0], pathlen);
     22      1.1  mrg     memcpy(name+pathlen, "plugin1.so", sizeof("plugin1.so"));
     23      1.1  mrg 
     24      1.1  mrg     void* plugin1 = dlopen(name, RTLD_LAZY);
     25      1.1  mrg     name[pathlen + sizeof("plugin1.so") - 5] = '2';
     26      1.1  mrg     void* plugin2 = dlopen(name, RTLD_LAZY);
     27      1.1  mrg 
     28      1.1  mrg     int (*plugin1_init)() = dlsym(plugin1, "plugin_init");
     29      1.1  mrg     int (*plugin1_term)() = dlsym(plugin1, "plugin_term");
     30      1.1  mrg     int (*runTests1)() = dlsym(plugin1, "runTests");
     31      1.1  mrg     int (*plugin2_init)() = dlsym(plugin2, "plugin_init");
     32      1.1  mrg     int (*plugin2_term)() = dlsym(plugin2, "plugin_term");
     33      1.1  mrg     int (*runTests2)() = dlsym(plugin2, "runTests");
     34      1.1  mrg     assert(plugin1_init());
     35      1.1  mrg     assert(runTests1());
     36      1.1  mrg     assert(plugin2_init());
     37      1.1  mrg     assert(runTests2());
     38      1.1  mrg 
     39      1.1  mrg     assert(plugin1_term());
     40      1.1  mrg     assert(dlclose(plugin1) == 0);
     41      1.1  mrg     assert(runTests2());
     42      1.1  mrg 
     43      1.1  mrg     name[pathlen + sizeof("plugin1.so") - 5] = '1';
     44      1.1  mrg     plugin1 = dlopen(name, RTLD_LAZY);
     45      1.1  mrg     plugin1_init = dlsym(plugin1, "plugin_init");
     46      1.1  mrg     plugin1_term = dlsym(plugin1, "plugin_term");
     47      1.1  mrg     runTests1 = dlsym(plugin1, "runTests");
     48      1.1  mrg     assert(plugin1_init());
     49      1.1  mrg     assert(runTests1());
     50      1.1  mrg     assert(runTests2());
     51      1.1  mrg 
     52      1.1  mrg     assert(plugin2_term());
     53      1.1  mrg     assert(dlclose(plugin2) == 0);
     54      1.1  mrg     assert(runTests1());
     55      1.1  mrg 
     56      1.1  mrg     assert(plugin1_term());
     57      1.1  mrg     assert(dlclose(plugin1) == 0);
     58      1.1  mrg 
     59      1.1  mrg     free(name);
     60      1.1  mrg 
     61      1.1  mrg #if defined(__FreeBSD__)
     62      1.1  mrg     dlclose(druntime);
     63      1.1  mrg #endif
     64  1.1.1.2  mrg #if defined(__DragonFly__)
     65  1.1.1.2  mrg     dlclose(druntime);
     66  1.1.1.2  mrg #endif
     67      1.1  mrg     return EXIT_SUCCESS;
     68      1.1  mrg }
     69