#include /* XXX - these have to be hidden because signal() uses them and signal() is * ANSI and not POSIX. It would be surely be better to use macros for the * library and system uses, and perhaps macros as well as functions for the * POSIX user interface. The macros would not need underlines. It may be * inconvenient to match the exact semantics of the current functions * because the interface is bloated by reporting errors. For library and * system uses, the signal number is mostly already known to be valid * before the sigset-changing routines are called. */ #define sigaddset _sigaddset #define sigdelset _sigdelset #define sigemptyset _sigemptyset #define sigfillset _sigfillset #define sigismember _sigismember #include /* Low bit of signal masks. */ #define SIGBIT_0 ((sigset_t) 1) /* Mask of valid signals (0 - _NSIG). */ #define SIGMASK (((SIGBIT_0 << _NSIG) << 1) - 1) #define sigisvalid(signo) ((unsigned) (signo) <= _NSIG) PUBLIC int sigaddset(set, signo) sigset_t *set; int signo; { if (!sigisvalid(signo)) { errno = EINVAL; return -1; } *set |= SIGBIT_0 << signo; return 0; } PUBLIC int sigdelset(set, signo) sigset_t *set; int signo; { if (!sigisvalid(signo)) { errno = EINVAL; return -1; } *set &= ~(SIGBIT_0 << signo); return 0; } PUBLIC int sigemptyset(set) sigset_t *set; { *set = 0; return 0; } PUBLIC int sigfillset(set) sigset_t *set; { *set = SIGMASK; return 0; } PUBLIC int sigismember(set, signo) _CONST sigset_t *set; int signo; { if (!sigisvalid(signo)) { errno = EINVAL; return -1; } if (*set & (SIGBIT_0 << signo)) return 1; return 0; }