1/* siginfo_t, sigevent and constants. Linux version. 2 Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, write to the Free 17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18 02111-1307 USA. */ 19 20#if !defined _SIGNAL_H && !defined __need_siginfo_t \ 21 && !defined __need_sigevent_t 22# error "Never include this file directly. Use <signal.h> instead" 23#endif 24 25#include <bits/wordsize.h> 26 27#if (!defined __have_sigval_t \ 28 && (defined _SIGNAL_H || defined __need_siginfo_t \ 29 || defined __need_sigevent_t)) 30# define __have_sigval_t 1 31 32/* Type for data associated with a signal. */ 33typedef union sigval 34 { 35 int sival_int; 36 void *sival_ptr; 37 } sigval_t; 38#endif 39 40#if (!defined __have_siginfo_t \ 41 && (defined _SIGNAL_H || defined __need_siginfo_t)) 42# define __have_siginfo_t 1 43 44# define __SI_MAX_SIZE 128 45# if __WORDSIZE == 64 46# define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 4) 47# else 48# define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 3) 49# endif 50 51typedef struct siginfo 52 { 53 int si_signo; /* Signal number. */ 54 int si_errno; /* If non-zero, an errno value associated with 55 this signal, as defined in <errno.h>. */ 56 int si_code; /* Signal code. */ 57 58 union 59 { 60 int _pad[__SI_PAD_SIZE]; 61 62 /* kill(). */ 63 struct 64 { 65 __pid_t si_pid; /* Sending process ID. */ 66 __uid_t si_uid; /* Real user ID of sending process. */ 67 } _kill; 68 69 /* POSIX.1b timers. */ 70 struct 71 { 72 int si_tid; /* Timer ID. */ 73 int si_overrun; /* Overrun count. */ 74 sigval_t si_sigval; /* Signal value. */ 75 } _timer; 76 77 /* POSIX.1b signals. */ 78 struct 79 { 80 __pid_t si_pid; /* Sending process ID. */ 81 __uid_t si_uid; /* Real user ID of sending process. */ 82 sigval_t si_sigval; /* Signal value. */ 83 } _rt; 84 85 /* SIGCHLD. */ 86 struct 87 { 88 __pid_t si_pid; /* Which child. */ 89 __uid_t si_uid; /* Real user ID of sending process. */ 90 int si_status; /* Exit value or signal. */ 91 __clock_t si_utime; 92 __clock_t si_stime; 93 } _sigchld; 94 95 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS. */ 96 struct 97 { 98 void *si_addr; /* Faulting insn/memory ref. */ 99 } _sigfault; 100 101 /* SIGPOLL. */ 102 struct 103 { 104 long int si_band; /* Band event for SIGPOLL. */ 105 int si_fd; 106 } _sigpoll; 107 } _sifields; 108 } siginfo_t; 109 110 111/* X/Open requires some more fields with fixed names. */ 112# define si_pid _sifields._kill.si_pid 113# define si_uid _sifields._kill.si_uid 114# define si_timerid _sifields._timer.si_tid 115# define si_overrun _sifields._timer.si_overrun 116# define si_status _sifields._sigchld.si_status 117# define si_utime _sifields._sigchld.si_utime 118# define si_stime _sifields._sigchld.si_stime 119# define si_value _sifields._rt.si_sigval 120# define si_int _sifields._rt.si_sigval.sival_int 121# define si_ptr _sifields._rt.si_sigval.sival_ptr 122# define si_addr _sifields._sigfault.si_addr 123# define si_band _sifields._sigpoll.si_band 124# define si_fd _sifields._sigpoll.si_fd 125 126 127/* Values for `si_code'. Positive values are reserved for kernel-generated 128 signals. */ 129enum 130{ 131 SI_ASYNCNL = -60, /* Sent by asynch name lookup completion. */ 132# define SI_ASYNCNL SI_ASYNCNL 133 SI_TKILL = -6, /* Sent by tkill. */ 134# define SI_TKILL SI_TKILL 135 SI_SIGIO, /* Sent by queued SIGIO. */ 136# define SI_SIGIO SI_SIGIO 137 SI_ASYNCIO, /* Sent by AIO completion. */ 138# define SI_ASYNCIO SI_ASYNCIO 139 SI_MESGQ, /* Sent by real time mesq state change. */ 140# define SI_MESGQ SI_MESGQ 141 SI_TIMER, /* Sent by timer expiration. */ 142# define SI_TIMER SI_TIMER 143 SI_QUEUE, /* Sent by sigqueue. */ 144# define SI_QUEUE SI_QUEUE 145 SI_USER, /* Sent by kill, sigsend, raise. */ 146# define SI_USER SI_USER 147 SI_KERNEL = 0x80 /* Send by kernel. */ 148#define SI_KERNEL SI_KERNEL 149}; 150 151 152/* `si_code' values for SIGILL signal. */ 153enum 154{ 155 ILL_ILLOPC = 1, /* Illegal opcode. */ 156# define ILL_ILLOPC ILL_ILLOPC 157 ILL_ILLOPN, /* Illegal operand. */ 158# define ILL_ILLOPN ILL_ILLOPN 159 ILL_ILLADR, /* Illegal addressing mode. */ 160# define ILL_ILLADR ILL_ILLADR 161 ILL_ILLTRP, /* Illegal trap. */ 162# define ILL_ILLTRP ILL_ILLTRP 163 ILL_PRVOPC, /* Privileged opcode. */ 164# define ILL_PRVOPC ILL_PRVOPC 165 ILL_PRVREG, /* Privileged register. */ 166# define ILL_PRVREG ILL_PRVREG 167 ILL_COPROC, /* Coprocessor error. */ 168# define ILL_COPROC ILL_COPROC 169 ILL_BADSTK /* Internal stack error. */ 170# define ILL_BADSTK ILL_BADSTK 171}; 172 173/* `si_code' values for SIGFPE signal. */ 174enum 175{ 176 FPE_INTDIV = 1, /* Integer divide by zero. */ 177# define FPE_INTDIV FPE_INTDIV 178 FPE_INTOVF, /* Integer overflow. */ 179# define FPE_INTOVF FPE_INTOVF 180 FPE_FLTDIV, /* Floating point divide by zero. */ 181# define FPE_FLTDIV FPE_FLTDIV 182 FPE_FLTOVF, /* Floating point overflow. */ 183# define FPE_FLTOVF FPE_FLTOVF 184 FPE_FLTUND, /* Floating point underflow. */ 185# define FPE_FLTUND FPE_FLTUND 186 FPE_FLTRES, /* Floating point inexact result. */ 187# define FPE_FLTRES FPE_FLTRES 188 FPE_FLTINV, /* Floating point invalid operation. */ 189# define FPE_FLTINV FPE_FLTINV 190 FPE_FLTSUB /* Subscript out of range. */ 191# define FPE_FLTSUB FPE_FLTSUB 192}; 193 194/* `si_code' values for SIGSEGV signal. */ 195enum 196{ 197 SEGV_MAPERR = 1, /* Address not mapped to object. */ 198# define SEGV_MAPERR SEGV_MAPERR 199 SEGV_ACCERR /* Invalid permissions for mapped object. */ 200# define SEGV_ACCERR SEGV_ACCERR 201}; 202 203/* `si_code' values for SIGBUS signal. */ 204enum 205{ 206 BUS_ADRALN = 1, /* Invalid address alignment. */ 207# define BUS_ADRALN BUS_ADRALN 208 BUS_ADRERR, /* Non-existant physical address. */ 209# define BUS_ADRERR BUS_ADRERR 210 BUS_OBJERR /* Object specific hardware error. */ 211# define BUS_OBJERR BUS_OBJERR 212}; 213 214/* `si_code' values for SIGTRAP signal. */ 215enum 216{ 217 TRAP_BRKPT = 1, /* Process breakpoint. */ 218# define TRAP_BRKPT TRAP_BRKPT 219 TRAP_TRACE /* Process trace trap. */ 220# define TRAP_TRACE TRAP_TRACE 221}; 222 223/* `si_code' values for SIGCHLD signal. */ 224enum 225{ 226 CLD_EXITED = 1, /* Child has exited. */ 227# define CLD_EXITED CLD_EXITED 228 CLD_KILLED, /* Child was killed. */ 229# define CLD_KILLED CLD_KILLED 230 CLD_DUMPED, /* Child terminated abnormally. */ 231# define CLD_DUMPED CLD_DUMPED 232 CLD_TRAPPED, /* Traced child has trapped. */ 233# define CLD_TRAPPED CLD_TRAPPED 234 CLD_STOPPED, /* Child has stopped. */ 235# define CLD_STOPPED CLD_STOPPED 236 CLD_CONTINUED /* Stopped child has continued. */ 237# define CLD_CONTINUED CLD_CONTINUED 238}; 239 240/* `si_code' values for SIGPOLL signal. */ 241enum 242{ 243 POLL_IN = 1, /* Data input available. */ 244# define POLL_IN POLL_IN 245 POLL_OUT, /* Output buffers available. */ 246# define POLL_OUT POLL_OUT 247 POLL_MSG, /* Input message available. */ 248# define POLL_MSG POLL_MSG 249 POLL_ERR, /* I/O error. */ 250# define POLL_ERR POLL_ERR 251 POLL_PRI, /* High priority input available. */ 252# define POLL_PRI POLL_PRI 253 POLL_HUP /* Device disconnected. */ 254# define POLL_HUP POLL_HUP 255}; 256 257# undef __need_siginfo_t 258#endif /* !have siginfo_t && (have _SIGNAL_H || need siginfo_t). */ 259 260 261#if (defined _SIGNAL_H || defined __need_sigevent_t) \ 262 && !defined __have_sigevent_t 263# define __have_sigevent_t 1 264 265/* Structure to transport application-defined values with signals. */ 266# define __SIGEV_MAX_SIZE 64 267# if __WORDSIZE == 64 268# define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 4) 269# else 270# define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 3) 271# endif 272 273typedef struct sigevent 274 { 275 sigval_t sigev_value; 276 int sigev_signo; 277 int sigev_notify; 278 279 union 280 { 281 int _pad[__SIGEV_PAD_SIZE]; 282 283 /* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the 284 thread to receive the signal. */ 285 __pid_t _tid; 286 287 struct 288 { 289 void (*_function) (sigval_t); /* Function to start. */ 290 void *_attribute; /* Really pthread_attr_t. */ 291 } _sigev_thread; 292 } _sigev_un; 293 } sigevent_t; 294 295/* POSIX names to access some of the members. */ 296# define sigev_notify_function _sigev_un._sigev_thread._function 297# define sigev_notify_attributes _sigev_un._sigev_thread._attribute 298 299/* `sigev_notify' values. */ 300enum 301{ 302 SIGEV_SIGNAL = 0, /* Notify via signal. */ 303# define SIGEV_SIGNAL SIGEV_SIGNAL 304 SIGEV_NONE, /* Other notification: meaningless. */ 305# define SIGEV_NONE SIGEV_NONE 306 SIGEV_THREAD, /* Deliver via thread creation. */ 307# define SIGEV_THREAD SIGEV_THREAD 308 309 SIGEV_THREAD_ID = 4 /* Send signal to specific thread. */ 310#define SIGEV_THREAD_ID SIGEV_THREAD_ID 311}; 312 313#endif /* have _SIGNAL_H. */ 314