X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fsigaction.c;h=e14bd9647e5b43f259ccd6ae348518522192a21a;hb=ab43907148e80f3895280928c05d4be93875580f;hp=9b0c92fdae8f74683bfa2c3538f68f62c3726d6f;hpb=cfb3906f210bec09f48f5d48511b72064153311a;p=gnulib.git diff --git a/lib/sigaction.c b/lib/sigaction.c index 9b0c92fda..e14bd9647 100644 --- a/lib/sigaction.c +++ b/lib/sigaction.c @@ -1,5 +1,5 @@ /* POSIX compatible signal blocking. - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. Written by Eric Blake , 2008. This program is free software: you can redistribute it and/or modify @@ -35,11 +35,15 @@ the situation by reading static storage in a signal handler, which POSIX warns is not generically async-signal-safe. Oh well. - Additionally, SIGCHLD is not defined, so we don't implement - SA_NOCLDSTOP or SA_NOCLDWAIT; sigaltstack() is not present, so we - don't implement SA_ONSTACK; and siginterrupt() is not present, so - we don't implement SA_RESTART. Supporting SA_SIGINFO is impossible - to do portably. + Additionally: + - We don't implement SA_NOCLDSTOP or SA_NOCLDWAIT, because SIGCHLD + is not defined. + - We don't implement SA_ONSTACK, because sigaltstack() is not present. + - We ignore SA_RESTART, because blocking Win32 calls are not interrupted + anyway when an asynchronous signal occurs, and the MSVCRT runtime + never sets errno to EINTR. + - We don't implement SA_SIGINFO because it is impossible to do so + portably. POSIX states that an application should not mix signal() and sigaction(). We support the use of signal() within the gnulib @@ -60,6 +64,14 @@ # define SIGSTOP (-1) #endif +/* On native Windows, as of 2008, the signal SIGABRT_COMPAT is an alias + for the signal SIGABRT. Only one signal handler is stored for both + SIGABRT and SIGABRT_COMPAT. SIGABRT_COMPAT is not a signal of its own. */ +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +# undef SIGABRT_COMPAT +# define SIGABRT_COMPAT 6 +#endif + /* A signal handler. */ typedef void (*handler_t) (int signal); @@ -79,7 +91,7 @@ sigaction_handler (int sig) { /* Unexpected situation; be careful to avoid recursive abort. */ if (sig == SIGABRT) - signal (SIGABRT, SIG_DFL); + signal (SIGABRT, SIG_DFL); abort (); } @@ -130,6 +142,11 @@ sigaction (int sig, const struct sigaction *restrict act, return -1; } + #ifdef SIGABRT_COMPAT + if (sig == SIGABRT_COMPAT) + sig = SIGABRT; + #endif + /* POSIX requires sigaction() to be async-signal-safe. In other words, if an asynchronous signal can occur while we are anywhere inside this function, the user's handler could then call