[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: mingw and SIGPIPE, new modules 'sigpipe' and 'write' (2/7)
From: |
Bruno Haible |
Subject: |
Re: mingw and SIGPIPE, new modules 'sigpipe' and 'write' (2/7) |
Date: |
Fri, 26 Sep 2008 13:26:29 +0200 |
User-agent: |
KMail/1.5.4 |
2008-09-26 Bruno Haible <address@hidden>
* 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.
*** lib/signal.in.h.orig 2008-09-26 12:52:18.000000000 +0200
--- lib/signal.in.h 2008-09-26 02:30:02.000000000 +0200
***************
*** 44,49 ****
--- 44,60 ----
#endif
+ #if @GNULIB_SIGNAL_H_SIGPIPE@
+ # ifndef SIGPIPE
+ /* Define SIGPIPE to a value that does not overlap with other signals. */
+ # define SIGPIPE 13
+ # define GNULIB_defined_SIGPIPE 1
+ /* To actually use SIGPIPE, you also need the gnulib modules 'sigprocmask',
+ 'write', 'stdio'. */
+ # endif
+ #endif
+
+
#if address@hidden@
/* Maximum signal number + 1. */
***************
*** 92,99 ****
--- 103,120 ----
handler. */
extern void (*signal (int sig, void (*func) (int))) (int);
+ # if GNULIB_defined_SIGPIPE
+
+ /* Raise signal SIG. */
+ # undef raise
+ # define raise rpl_raise
+ extern int raise (int sig);
+
+ # endif
+
#endif /* address@hidden@ */
+
#if address@hidden@
# if address@hidden@
*** lib/sigprocmask.c.orig 2008-09-26 12:52:18.000000000 +0200
--- lib/sigprocmask.c 2008-09-26 11:42:37.000000000 +0200
***************
*** 45,50 ****
--- 45,75 ----
typedef void (*handler_t) (int);
+ /* Handling of gnulib defined signals. */
+
+ #if GNULIB_defined_SIGPIPE
+ static handler_t SIGPIPE_handler = SIG_DFL;
+ #endif
+
+ #if GNULIB_defined_SIGPIPE
+ static handler_t
+ ext_signal (int sig, handler_t handler)
+ {
+ switch (sig)
+ {
+ case SIGPIPE:
+ {
+ handler_t old_handler = SIGPIPE_handler;
+ SIGPIPE_handler = handler;
+ return old_handler;
+ }
+ default: /* System defined signal */
+ return signal (sig, handler);
+ }
+ }
+ # define signal ext_signal
+ #endif
+
int
sigismember (const sigset_t *set, int sig)
{
***************
*** 240,242 ****
--- 265,293 ----
return SIG_ERR;
}
}
+
+ #if GNULIB_defined_SIGPIPE
+ /* Raise the signal SIG. */
+ int
+ rpl_raise (int sig)
+ # undef raise
+ {
+ switch (sig)
+ {
+ case SIGPIPE:
+ if (blocked_set & (1U << sig))
+ pending_array[sig] = 1;
+ else
+ {
+ handler_t handler = SIGPIPE_handler;
+ if (handler == SIG_DFL)
+ exit (128 + SIGPIPE);
+ else if (handler != SIG_IGN)
+ (*handler) (sig);
+ }
+ return 0;
+ default: /* System defined signal */
+ return raise (sig);
+ }
+ }
+ #endif
*** m4/signal_h.m4.orig 2008-09-26 12:52:18.000000000 +0200
--- m4/signal_h.m4 2008-09-26 02:29:06.000000000 +0200
***************
*** 1,4 ****
! # signal_h.m4 serial 5
dnl Copyright (C) 2007, 2008 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
--- 1,4 ----
! # signal_h.m4 serial 6
dnl Copyright (C) 2007, 2008 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
***************
*** 19,24 ****
--- 19,25 ----
AC_DEFUN([gl_SIGNAL_H_DEFAULTS],
[
+ GNULIB_SIGNAL_H_SIGPIPE=0; AC_SUBST([GNULIB_SIGNAL_H_SIGPIPE])
GNULIB_SIGPROCMASK=0; AC_SUBST([GNULIB_SIGPROCMASK])
GNULIB_SIGACTION=0; AC_SUBST([GNULIB_SIGACTION])
dnl Assume proper GNU behavior unless another module says otherwise.
*** modules/signal.orig 2008-09-26 12:52:18.000000000 +0200
--- modules/signal 2008-09-26 02:30:20.000000000 +0200
***************
*** 23,28 ****
--- 23,29 ----
sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
-e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
-e 's|@''NEXT_SIGNAL_H''@|$(NEXT_SIGNAL_H)|g' \
+ -e 's|@''GNULIB_SIGNAL_H_SIGPIPE''@|$(GNULIB_SIGNAL_H_SIGPIPE)|g'
\
-e 's|@''GNULIB_SIGPROCMASK''@|$(GNULIB_SIGPROCMASK)|g' \
-e 's|@''GNULIB_SIGACTION''@|$(GNULIB_SIGACTION)|g' \
-e
's|@''HAVE_POSIX_SIGNALBLOCKING''@|$(HAVE_POSIX_SIGNALBLOCKING)|g' \
*** doc/posix-headers/signal.texi.orig 2008-09-26 12:52:18.000000000 +0200
--- doc/posix-headers/signal.texi 2008-09-26 00:21:07.000000000 +0200
***************
*** 10,27 ****
@item
@code{sigset_t} is only declared in <sys/types.h> on some platforms:
mingw.
-
@item
@code{struct sigaction} and @code{siginfo_t} are missing on some
platforms:
mingw.
-
@item
@code{struct sigaction} lacks the @code{sa_sigaction} member on some
platforms:
Irix 5.3, Interix 3.5.
@end itemize
Portability problems not fixed by Gnulib:
@itemize
@end itemize
--- 10,31 ----
@item
@code{sigset_t} is only declared in <sys/types.h> on some platforms:
mingw.
@item
@code{struct sigaction} and @code{siginfo_t} are missing on some
platforms:
mingw.
@item
@code{struct sigaction} lacks the @code{sa_sigaction} member on some
platforms:
Irix 5.3, Interix 3.5.
+ @item
+ The signal @code{SIGPIPE} is not defined on some platforms:
+ mingw.
@end itemize
Portability problems not fixed by Gnulib:
@itemize
+ @item
+ Many signals are not defined on some platforms:
+ mingw.
@end itemize
- [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, 2008/09/26
- 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 <=
- 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