#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
int main(int argc, const char* argv[])
{
const char* env = getenv("DYLD_LIBRARY_PATH");
if ( env == NULL ) {
printf("[BEGIN] dlopen-DYLD_LIBRARY_PATH\n");
printf("[FAIL] dlopen-DYLD_LIBRARY_PATH, env not set\n");
return 0;
}
const char* valueStr = argv[1];
if ( valueStr == NULL ) {
printf("[BEGIN] dlopen-DYLD_LIBRARY_PATH\n");
printf("[FAIL] dlopen-DYLD_LIBRARY_PATH, arg1 value not set\n");
return 0;
}
char* end;
long value = strtol(valueStr, &end, 0);
printf("[BEGIN] dlopen-DYLD_LIBRARY_PATH %s\n", env);
void* handle = dlopen("/bogus/libfoo.dylib", RTLD_LAZY);
if ( handle == NULL ) {
printf("dlerror(): %s\n", dlerror());
printf("[FAIL] dlopen-DYLD_LIBRARY_PATH %s\n", env);
return 0;
}
typedef int (*FooProc)();
FooProc sym = (FooProc)dlsym(handle, "foo");
if ( sym == NULL ) {
printf("dlerror(): %s\n", dlerror());
printf("[FAIL] dlopen-DYLD_LIBRARY_PATH %s\n", env);
return 0;
}
int result = (*sym)();
if ( result != value ) {
printf("result=%d, expected %ld (str=%s)\n", result, value, valueStr);
printf("[FAIL] dlopen-DYLD_LIBRARY_PATH %s\n", env);
return 0;
}
int r = dlclose(handle);
if ( r != 0 ) {
printf("dlclose() returned %d\n", r);
printf("[FAIL] dlopen-DYLD_LIBRARY_PATH %s\n", env);
return 0;
}
void* handle2 = dlopen("/junk/libfoo.dylib", RTLD_LAZY);
if ( handle2 == NULL ) {
printf("dlerror(): %s\n", dlerror());
printf("[FAIL] dlopen-DYLD_LIBRARY_PATH %s\n", env);
return 0;
}
printf("[PASS] dlopen-DYLD_LIBRARY_PATH %s\n", env);
return 0;
}