]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/commitdiff
ldpreload.h: Split macro into function and macro.
authorSimon Ruderich <simon@ruderich.org>
Mon, 10 Jun 2013 03:43:31 +0000 (05:43 +0200)
committerSimon Ruderich <simon@ruderich.org>
Mon, 10 Jun 2013 12:05:50 +0000 (14:05 +0200)
src/ldpreload.h

index a3d646e89a00eaaa823149a7a4f87f7dbf9acc7f..6ef291185981a44c90a484df71efe635460e7b03 100644 (file)
 #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