minix/lib/posix/_sigset.c
2005-04-21 14:53:53 +00:00

76 lines
1.6 KiB
C
Executable file

#include <lib.h>
/* 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 <signal.h>
/* 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;
}