X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=src%2Fcoloredstderr.c;h=c1522186592a91bbfece42a510c5e77018d9257b;hb=7c5d6fce3a6f52243948e3eae452acb968d78469;hp=10b83be2db01d074bb5b5f5255ecbc5aeda1a805;hpb=96710bc3fa919e221338ef96686e80ba590d3b77;p=coloredstderr%2Fcoloredstderr.git diff --git a/src/coloredstderr.c b/src/coloredstderr.c index 10b83be..c152218 100644 --- a/src/coloredstderr.c +++ b/src/coloredstderr.c @@ -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. */ @@ -322,3 +326,23 @@ int fclose(FILE *fp) { close_fd(fileno(fp)); return real_fclose(fp); } + + +/* Hook functions which are necessary for correct tracking. */ + +#if defined(HAVE_VFORK) && defined(HAVE_FORK) +pid_t vfork(void) { + /* vfork() is similar to fork() but the address space is shared between + * father and child. It's designed for fork()/exec() usage because it's + * faster than fork(). However according to the POSIX standard the "child" + * isn't allowed to perform any memory-modifications before the exec() + * (except the pid_t result variable of vfork()). + * + * As some programs don't adhere to the standard (e.g. the "child" closes + * or dups a descriptor before the exec()) and this breaks our tracking of + * file descriptors (e.g. it gets closed in the parent as well), we just + * fork() instead. This is in compliance with the POSIX standard and as + * most systems use copy-on-write anyway not a performance issue. */ + return fork(); +} +#endif