aboutsummaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
Diffstat (limited to 'win32')
-rw-r--r--win32/winansi.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/win32/winansi.c b/win32/winansi.c
index a8f5dba79..167b4b0b1 100644
--- a/win32/winansi.c
+++ b/win32/winansi.c
@@ -475,12 +475,32 @@ int winansi_puts(const char *s)
475 return (winansi_fputs(s, stdout) == EOF || putchar('\n') == EOF) ? EOF : 0; 475 return (winansi_fputs(s, stdout) == EOF || putchar('\n') == EOF) ? EOF : 0;
476} 476}
477 477
478static sighandler_t sigpipe_handler = SIG_DFL;
479
480#undef signal
481sighandler_t winansi_signal(int signum, sighandler_t handler)
482{
483 sighandler_t old;
484
485 if (signum == SIGPIPE) {
486 old = sigpipe_handler;
487 sigpipe_handler = handler;
488 return old;
489 }
490 return signal(signum, handler);
491}
492
478static void check_pipe_fd(int fd) 493static void check_pipe_fd(int fd)
479{ 494{
480 if (GetLastError() == ERROR_NO_DATA) { 495 int error = GetLastError();
481 if (GetFileType((HANDLE)_get_osfhandle(fd)) == FILE_TYPE_PIPE) { 496
497 if ((error == ERROR_NO_DATA &&
498 GetFileType((HANDLE)_get_osfhandle(fd)) == FILE_TYPE_PIPE) ||
499 error == ERROR_BROKEN_PIPE) {
500 if (sigpipe_handler == SIG_DFL)
501 exit(128+SIGPIPE);
502 else /* SIG_IGN */
482 errno = EPIPE; 503 errno = EPIPE;
483 }
484 } 504 }
485} 505}
486 506