#ifndef _SYS_SIGNALVAR_H_
#define _SYS_SIGNALVAR_H_
#include <sys/signal.h>
#ifdef _KERNEL
#include <sys/proc.h>
#include <machine/lock.h>
#endif
struct sigacts {
sig_t ps_sigact[_SIG_MAXSIG];
sigset_t ps_catchmask[_SIG_MAXSIG];
struct {
int pid;
int uid;
} ps_frominfo[_SIG_MAXSIG];
sigset_t ps_sigignore;
sigset_t ps_sigcatch;
sigset_t ps_sigonstack;
sigset_t ps_sigintr;
sigset_t ps_sigreset;
sigset_t ps_signodefer;
sigset_t ps_siginfo;
sigset_t ps_usertramp;
unsigned int ps_refcnt;
int ps_flag;
};
#define SIG_CATCH ((__sighandler_t *)2)
#define SIG_HOLD ((__sighandler_t *)3)
#ifdef _KERNEL
#define SIGACTION(p, sig) (p->p_sigacts->ps_sigact[_SIG_IDX(sig)])
#endif
#define SIGADDSET(set, signo) \
(set).__bits[_SIG_WORD(signo)] |= _SIG_BIT(signo)
#define SIGADDSET_ATOMIC(set, signo) \
atomic_set_int(&(set).__bits[_SIG_WORD(signo)], _SIG_BIT(signo))
#define SIGDELSET(set, signo) \
(set).__bits[_SIG_WORD(signo)] &= ~_SIG_BIT(signo)
#define SIGDELSET_ATOMIC(set, signo) \
atomic_clear_int(&(set).__bits[_SIG_WORD(signo)], _SIG_BIT(signo))
#define SIGEMPTYSET(set) \
do { \
int __i; \
for (__i = 0; __i < _SIG_WORDS; __i++) \
(set).__bits[__i] = 0; \
} while (0)
#define SIGFILLSET(set) \
do { \
int __i; \
for (__i = 0; __i < _SIG_WORDS; __i++) \
(set).__bits[__i] = ~(unsigned int)0; \
} while (0)
#define SIGISMEMBER(set, signo) \
((set).__bits[_SIG_WORD(signo)] & _SIG_BIT(signo))
#define SIGISEMPTY(set) __sigisempty(&(set))
#define SIGNOTEMPTY(set) (!__sigisempty(&(set)))
#define SIGSETEQ(set1, set2) __sigseteq(&(set1), &(set2))
#define SIGSETNEQ(set1, set2) (!__sigseteq(&(set1), &(set2)))
#define SIGSETOR(set1, set2) \
do { \
int __i; \
for (__i = 0; __i < _SIG_WORDS; __i++) \
(set1).__bits[__i] |= (set2).__bits[__i]; \
} while (0)
#define SIGSETAND(set1, set2) \
do { \
int __i; \
for (__i = 0; __i < _SIG_WORDS; __i++) \
(set1).__bits[__i] &= (set2).__bits[__i]; \
} while (0)
#define SIGSETNAND(set1, set2) \
do { \
int __i; \
for (__i = 0; __i < _SIG_WORDS; __i++) \
(set1).__bits[__i] &= ~(set2).__bits[__i]; \
} while (0)
#define SIGSETOR_CANTMASK(set) \
SIGADDSET(set, SIGKILL), SIGADDSET(set, SIGSTOP)
#define SIG_CONDBLOCKALLSIGS(set, lp) \
__sig_condblockallsigs(&(set), lp)
#define SIG_CANTMASK(set) \
SIGDELSET(set, SIGKILL), SIGDELSET(set, SIGSTOP)
#define SIG_STOPSIGMASK(set) \
SIGDELSET(set, SIGSTOP), SIGDELSET(set, SIGTSTP), \
SIGDELSET(set, SIGTTIN), SIGDELSET(set, SIGTTOU)
#define SIG_STOPSIGMASK_ATOMIC(set) \
SIGDELSET_ATOMIC(set, SIGSTOP), SIGDELSET_ATOMIC(set, SIGTSTP), \
SIGDELSET_ATOMIC(set, SIGTTIN), SIGDELSET_ATOMIC(set, SIGTTOU)
#define SIG_CONTSIGMASK(set) \
SIGDELSET(set, SIGCONT)
#define SIG_CONTSIGMASK_ATOMIC(set) \
SIGDELSET_ATOMIC(set, SIGCONT)
#define sigcantmask (sigmask(SIGKILL) | sigmask(SIGSTOP))
static __inline int
__sigisempty(sigset_t *set)
{
int i;
for (i = 0; i < _SIG_WORDS; i++) {
if (set->__bits[i])
return (0);
}
return (1);
}
static __inline int
__sigseteq(sigset_t *set1, sigset_t *set2)
{
int i;
for (i = 0; i < _SIG_WORDS; i++) {
if (set1->__bits[i] != set2->__bits[i])
return (0);
}
return (1);
}
#ifdef _KERNEL
typedef void (*proc_func_t)(struct proc *);
struct pgrp;
struct proc;
struct sigio;
extern int sugid_coredump;
extern sigset_t sigcantmask_mask;
void execsigs (struct proc *p);
void gsignal (int pgid, int sig);
int issignal (struct lwp *lp, int maytrace, int *ptokp);
int iscaught (struct lwp *p);
void killproc (struct proc *p, char *why);
void pgsigio (struct sigio *, int signum, int checkctty);
void pgsignal (struct pgrp *pgrp, int sig, int checkctty);
void postsig (int sig, int ptok);
void ksignal (struct proc *p, int sig);
void lwpsignal (struct proc *p, struct lwp *lp, int sig);
void siginit (struct proc *p);
void trapsignal (struct lwp *p, int sig, u_long code);
void sendsig (sig_t action, int sig, sigset_t *retmask, u_long code);
void sigexit (struct lwp *lp, int sig) __dead2;
int checkpoint_signal_handler(struct lwp *p);
#endif
#endif