[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
mingw and SIGPIPE, new modules 'sigpipe' and 'write'
From: |
Bruno Haible |
Subject: |
mingw and SIGPIPE, new modules 'sigpipe' and 'write' |
Date: |
Fri, 26 Sep 2008 13:15:16 +0200 |
User-agent: |
KMail/1.5.4 |
Simon Josefsson wrote:
> Right now, the gnulib modules that fail to build under mingw32 are (see
> log): savewd, sigpipe-die, getugroups, idcache, and userspec.
Interesting... 'glob' was also in this list, but was ported to mingw by Yoann.
'sigpipe-die' is new, however. Native Windows does not have SIGPIPE.
What happens when writing a pipe with no readers?
$ msgcat de.po | head -1
# German translations for GNU gettext-runtime package
msgcat.exe: error while writing "standard output" file: Invalid argument
The desired behaviour, as on Unix, is that the msgcat program terminates
without an error message.
In such a situation, the write() call fails with errno = EINVAL,
GetLastError() = ERROR_NO_DATA.
This is quite pervasive. Obviously we don't want to hack every write()
or fwrite() calls in all programs to get this behaviour right. The
following functions all need to be extended in gnulib.
- <signal.h>: define SIGPIPE
- signal, sigprocmask, sigaction: support SIGPIPE
- raise: support SIGPIPE
- write: check for ERROR_NO_DATA and potentially raise SIGPIPE
- fwrite, fputs, puts, fputc, putc, putchar, [v]fprintf, [v]printf: likewise
I'm applying this in 7 commits.
Bruno
2008-09-26 Bruno Haible <address@hidden>
* modules/sigpipe-die (Depends-on): Add sigpipe.
* lib/stdio.in.h (fprintf, vfprintf, printf, vprintf, fputc, putc,
putchar, fputs, puts, fwrite): Replace when REPLACE_STDIO_WRITE_FUNCS
and GNULIB_STDIO_H_SIGPIPE are set.
* lib/stdio-write.c: New file.
* m4/stdio_h.m4 (gl_STDIO_H): Set GNULIB_FPRINTF, GNULIB_PRINTF,
GNULIB_VFPRINTF, GNULIB_VPRINTF, GNULIB_FPUTC, GNULIB_PUTC,
GNULIB_PUTCHAR, GNULIB_FPUTS, GNULIB_PUTS, GNULIB_FWRITE,
REPLACE_STDIO_WRITE_FUNCS.
(gl_STDIO_H_DEFAULTS): Initialize GNULIB_FPRINTF, GNULIB_PRINTF,
GNULIB_VFPRINTF, GNULIB_VPRINTF, GNULIB_FPUTC, GNULIB_PUTC,
GNULIB_PUTCHAR, GNULIB_FPUTS, GNULIB_PUTS, GNULIB_FWRITE,
GNULIB_STDIO_H_SIGPIPE, REPLACE_STDIO_WRITE_FUNCS.
* modules/stdio (Files): Add lib/stdio-write.c.
(Makefile.am): Substitute GNULIB_FPRINTF, GNULIB_PRINTF,
GNULIB_VFPRINTF, GNULIB_VPRINTF, GNULIB_FPUTC, GNULIB_PUTC,
GNULIB_PUTCHAR, GNULIB_FPUTS, GNULIB_PUTS, GNULIB_FWRITE,
GNULIB_STDIO_H_SIGPIPE, REPLACE_STDIO_WRITE_FUNCS.
* m4/fprintf-posix.m4 (gl_REPLACE_FPRINTF): Define
REPLACE_FPRINTF_POSIX.
* m4/printf-posix-rpl.m4 (gl_REPLACE_PRINTF): Define
REPLACE_PRINTF_POSIX.
* m4/vfprintf-posix.m4 (gl_REPLACE_VFPRINTF): Define
REPLACE_VFPRINTF_POSIX.
* m4/vprintf-posix.m4 (gl_REPLACE_VPRINTF): Define
REPLACE_VPRINTF_POSIX.
* doc/posix-functions/fprintf.texi: Mention the sigpipe module and the
SIGPIPE issue.
* doc/posix-functions/fputc.texi: Likewise.
* doc/posix-functions/fputs.texi: Likewise.
* doc/posix-functions/fwrite.texi: Likewise.
* doc/posix-functions/printf.texi: Likewise.
* doc/posix-functions/putc.texi: Likewise.
* doc/posix-functions/putchar.texi: Likewise.
* doc/posix-functions/puts.texi: Likewise.
* doc/posix-functions/vfprintf.texi: Likewise.
* doc/posix-functions/vprintf.texi: Likewise.
* modules/safe-write (Depends-on): Add write.
* modules/sigpipe-tests: New file.
* tests/test-sigpipe.c: New file.
* tests/test-sigpipe.sh: New file.
* modules/write: New file.
* lib/unistd.in.h: Include <sys/types.h>.
(write): New declaration.
* lib/write.c: New file.
* m4/write.m4: New file.
* m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize
GNULIB_UNISTD_H_SIGPIPE, GNULIB_WRITE, REPLACE_WRITE.
* modules/unistd (Makefile.am): Substitute GNULIB_UNISTD_H_SIGPIPE,
GNULIB_WRITE, REPLACE_WRITE.
* doc/posix-functions/write.texi: Mention the write, sigpipe modules
and the SIGPIPE issue.
* lib/signal.in.h (SIGPIPE): Define to a replacement value.
(raise): New declaration.
* lib/sigprocmask.c (SIGPIPE_handler): New variable.
(ext_signal): New function.
(rpl_raise): New function.
* m4/signal_h.m4 (gl_SIGNAL_H_DEFAULTS): Initialize
GNULIB_SIGNAL_H_SIGPIPE.
* modules/signal (Makefile.am): Substitute GNULIB_SIGNAL_H_SIGPIPE.
* doc/posix-headers/signal.texi: Mention the SIGPIPE issue.
* modules/sigpipe: New file.
* m4/sigpipe.m4: New file.
- [PATCH]: Missing tests-base in gnulib-cache.m4, Yoann Vandoorselaere, 2008/09/25
- Re: [PATCH]: Missing tests-base in gnulib-cache.m4, Paolo Bonzini, 2008/09/25
- Re: [PATCH]: Missing tests-base in gnulib-cache.m4, Ralf Wildenhues, 2008/09/25
- Re: [PATCH]: Missing tests-base in gnulib-cache.m4, Paolo Bonzini, 2008/09/25
- Re: [PATCH]: Missing tests-base in gnulib-cache.m4, Simon Josefsson, 2008/09/25
- mingw and SIGPIPE, new modules 'sigpipe' and 'write',
Bruno Haible <=
- Re: mingw and SIGPIPE, new modules 'sigpipe' and 'write' (1/7), Bruno Haible, 2008/09/26
- Re: mingw and SIGPIPE, new modules 'sigpipe' and 'write' (2/7), Bruno Haible, 2008/09/26
- Re: mingw and SIGPIPE, new modules 'sigpipe' and 'write' (3/7), Bruno Haible, 2008/09/26
- Re: mingw and SIGPIPE, new modules 'sigpipe' and 'write' (4/7), Bruno Haible, 2008/09/26
- Re: mingw and SIGPIPE, new modules 'sigpipe' and 'write' (5/7), Bruno Haible, 2008/09/26
- Re: mingw and SIGPIPE, new modules 'sigpipe' and 'write' (6/7), Bruno Haible, 2008/09/26
- Re: mingw and SIGPIPE, new modules 'sigpipe' and 'write' (7/7), Bruno Haible, 2008/09/26
- Re: mingw and SIGPIPE, new modules 'sigpipe' and 'write', Simon Josefsson, 2008/09/26
- Re: [PATCH]: Missing tests-base in gnulib-cache.m4, Yoann Vandoorselaere, 2008/09/25
Re: [PATCH]: Missing tests-base in gnulib-cache.m4, Bruno Haible, 2008/09/25