| #ifndef __siginfo_t_defined |
| #define __siginfo_t_defined 1 |
| |
| #include <bits/wordsize.h> |
| #include <bits/types.h> |
| #include <bits/types/__sigval_t.h> |
| |
| #define __SI_MAX_SIZE 128 |
| #if __WORDSIZE == 64 |
| # define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 4) |
| #else |
| # define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 3) |
| #endif |
| |
| /* Some fields of siginfo_t have architecture-specific variations. */ |
| #include <bits/siginfo-arch.h> |
| #ifndef __SI_ALIGNMENT |
| # define __SI_ALIGNMENT /* nothing */ |
| #endif |
| #ifndef __SI_BAND_TYPE |
| # define __SI_BAND_TYPE long int |
| #endif |
| #ifndef __SI_CLOCK_T |
| # define __SI_CLOCK_T __clock_t |
| #endif |
| #ifndef __SI_ERRNO_THEN_CODE |
| # define __SI_ERRNO_THEN_CODE 1 |
| #endif |
| #ifndef __SI_HAVE_SIGSYS |
| # define __SI_HAVE_SIGSYS 1 |
| #endif |
| #ifndef __SI_SIGFAULT_ADDL |
| # define __SI_SIGFAULT_ADDL /* nothing */ |
| #endif |
| |
| typedef struct |
| { |
| int si_signo; /* Signal number. */ |
| #if __SI_ERRNO_THEN_CODE |
| int si_errno; /* If non-zero, an errno value associated with |
| this signal, as defined in <errno.h>. */ |
| int si_code; /* Signal code. */ |
| #else |
| int si_code; |
| int si_errno; |
| #endif |
| #if __WORDSIZE == 64 |
| int __pad0; /* Explicit padding. */ |
| #endif |
| |
| union |
| { |
| int _pad[__SI_PAD_SIZE]; |
| |
| /* kill(). */ |
| struct |
| { |
| __pid_t si_pid; /* Sending process ID. */ |
| __uid_t si_uid; /* Real user ID of sending process. */ |
| } _kill; |
| |
| /* POSIX.1b timers. */ |
| struct |
| { |
| int si_tid; /* Timer ID. */ |
| int si_overrun; /* Overrun count. */ |
| __sigval_t si_sigval; /* Signal value. */ |
| } _timer; |
| |
| /* POSIX.1b signals. */ |
| struct |
| { |
| __pid_t si_pid; /* Sending process ID. */ |
| __uid_t si_uid; /* Real user ID of sending process. */ |
| __sigval_t si_sigval; /* Signal value. */ |
| } _rt; |
| |
| /* SIGCHLD. */ |
| struct |
| { |
| __pid_t si_pid; /* Which child. */ |
| __uid_t si_uid; /* Real user ID of sending process. */ |
| int si_status; /* Exit value or signal. */ |
| __SI_CLOCK_T si_utime; |
| __SI_CLOCK_T si_stime; |
| } _sigchld; |
| |
| /* SIGILL, SIGFPE, SIGSEGV, SIGBUS. */ |
| struct |
| { |
| void *si_addr; /* Faulting insn/memory ref. */ |
| __SI_SIGFAULT_ADDL |
| short int si_addr_lsb; /* Valid LSB of the reported address. */ |
| union |
| { |
| /* used when si_code=SEGV_BNDERR */ |
| struct |
| { |
| void *_lower; |
| void *_upper; |
| } _addr_bnd; |
| /* used when si_code=SEGV_PKUERR */ |
| __uint32_t _pkey; |
| } _bounds; |
| } _sigfault; |
| |
| /* SIGPOLL. */ |
| struct |
| { |
| __SI_BAND_TYPE si_band; /* Band event for SIGPOLL. */ |
| int si_fd; |
| } _sigpoll; |
| |
| /* SIGSYS. */ |
| #if __SI_HAVE_SIGSYS |
| struct |
| { |
| void *_call_addr; /* Calling user insn. */ |
| int _syscall; /* Triggering system call number. */ |
| unsigned int _arch; /* AUDIT_ARCH_* of syscall. */ |
| } _sigsys; |
| #endif |
| } _sifields; |
| } siginfo_t __SI_ALIGNMENT; |
| |
| |
| /* X/Open requires some more fields with fixed names. */ |
| #define si_pid _sifields._kill.si_pid |
| #define si_uid _sifields._kill.si_uid |
| #define si_timerid _sifields._timer.si_tid |
| #define si_overrun _sifields._timer.si_overrun |
| #define si_status _sifields._sigchld.si_status |
| #define si_utime _sifields._sigchld.si_utime |
| #define si_stime _sifields._sigchld.si_stime |
| #define si_value _sifields._rt.si_sigval |
| #define si_int _sifields._rt.si_sigval.sival_int |
| #define si_ptr _sifields._rt.si_sigval.sival_ptr |
| #define si_addr _sifields._sigfault.si_addr |
| #define si_addr_lsb _sifields._sigfault.si_addr_lsb |
| #define si_lower _sifields._sigfault._bounds._addr_bnd._lower |
| #define si_upper _sifields._sigfault._bounds._addr_bnd._upper |
| #define si_pkey _sifields._sigfault._bounds._pkey |
| #define si_band _sifields._sigpoll.si_band |
| #define si_fd _sifields._sigpoll.si_fd |
| #if __SI_HAVE_SIGSYS |
| # define si_call_addr _sifields._sigsys._call_addr |
| # define si_syscall _sifields._sigsys._syscall |
| # define si_arch _sifields._sigsys._arch |
| #endif |
| |
| #endif |