bug-gnulib
[Top][All Lists]
Advanced

[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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]