]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/blobdiff - src/coloredstderr.c
Also hook un-macroed putc when it's a macro.
[coloredstderr/coloredstderr.git] / src / coloredstderr.c
index 15581a622c30f15d437cd982244d88498ac45803..66467b402e14d0a95b630dea38e1e3d59a77a7d7 100644 (file)
@@ -238,6 +238,14 @@ HOOK_FILE2(int, fputc, stream,
            int, c, FILE *, stream)
 HOOK_FILE2(int, putc, stream,
            int, c, FILE *, stream)
+/* The glibc uses a macro for putc() which expands to _IO_putc(). However
+ * sometimes the raw putc() is used as well, not sure why. Make sure to hook
+ * it too. */
+#ifdef putc
+# undef putc
+HOOK_FILE2(int, putc, stream,
+           int, c, FILE *, stream)
+#endif
 HOOK_FILE1(int, putchar, stdout,
            int, c)
 HOOK_FILE1(int, puts, stdout,
@@ -646,10 +654,16 @@ HOOK_FUNC_DEF2(int, execvp, char const *, file, char * const *, argv) {
 #ifdef HAVE_EXECVPE
 extern char **environ;
 int execvpe(char const *file, char * const argv[], char * const envp[]) {
+    int result;
+    char **old_environ = environ;
+
     /* Fake the environment so we can reuse execvp(). */
     environ = (char **)envp;
 
     /* execvp() updates the environment. */
-    return execvp(file, argv);
+    result = execvp(file, argv);
+
+    environ = old_environ;
+    return result;
 }
 #endif