Lots of changes
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / solaris2 / kopensolaris-gnu / bits / siginfo.h
1 /* siginfo_t, sigevent and constants.  OpenSolaris version.
2    Copyright (C) 1997-2002, 2003, 2008 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 #include <stdint.h>
27 #define __need_timespec
28 #include <time.h>
29 #include <features.h>
30
31 #if (!defined __have_sigval_t \
32      && (defined _SIGNAL_H || defined __need_siginfo_t \
33          || defined __need_sigevent_t))
34 # define __have_sigval_t        1
35
36 /* Type for data associated with a signal.  */
37 union sigval
38 {
39     int sival_int;
40     void *sival_ptr;
41 };
42 typedef union sigval sigval_t;
43
44 # ifdef _SYSCALL32
45
46 # include <sys/types32.h>
47
48 union sigval32
49   {
50         __int32_t sival_int;
51         caddr32_t sival_ptr;
52   };
53
54 # endif
55
56 #endif
57
58 #if (!defined __have_siginfo_t \
59      && (defined _SIGNAL_H || defined __need_siginfo_t))
60 # define __have_siginfo_t       1
61
62 # if __WORDSIZE == 64
63 # define __SI_MAX_SIZE     256
64 # define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 4)
65 # else
66 # define __SI_MAX_SIZE     128
67 # define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 3)
68 # endif
69 #define SI_MAXSZ           __SI_MAX_SIZE
70 #define SI_PAD             __SI_PAD_SIZE
71
72 typedef struct siginfo
73 {
74     int si_signo;
75     int si_code;
76     int si_errno;
77 #if __WORDSIZE == 64
78     int si_pad;
79 #endif
80     union
81     {
82         int _pad[__SI_PAD_SIZE];
83
84         struct /* kill(), SIGCLD, siqqueue() */
85         {
86             __pid_t __pid;      /* Sending process ID.  */
87             union {
88                 struct {
89                     __uid_t __uid;      /* Real user ID of sending process.  */
90                     union sigval  __value;
91                 } __kill;
92                 struct {
93                     __clock_t __utime;
94                     int __status;
95                     __clock_t __stime;
96                 } __cld;
97             } __pdata;
98             ctid_t __ctid;
99             zoneid_t __zoneid;
100         } __proc;
101
102         struct /* SIGSEGV, SIGBUS, SIGILL, SIGTRAP, SIGFPE */
103         {
104             void  *__addr;
105             int __trapno;
106             char *__pc;
107         } __fault;
108
109         struct /* SIGPOLL, SIGXFSZ */
110         {
111             int __fd;
112             long  __band;
113         } __file;
114
115         struct /* SIGPROF */
116         {
117             char *__faddr;
118             struct timespec __tstamp;
119             short __syscall;
120             char  __nsysarg;
121             char  __fault;
122             long  __sysarg[8];
123             int __mstate[10];
124         } __prof;
125
126         struct /* SI_RCTL */
127         {
128             int32_t __entity;
129         } __rctl;
130     } __data;
131 } siginfo_t;
132
133 #ifdef __USE_MISC
134
135 typedef struct k_siginfo
136 {
137         int si_signo;
138         int si_code;
139         int si_errno;
140 # if __WORDSIZE == 64
141         int si_pad;
142 # endif
143         union
144           {
145                 struct
146                   {
147                         pid_t __pid;
148                         union
149                           {
150                                 struct
151                                   {
152                                         uid_t __uid;
153                     union sigval __value;
154                                   } __kill;
155                 struct
156                                   {
157                                         __clock_t __utime;
158                                         int __status;
159                                         __clock_t __stime;
160                                   } __cld;
161                           } __pdata;
162                         ctid_t __ctid;
163                         zoneid_t __zoneid;
164                   } __proc;
165
166                 struct
167                   {
168                         void *__addr;
169                         int __trapno;
170             char *__pc;
171                   } __fault;
172
173                 struct
174                   {
175                         int __fd;
176                         long __band;
177                   } __file;
178
179                 struct
180                   {
181                         char *__faddr;
182
183             struct timespec __tstamp;
184             short __syscall;
185             char __nsysarg;
186             char __fault;
187                   } __prof;
188
189                 struct
190                   {
191                         int32_t __entity;
192                   } __rctl;
193           } __data;
194   } k_siginfo_t;
195
196 typedef struct sigqueue
197   {
198         struct sigqueue *sq_next;
199         k_siginfo_t sq_info;
200         void (*sq_func)(struct sigqueue *);
201         void *sq_backptr;
202         int sq_external;
203   } sigqueue_t;
204
205 #endif /* __USE_MISC */
206
207 #define SI_FROMUSER(sip)  ((sip)->si_code <= 0)
208 #define SI_FROMKERNEL(sip)  ((sip)->si_code > 0)
209
210 /* Values for `si_code'.  Positive values are reserved for kernel-generated
211    signals.  */
212 enum
213 {
214     SI_NOINFO = 32767, /* no signal information */
215 #define SI_NOINFO SI_NOINFO
216     SI_DTRACE = 2050, /* kernel generated signal via DTrace action */
217 #define SI_DTRACE SI_DTRACE
218     SI_RCTL = 2049, /* kernel generated signal via rctl action */
219 #define SI_RCTL SI_RCTL
220     SI_USER = 0, /* user generated signal via kill() */
221 #define SI_USER SI_USER
222     SI_LWP = -1, /* user generated signal via lwp_kill() */
223 #define SI_LWP SI_LWP
224     SI_QUEUE = -2, /* user generated signal via sigqueue() */
225 #define SI_QUEUE SI_QUEUE
226     SI_TIMER = -3, /* from timer expiration */
227 #define SI_TIMER SI_TIMER
228     SI_ASYNCIO = -4, /* from asynchronous I/O completion */
229 #define SI_ASYNCIO SI_ASYNCIO
230     SI_MESGQ = -5 /* from message arrival */
231 };
232
233 /* `si_code' values for SIGTRAP signal.  */
234 #define TRAP_BRKPT  1 /* breakpoint trap */
235 #define TRAP_TRACE  2 /* trace trap */
236 #define TRAP_RWATCH 3 /* read access watchpoint trap */
237 #define TRAP_WWATCH 4 /* write access watchpoint trap */
238 #define TRAP_XWATCH 5 /* execute access watchpoint trap */
239 #define TRAP_DTRACE 6 /* problem with fasttrap DTrace provider */
240 #define NSIGTRAP  6
241
242 /* `si_code' values for SIGCHLD signal.  */
243 #define CLD_EXITED  1 /* child has exited */
244 #define CLD_KILLED  2 /* child was killed */
245 #define CLD_DUMPED  3 /* child has coredumped */
246 #define CLD_TRAPPED 4 /* traced child has stopped */
247 #define CLD_STOPPED 5 /* child has stopped on signal */
248 #define CLD_CONTINUED 6 /* stopped child has continued */
249 #define NSIGCLD   6
250
251 /* `si_code' values for SIGPOLL signal.  */
252 #define POLL_IN   1 /* input available */
253 #define POLL_OUT  2 /* output possible */
254 #define POLL_MSG  3 /* message available */
255 #define POLL_ERR  4 /* I/O error */
256 #define POLL_PRI  5 /* high priority input available */
257 #define POLL_HUP  6 /* device disconnected */
258 #define NSIGPOLL  6
259
260 /* SIGPROF signal codes */
261 #define PROF_SIG  1 /* have to set code non-zero */
262 #define NSIGPROF  1
263
264 /* X/Open requires some more fields with fixed names.  */
265 #define si_pid    __data.__proc.__pid
266 #define si_ctid   __data.__proc.__ctid
267 #define si_zoneid __data.__proc.__zoneid
268 #define si_status __data.__proc.__pdata.__cld.__status
269 #define si_stime  __data.__proc.__pdata.__cld.__stime
270 #define si_utime  __data.__proc.__pdata.__cld.__utime
271 #define si_uid    __data.__proc.__pdata.__kill.__uid
272 #define si_value  __data.__proc.__pdata.__kill.__value
273 #define si_addr   __data.__fault.__addr
274 #define si_trapno __data.__fault.__trapno
275 #define si_trapafter  __data.__fault.__trapno
276 #define si_pc   __data.__fault.__pc
277 #define si_fd   __data.__file.__fd
278 #define si_band   __data.__file.__band
279 #define si_tstamp __data.__prof.__tstamp
280 #define si_syscall  __data.__prof.__syscall
281 #define si_nsysarg  __data.__prof.__nsysarg
282 #define si_sysarg __data.__prof.__sysarg
283 #define si_fault  __data.__prof.__fault
284 #define si_faddr  __data.__prof.__faddr
285 #define si_mstate __data.__prof.__mstate
286 #define si_entity __data.__rctl.__entity
287
288 # undef __need_siginfo_t
289 #endif  /* !have siginfo_t && (have _SIGNAL_H || need siginfo_t).  */
290
291 #if (defined _SIGNAL_H || defined __need_sigevent_t) \
292     && !defined __have_sigevent_t
293 # define __have_sigevent_t      1
294
295 /* Structure to transport application-defined values with signals.  */
296 # define __SIGEV_MAX_SIZE       64
297 # if __WORDSIZE == 64
298 #  define __SIGEV_PAD_SIZE      ((__SIGEV_MAX_SIZE / sizeof (int)) - 4)
299 # else
300 #  define __SIGEV_PAD_SIZE      ((__SIGEV_MAX_SIZE / sizeof (int)) - 3)
301 # endif
302
303 typedef struct sigevent
304 {
305     int sigev_notify;
306     int sigev_signo;
307     union sigval sigev_value;
308     void (*sigev_notify_function)(union sigval);
309     /*pthread_attr_t*/ void *sigev_notify_attributes;
310     int  __sigev_pad2;
311 } sigevent_t;
312
313 #ifdef _SYSCALL32
314
315 #include <sys/types32.h>
316
317 struct sigevent32
318   {
319         __int32_t sigev_notify;
320         __int32_t sigev_signo;
321         union sigval32 sigev_value;
322         caddr32_t sigev_notify_function;
323         caddr32_t sigev_notify_attributes;
324         __int32_t __sigev_pad2;
325 };
326
327 #endif
328
329 /* `sigev_notify' values.  */
330 enum
331 {
332   SIGEV_NONE = 1, /* no notification */
333 # define SIGEV_NONE     SIGEV_NONE
334   SIGEV_SIGNAL = 2, /* queued signal notification */
335 # define SIGEV_SIGNAL   SIGEV_SIGNAL
336   SIGEV_THREAD = 3, /* call back from another thread */
337 #define SIGEV_PORT SIGEV_PORT
338   SIGEV_PORT = 4 /* use event port for notification */
339 #define SIGEV_PORT SIGEV_PORT
340 };
341
342 #endif  /* have _SIGNAL_H.  */