73 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <lib.h>
 | 
						|
/* System processes use simpler macros with no range error checking (defined in
 | 
						|
 * signal.h). The ANSI signal() implementation now also uses the macro
 | 
						|
 * versions, which makes hiding of the functions here a historical remains.
 | 
						|
 *
 | 
						|
 * _NSIG is supposed to be the highest signal number plus one.
 | 
						|
 */
 | 
						|
#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-1)). */
 | 
						|
#define SIGMASK		((SIGBIT_0 << _NSIG) - 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;
 | 
						|
}
 |