]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/blobdiff - src/ldpreload.h
update copyright year
[coloredstderr/coloredstderr.git] / src / ldpreload.h
index a3d646e89a00eaaa823149a7a4f87f7dbf9acc7f..af416b39dd9f4c4ef23611410d0a1a951965d1c4 100644 (file)
@@ -2,7 +2,7 @@
  * Helper header for LD_PRELOAD related headers macros. Must be loaded _first_
  * (for RTLD_NEXT)!
  *
- * Copyright (C) 2012-2013  Simon Ruderich
+ * Copyright (C) 2012-2015  Simon Ruderich
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #include <stdlib.h>
 /* dlsym() */
 #include <dlfcn.h>
+#include <errno.h>
 
+static void *dlsym_function(char const *name) noinline;
+/* 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 (unlikely(!(pointer))) { \
+        *(void **) (&(pointer)) = dlsym_function(name); \
     }
 
 #endif