/* syssignal.h - System-dependent definitions for signals.
- Copyright (C) 1992 Free Software Foundation, Inc.
+ Copyright (C) 1993 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifdef POSIX_SIGNALS
+
+/* Don't #include <signal.h>. That header should always be #included
+ before "config.h", because some configuration files (like s/hpux.h)
+ indicate that SIGIO doesn't work by #undef-ing SIGIO. If this file
+ #includes <signal.h>, then that will re-#define SIGIO and confuse
+ things. */
+
#define SIGMASKTYPE sigset_t
#define SIGEMPTYMASK (empty_mask)
/* POSIX pretty much destroys any possibility of writing sigmask as a
macro in standard C. */
+#ifndef sigmask
#ifdef __GNUC__
#define sigmask(SIG) \
({ \
sigaddset (&_mask, SIG); \
_mask; \
})
-#else
+#else /* ! defined (__GNUC__) */
+extern sigset_t sys_sigmask ();
#define sigmask(SIG) (sys_sigmask (SIG))
+#endif /* ! defined (__GNUC__) */
#endif
-#define sigpause(SIG) sys_sigpause(SIG)
-#define sigblock(SIG) sys_sigblock(SIG)
-#define sigunblock(SIG) sys_sigunblock(SIG)
-#define sigsetmask(SIG) sys_sigsetmask(SIG)
+#define sigpause(SIG) sys_sigpause (SIG)
+#define sigblock(SIG) sys_sigblock (SIG)
+#define sigunblock(SIG) sys_sigunblock (SIG)
+#define sigsetmask(SIG) sys_sigsetmask (SIG)
#define sighold(SIG) ONLY_USED_IN_BSD_4_1
#define sigrelse(SIG) ONLY_USED_IN_BSD_4_1
+#undef signal
+#define signal(SIG,ACT) sys_signal(SIG,ACT)
+
+/* Whether this is what all systems want or not, this is what
+ appears to be assumed in the source, for example data.c:arith_error. */
+typedef RETSIGTYPE (*signal_handler_t) (/*int*/);
-int (*sys_signal (int signal_number, int (*action)())) ();
-int sys_sigpause (int signal_number);
-sigset_t sys_sigblock (sigset_t new_mask);
-sigset_t sys_sigunblock (sigset_t new_mask);
-sigset_t sys_sigsetmask (sigset_t new_mask);
+signal_handler_t sys_signal (/*int signal_number, signal_handler_t action*/);
+int sys_sigpause (/*sigset_t new_mask*/);
+sigset_t sys_sigblock (/*sigset_t new_mask*/);
+sigset_t sys_sigunblock (/*sigset_t new_mask*/);
+sigset_t sys_sigsetmask (/*sigset_t new_mask*/);
-#define sys_sigdel(MASK,SIG) sigdelset(&MASK,SIG)
+#define sys_sigdel(MASK,SIG) sigdelset (&MASK,SIG)
-#else /* not POSIX_SIGNALS */
+#else /* ! defined (POSIX_SIGNALS) */
+#ifdef USG5_4
+
+#ifndef sigblock
+#define sigblock(sig) (sigprocmask (SIG_BLOCK, SIGEMPTYMASK | sig, NULL))
+#endif
+
+#define sigunblock(sig) (sigprocmask (SIG_SETMASK, SIGFULLMASK & ~(sig), NULL))
+
+#else
+#ifdef USG
+
+#define sigunblock(sig)
+
+#else
#define sigunblock(SIG) \
{ SIGMASKTYPE omask = sigblock (SIGEMPTYMASK); sigsetmask (omask & ~SIG); }
-#endif /* not POSIX_SIGNALS */
+#endif /* ! defined (USG) */
+#endif /* ! defined (USG5_4) */
+#endif /* ! defined (POSIX_SIGNALS) */
#ifndef SIGMASKTYPE
#define SIGMASKTYPE int
#define sigblockx(sig) sigblock (sigmask (sig))
#define sigunblockx(sig) sigblock (SIGEMPTYMASK)
#define sigpausex(sig) sigpause (0)
-#endif /* not BSD4_1 */
+#endif /* BSD4_1 */
#ifdef BSD4_1
#define SIGIO SIGTINT
#define sigblockx(sig) sighold (sig)
#define sigunblockx(sig) sigrelse (sig)
#define sigpausex(sig) sigpause (sig)
-#endif /* BSD4_1 */
+#endif /* ! defined (BSD4_1) */
/* On bsd, [man says] kill does not accept a negative number to kill a pgrp.
Must do that using the killpg call. */
#ifdef BSD
#define EMACS_KILLPG(gid, signo) (killpg ( (gid), (signo)))
#else
+#ifdef WINDOWSNT
+#define EMACS_KILLPG(gid, signo) (win32_kill_process (gid, signo))
+#else
#define EMACS_KILLPG(gid, signo) (kill (-(gid), (signo)))
#endif
+#endif
/* Define SIGCHLD as an alias for SIGCLD. There are many conditionals
testing SIGCHLD. */
#ifdef SIGCLD
#ifndef SIGCHLD
#define SIGCHLD SIGCLD
-#endif /* not SIGCHLD */
-#endif /* SIGCLD */
-#endif /* not VMS */
+#endif /* SIGCHLD */
+#endif /* ! defined (SIGCLD) */
+#endif /* VMS */