#include <stdio.h> // fprintf(), NULL
#include <stdlib.h> // exit(), EXIT_SUCCESS
#include <string.h>
#include <dlfcn.h>
#include <pthread.h>
#include "test.h" // PASS(), FAIL(), XPASS(), XFAIL()
static void* work(void* arg)
{
const char* str = (char*)arg;
for(int i=0; i < 1000; ++i) {
void* handle = dlopen(str, RTLD_LAZY);
if ( handle != NULL ) {
FAIL("dlopen(%s) unexpectedly succeeded", str);
exit(0);
}
char* msg = dlerror();
if ( (msg == NULL) || (strstr(msg, str) == NULL) ) {
FAIL("dlerror() did not contain library name that could not be loaded", str);
exit(0);
}
}
return 0;
}
int main()
{
dlsym(RTLD_DEFAULT, "foobar");
fprintf(stderr, "%s\n", dlerror());
pthread_t worker1;
if ( pthread_create(&worker1, NULL, work, "/frazzle/bar") != 0 ) {
FAIL("pthread_create failed");
exit(0);
}
pthread_t worker2;
if ( pthread_create(&worker2, NULL, work, "/frazzle/foo") != 0 ) {
FAIL("pthread_create failed");
exit(0);
}
pthread_t worker3;
if ( pthread_create(&worker3, NULL, work, "/frazzle/dazzle") != 0 ) {
FAIL("pthread_create failed");
exit(0);
}
void* result;
fprintf(stderr, "waiting for worker 1\n");
pthread_join(worker1, &result);
fprintf(stderr, "waiting for worker 2\n");
pthread_join(worker2, &result);
fprintf(stderr, "waiting for worker 3\n");
pthread_join(worker3, &result);
PASS("dlerror-thread-test");
return 0;
}