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