#ifndef _SIGNAL_H #define _SIGNAL_H #include #define __WANT_POSIX1B_SIGNALS__ #include #include #define NSIG 32 #ifdef __mips__ #define _NSIG 128 #else #define _NSIG 64 #endif #define SIGHUP 1 #define SIGINT 2 #define SIGQUIT 3 #define SIGILL 4 #define SIGTRAP 5 #define SIGABRT 6 #define SIGIOT 6 #define SIGFPE 8 #define SIGKILL 9 #define SIGSEGV 11 #define SIGPIPE 13 #define SIGALRM 14 #define SIGTERM 15 #define SIGUNUSED 31 #if defined(__i386__) || defined(__x86_64__) || defined(__powerpc__) || defined(__arm__) \ || defined(__s390__) || defined(__ia64__) #define SIGBUS 7 #define SIGUSR1 10 #define SIGUSR2 12 #define SIGSTKFLT 16 #define SIGCHLD 17 #define SIGCONT 18 #define SIGSTOP 19 #define SIGTSTP 20 #define SIGTTIN 21 #define SIGTTOU 22 #define SIGURG 23 #define SIGXCPU 24 #define SIGXFSZ 25 #define SIGVTALRM 26 #define SIGPROF 27 #define SIGWINCH 28 #define SIGIO 29 #define SIGPWR 30 #define SIGSYS 31 #elif defined(__alpha__) || defined(__sparc__) #define SIGEMT 7 #define SIGBUS 10 #define SIGSYS 12 #define SIGURG 16 #define SIGSTOP 17 #define SIGTSTP 18 #define SIGCONT 19 #define SIGCHLD 20 #define SIGTTIN 21 #define SIGTTOU 22 #define SIGIO 23 #define SIGXCPU 24 #define SIGXFSZ 25 #define SIGVTALRM 26 #define SIGPROF 27 #define SIGWINCH 28 #define SIGPWR 29 #define SIGUSR1 30 #define SIGUSR2 31 #if defined(__alpha__) #define SIGINFO SIGPWR #endif #elif defined(__mips__) #define SIGEMT 7 #define SIGBUS 10 #define SIGSYS 12 #define SIGUSR1 16 #define SIGUSR2 17 #define SIGCHLD 18 #define SIGPWR 19 #define SIGWINCH 20 #define SIGURG 21 #define SIGIO 22 #define SIGSTOP 23 #define SIGTSTP 24 #define SIGCONT 25 #define SIGTTIN 26 #define SIGTTOU 27 #define SIGVTALRM 28 #define SIGPROF 29 #define SIGXCPU 30 #define SIGXFSZ 31 #elif defined(__hppa__) #define SIGEMT 7 #define SIGBUS 10 #define SIGSYS 12 #define SIGUSR1 16 #define SIGUSR2 17 #define SIGCHLD 18 #define SIGPWR 19 #define SIGVTALRM 20 #define SIGPROF 21 #define SIGIO 22 #define SIGWINCH 23 #define SIGSTOP 24 #define SIGTSTP 25 #define SIGCONT 26 #define SIGTTIN 27 #define SIGTTOU 28 #define SIGURG 29 #define SIGLOST 30 #define SIGUNUSED 31 #define SIGRESERVE SIGUNUSE #define SIGXCPU 33 #define SIGXFSZ 34 #define SIGSTKFLT 36 #else #error signal layout not yet known #endif #define SIGCLD SIGCHLD #define SIGLOST SIGPWR #define SIGPOLL SIGIO /* These should not be considered constants from userland. */ #ifdef __hppa__ #define SIGRTMIN 37 #else #define SIGRTMIN 32 #endif #define SIGRTMAX (_NSIG-1) /* SA_FLAGS values: */ #if defined(__alpha__) #define SA_ONSTACK 0x00000001 #define SA_RESTART 0x00000002 #define SA_NOCLDSTOP 0x00000004 #define SA_NODEFER 0x00000008 #define SA_RESETHAND 0x00000010 #define SA_NOCLDWAIT 0x00000020 /* not supported yet */ #define SA_SIGINFO 0x00000040 #define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #elif defined(__hppa__) #define SA_ONSTACK 0x00000001 #define SA_RESETHAND 0x00000004 #define SA_NOCLDSTOP 0x00000008 #define SA_SIGINFO 0x00000010 #define SA_NODEFER 0x00000020 #define SA_RESTART 0x00000040 #define SA_NOCLDWAIT 0x00000080 /* not supported yet */ #define _SA_SIGGFAULT 0x00000100 /* HPUX */ #define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_RESTORER 0x04000000 /* obsolete -- ignored */ #elif defined (__sparc__) #define SV_SSTACK 1 /* This signal handler should use sig-stack */ #define SV_INTR 2 /* Sig return should not restart system call */ #define SV_RESET 4 /* Set handler to SIG_DFL upon taken signal */ #define SV_IGNCHILD 8 /* Do not send SIGCHLD */ #define SA_NOCLDSTOP SV_IGNCHILD #define SA_STACK SV_SSTACK #define SA_ONSTACK SV_SSTACK #define SA_RESTART SV_INTR #define SA_RESETHAND SV_RESET #define SA_INTERRUPT 0x10 #define SA_NODEFER 0x20 #define SA_SHIRQ 0x40 #define SA_NOCLDWAIT 0x100 /* not supported yet */ #define SA_SIGINFO 0x200 #else #if defined (__mips__) #define SA_NOCLDSTOP 0x00000001 #define SA_SIGINFO 0x00000008 #define SA_NOCLDWAIT 0x00010000 /* Not supported yet */ #else #define SA_NOCLDSTOP 0x00000001 #define SA_NOCLDWAIT 0x00000002 /* not supported yet */ #define SA_SIGINFO 0x00000004 #endif #if defined(__arm__) #define SA_THIRTYTWO 0x02000000 #endif #define SA_RESTORER 0x04000000 #define SA_ONSTACK 0x08000000 #define SA_RESTART 0x10000000 #define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ #define SA_NODEFER 0x40000000 #define SA_RESETHAND 0x80000000 #endif /* ugh, historic Linux legacy, for gpm :-( */ #define SA_NOMASK SA_NODEFER #define SA_ONESHOT SA_RESETHAND /* sigaltstack controls */ #define SS_ONSTACK 1 #define SS_DISABLE 2 #define MINSIGSTKSZ 2048 #define SIGSTKSZ 8192 #if defined(__alpha__) || defined(__mips__) #define SIG_BLOCK 1 /* for blocking signals */ #define SIG_UNBLOCK 2 /* for unblocking signals */ #define SIG_SETMASK 3 /* for setting the signal mask */ #else #define SIG_BLOCK 0 /* for blocking signals */ #define SIG_UNBLOCK 1 /* for unblocking signals */ #define SIG_SETMASK 2 /* for setting the signal mask */ #endif typedef int sig_atomic_t; typedef void (*sighandler_t)(int); #ifdef _BSD_SOURCE typedef sighandler_t sig_t; #endif #define SIG_DFL ((sighandler_t)0) /* default signal handling */ #define SIG_IGN ((sighandler_t)1) /* ignore signal */ #define SIG_ERR ((sighandler_t)-1) /* error return from signal */ typedef union sigval { int sival_int; void *sival_ptr; } sigval_t; #define SI_MAX_SIZE 128 #define SI_PAD_SIZE ((SI_MAX_SIZE/sizeof(int)) - 3) typedef struct siginfo { int si_signo; int si_errno; int si_code; union { int _pad[SI_PAD_SIZE]; /* kill() */ struct { pid_t _pid; /* sender's pid */ uid_t _uid; /* sender's uid */ } _kill; /* POSIX.1b timers */ struct { unsigned int _timer1; unsigned int _timer2; } _timer; /* POSIX.1b signals */ struct { pid_t _pid; /* sender's pid */ uid_t _uid; /* sender's uid */ sigval_t _sigval; } _rt; /* SIGCHLD */ struct { pid_t _pid; /* which child */ uid_t _uid; /* sender's uid */ int _status; /* exit code */ clock_t _utime; clock_t _stime; } _sigchld; /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ struct { void *_addr; /* faulting insn/memory ref. */ } _sigfault; /* SIGPOLL */ struct { int _band; /* POLL_IN, POLL_OUT, POLL_MSG */ int _fd; } _sigpoll; } _sifields; } siginfo_t; /* * How these fields are to be accessed. */ #define si_pid _sifields._kill._pid #define si_uid _sifields._kill._uid #define si_status _sifields._sigchld._status #define si_utime _sifields._sigchld._utime #define si_stime _sifields._sigchld._stime #define si_value _sifields._rt._sigval #define si_int _sifields._rt._sigval.sival_int #define si_ptr _sifields._rt._sigval.sival_ptr #define si_addr _sifields._sigfault._addr #define si_band _sifields._sigpoll._band #define si_fd _sifields._sigpoll._fd /* Values for `si_code'. Positive values are reserved for kernel-generated signals. */ enum { SI_ASYNCNL = -6, /* Sent by asynch name lookup completion. */ # define SI_ASYNCNL SI_ASYNCNL SI_SIGIO, /* Sent by queued SIGIO. */ # define SI_SIGIO SI_SIGIO SI_ASYNCIO, /* Sent by AIO completion. */ # define SI_ASYNCIO SI_ASYNCIO SI_MESGQ, /* Sent by real time mesq state change. */ # define SI_MESGQ SI_MESGQ SI_TIMER, /* Sent by timer expiration. */ # define SI_TIMER SI_TIMER SI_QUEUE, /* Sent by sigqueue. */ # define SI_QUEUE SI_QUEUE SI_USER, /* Sent by kill, sigsend, raise. */ # define SI_USER SI_USER SI_KERNEL = 0x80 /* Send by kernel. */ #define SI_KERNEL SI_KERNEL }; /* `si_code' values for SIGILL signal. */ enum { ILL_ILLOPC = 1, /* Illegal opcode. */ # define ILL_ILLOPC ILL_ILLOPC ILL_ILLOPN, /* Illegal operand. */ # define ILL_ILLOPN ILL_ILLOPN ILL_ILLADR, /* Illegal addressing mode. */ # define ILL_ILLADR ILL_ILLADR ILL_ILLTRP, /* Illegal trap. */ # define ILL_ILLTRP ILL_ILLTRP ILL_PRVOPC, /* Privileged opcode. */ # define ILL_PRVOPC ILL_PRVOPC ILL_PRVREG, /* Privileged register. */ # define ILL_PRVREG ILL_PRVREG ILL_COPROC, /* Coprocessor error. */ # define ILL_COPROC ILL_COPROC ILL_BADSTK /* Internal stack error. */ # define ILL_BADSTK ILL_BADSTK }; /* `si_code' values for SIGFPE signal. */ enum { FPE_INTDIV = 1, /* Integer divide by zero. */ # define FPE_INTDIV FPE_INTDIV FPE_INTOVF, /* Integer overflow. */ # define FPE_INTOVF FPE_INTOVF FPE_FLTDIV, /* Floating point divide by zero. */ # define FPE_FLTDIV FPE_FLTDIV FPE_FLTOVF, /* Floating point overflow. */ # define FPE_FLTOVF FPE_FLTOVF FPE_FLTUND, /* Floating point underflow. */ # define FPE_FLTUND FPE_FLTUND FPE_FLTRES, /* Floating point inexact result. */ # define FPE_FLTRES FPE_FLTRES FPE_FLTINV, /* Floating point invalid operation. */ # define FPE_FLTINV FPE_FLTINV FPE_FLTSUB /* Subscript out of range. */ # define FPE_FLTSUB FPE_FLTSUB }; /* `si_code' values for SIGSEGV signal. */ enum { SEGV_MAPERR = 1, /* Address not mapped to object. */ # define SEGV_MAPERR SEGV_MAPERR SEGV_ACCERR /* Invalid permissions for mapped object. */ # define SEGV_ACCERR SEGV_ACCERR }; /* `si_code' values for SIGBUS signal. */ enum { BUS_ADRALN = 1, /* Invalid address alignment. */ # define BUS_ADRALN BUS_ADRALN BUS_ADRERR, /* Non-existant physical address. */ # define BUS_ADRERR BUS_ADRERR BUS_OBJERR /* Object specific hardware error. */ # define BUS_OBJERR BUS_OBJERR }; /* `si_code' values for SIGTRAP signal. */ enum { TRAP_BRKPT = 1, /* Process breakpoint. */ # define TRAP_BRKPT TRAP_BRKPT TRAP_TRACE /* Process trace trap. */ # define TRAP_TRACE TRAP_TRACE }; /* `si_code' values for SIGCHLD signal. */ enum { CLD_EXITED = 1, /* Child has exited. */ # define CLD_EXITED CLD_EXITED CLD_KILLED, /* Child was killed. */ # define CLD_KILLED CLD_KILLED CLD_DUMPED, /* Child terminated abnormally. */ # define CLD_DUMPED CLD_DUMPED CLD_TRAPPED, /* Traced child has trapped. */ # define CLD_TRAPPED CLD_TRAPPED CLD_STOPPED, /* Child has stopped. */ # define CLD_STOPPED CLD_STOPPED CLD_CONTINUED /* Stopped child has continued. */ # define CLD_CONTINUED CLD_CONTINUED }; /* `si_code' values for SIGPOLL signal. */ enum { POLL_IN = 1, /* Data input available. */ # define POLL_IN POLL_IN POLL_OUT, /* Output buffers available. */ # define POLL_OUT POLL_OUT POLL_MSG, /* Input message available. */ # define POLL_MSG POLL_MSG POLL_ERR, /* I/O error. */ # define POLL_ERR POLL_ERR POLL_PRI, /* High priority input available. */ # define POLL_PRI POLL_PRI POLL_HUP /* Device disconnected. */ # define POLL_HUP POLL_HUP }; #define _NSIG_WORDS ((_NSIG/sizeof(long))>>3) typedef struct { unsigned long sig[_NSIG_WORDS]; } sigset_t; struct sigaction { #if defined(__alpha__) union { sighandler_t _sa_handler; void (*_sa_sigaction)(int, siginfo_t*, void*); } _u; sigset_t sa_mask; unsigned long sa_flags; #elif defined(__ia64__) || defined(__hppa__) union { sighandler_t _sa_handler; void (*_sa_sigaction)(int, siginfo_t*, void*); } _u; unsigned long sa_flags; sigset_t sa_mask; #elif defined(__mips__) unsigned long sa_flags; union { sighandler_t _sa_handler; void (*_sa_sigaction)(int, siginfo_t*, void*); } _u; sigset_t sa_mask; void (*sa_restorer)(void); int sa_resv[1]; #else /* arm, i386, ppc, s390, sparc, saprc64, x86_64 */ union { sighandler_t _sa_handler; void (*_sa_sigaction)(int, siginfo_t*, void*); } _u; unsigned long sa_flags; void (*sa_restorer)(void); sigset_t sa_mask; #endif }; #define sa_handler _u._sa_handler #define sa_sigaction _u._sa_sigaction typedef struct sigaltstack { #if defined(__mips__) void *ss_sp; size_t ss_size; int ss_flags; #else void *ss_sp; int ss_flags; size_t ss_size; #endif } stack_t; int sigaltstack(const struct sigaltstack *newstack, struct sigaltstack *oldstack) __THROW; int sigemptyset(sigset_t *set) __THROW; int sigfillset(sigset_t *set) __THROW; int sigaddset(sigset_t *set, int signum) __THROW; int sigdelset(sigset_t *set, int signum) __THROW; int sigismember(const sigset_t *set, int signo) __THROW; int sigsuspend(const sigset_t *mask) __THROW; int sigpending(sigset_t *set) __THROW; int sigprocmask(int how, const sigset_t *set, sigset_t *oldset) __THROW; sighandler_t signal(int signum, sighandler_t action); int raise (int sig) __THROW; int kill(pid_t pid, int sig) __THROW; int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) __THROW; int sigtimedwait(const sigset_t *mask, siginfo_t *info, const struct timespec *ts) __THROW; int sigqueueinfo(int pid, int sig, siginfo_t *info) __THROW; int siginterrupt(int sig, int flag) __THROW; int killpg(int pgrp, int sig) __THROW; /* 0 is OK ! kernel puts in MAX_THREAD_TIMEOUT :) */ #define sigwaitinfo(m, i) sigtimedwait((m),(i),0) extern const char *const sys_siglist[]; #endif