]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/commitdiff
Hook perror(3).
authorSimon Ruderich <simon@ruderich.org>
Sat, 1 Jun 2013 20:08:45 +0000 (22:08 +0200)
committerSimon Ruderich <simon@ruderich.org>
Sat, 1 Jun 2013 20:08:45 +0000 (22:08 +0200)
src/coloredstderr.c
src/hookmacros.h
tests/example.c
tests/example.expected

index 10b83be2db01d074bb5b5f5255ecbc5aeda1a805..b16633f8534b8b7d9a1e4fdc64532a185497c598 100644 (file)
@@ -230,6 +230,10 @@ HOOK_FILE1(int, putchar_unlocked, stdout,
 HOOK_FILE1(int, puts_unlocked, stdout,
            const char *, s)
 
+/* perror(3) */
+HOOK_VOID1(void, perror, STDERR_FILENO,
+           const char *, s)
+
 
 /* Hook functions which duplicate file descriptors to track them. */
 
index ffbc6b6de457a7b45aa2a31c285fb03fdff3d873..9e1bd75fa6d60721bbf50a5709c14d5c9d38b46b 100644 (file)
@@ -30,6 +30,8 @@
         DLSYM_FUNCTION(real_ ## name, #name);
 #define _HOOK_PRE_FD(type, name, fd) \
         _HOOK_PRE(type, name) \
+        _HOOK_PRE_FD_ALONE(type, name, fd)
+#define _HOOK_PRE_FD_ALONE(type, name, fd) \
         handle = check_handle_fd(fd); \
         if (handle) { \
             handle_fd_pre(fd, handle); \
         }
 /* Save and restore the errno to make sure we return the errno of the original
  * function call. */
-#define _HOOK_POST_FD(fd) \
+#define _HOOK_POST_FD_ALONE(fd) \
         if (handle) { \
             int saved_errno = errno; \
             handle_fd_post(fd, handle); \
             errno = saved_errno; \
-        } \
+        }
+#define _HOOK_POST_FD(fd) \
+        _HOOK_POST_FD_ALONE(fd) \
         return result;
 #define _HOOK_POST_FILE(file) \
         if (handle) { \
         return result;
 
 
+#define HOOK_VOID1(type, name, fd, type1, arg1) \
+    static type (*real_ ## name)(type1); \
+    type name(type1 arg1) { \
+        int handle; \
+        DLSYM_FUNCTION(real_ ## name, #name); \
+        _HOOK_PRE_FD_ALONE(type, name, fd) \
+        real_ ## name(arg1); \
+        _HOOK_POST_FD_ALONE(fd) \
+    }
+
 #define HOOK_FD3(type, name, fd, type1, arg1, type2, arg2, type3, arg3) \
     static type (*real_ ## name)(type1, type2, type3); \
     type name(type1 arg1, type2 arg2, type3 arg3) { \
index 20f731000b936b91ce276bbe9c4e1608c4e173b4..c615211c11872600f005cd5cc3ecac98be3acc6c 100644 (file)
@@ -28,6 +28,9 @@ int main(int argc, char **argv) {
     printf("write to stdout\n");
     fflush(stdout);
 
+    errno = 0;
+    perror("error!");
+
     write(STDERR_FILENO, "write to stderr 2", 17);
     write(STDOUT_FILENO, "write to stdout 2", 17);
 
index b44ee0b13167af46e492b44217239a03e2f8e210..fe7b5f26a0f9574cc0ba685ecce2b14cc14f3b1c 100644 (file)
@@ -1,4 +1,5 @@
 >stderr>write to stderr: 1
 <stderr<write to stdout
->stderr>write to stderr 2<stderr<write to stdout 2>stderr>
+>stderr>error!: Success
+<stderr<>stderr>write to stderr 2<stderr<write to stdout 2>stderr>
 <stderr<