ldpreload.h: Split macro into function and macro.

This commit is contained in:
Simon Ruderich
2013-06-10 05:43:31 +02:00
parent dfd317650f
commit 3773b830ba

View File

@@ -28,24 +28,32 @@
#include <stdlib.h>
/* dlsym() */
#include <dlfcn.h>
#include <errno.h>
/* Load the function name using dlsym() and return it. Terminate program on
* failure. Split in function and macro to reduce code inserted into the
* function using the macro. */
static void *dlsym_function(char const *name) {
void *result;
int saved_errno = errno; /* just in case */
/* Clear possibly existing error. */
dlerror();
result = dlsym(RTLD_NEXT, name);
/* Not much we can do. Most likely the other output functions failed to
* load too. */
if (dlerror() != NULL) {
abort();
}
errno = saved_errno;
return result;
}
/* Load the function name using dlsym() if necessary and store it in pointer.
* Terminate program on failure. */
#define DLSYM_FUNCTION(pointer, name) \
if (NULL == (pointer)) { \
int saved_errnox = errno; \
char *error; \
dlerror(); /* Clear possibly existing error. */ \
\
*(void **) (&(pointer)) = dlsym(RTLD_NEXT, (name)); \
\
if (NULL != (error = dlerror())) { \
/* Not much we can do. Most likely the other output functions \
* failed to load too. */ \
abort(); \
} \
errno = saved_errnox; \
if (!(pointer)) { \
*(void **) (&(pointer)) = dlsym_function(name); \
}
#endif