f4fd03fceab979edd12d7f988ace6f72b4d5aad6
[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
30 #if (!defined __have_sigval_t \
31      && (defined _SIGNAL_H || defined __need_siginfo_t \
32          || defined __need_sigevent_t))
33 # define __have_sigval_t        1
34
35 /* Type for data associated with a signal.  */
36 union sigval
37 {
38     int sival_int;
39     void *sival_ptr;
40 };
41 typedef union sigval sigval_t;
42 #endif
43
44 #if (!defined __have_siginfo_t \
45      && (defined _SIGNAL_H || defined __need_siginfo_t))
46 # define __have_siginfo_t       1
47
48 # if __WORDSIZE == 64
49 # define __SI_MAX_SIZE     256
50 # define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 4)
51 # else
52 # define __SI_MAX_SIZE     128
53 # define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 3)
54 # endif
55 #define SI_MAXSZ           __SI_MAX_SIZE
56 #define SI_PAD             __SI_PAD_SIZE
57
58 typedef struct siginfo
59 {
60     int si_signo;
61     int si_code;
62     int si_errno;
63 #if __WORDSIZE == 64
64     int si_pad;
65 #endif
66     union
67     {
68         int _pad[__SI_PAD_SIZE];
69
70         struct /* kill(), SIGCLD, siqqueue() */
71         {
72             __pid_t __pid;      /* Sending process ID.  */
73             union {
74                 struct {
75                     __uid_t __uid;      /* Real user ID of sending process.  */
76                     union sigval  __value;
77                 } __kill;
78                 struct {
79                     __clock_t __utime;
80                     int __status;
81                     __clock_t __stime;
82                 } __cld;
83             } __pdata;
84             ctid_t __ctid;
85             zoneid_t __zoneid;
86         } __proc;
87
88         struct /* SIGSEGV, SIGBUS, SIGILL, SIGTRAP, SIGFPE */
89         {
90             void  *__addr;
91             int __trapno;
92             char *__pc;
93         } __fault;
94
95         struct /* SIGPOLL, SIGXFSZ */
96         {
97             int __fd;
98             long  __band;
99         } __file;
100
101         struct /* SIGPROF */
102         {
103             char *__faddr;
104             struct timespec __tstamp;
105             short __syscall;
106             char  __nsysarg;
107             char  __fault;
108             long  __sysarg[8];
109             int __mstate[10];
110         } __prof;
111
112         struct /* SI_RCTL */
113         {
114             int32_t __entity;
115         } __rctl;
116     } __data;
117 } siginfo_t;
118
119 #define SI_FROMUSER(sip)  ((sip)->si_code <= 0)
120 #define SI_FROMKERNEL(sip)  ((sip)->si_code > 0)
121
122 /* Values for `si_code'.  Positive values are reserved for kernel-generated
123    signals.  */
124 enum
125 {
126     SI_NOINFO = 32767, /* no signal information */
127 #define SI_NOINFO SI_NOINFO
128     SI_DTRACE = 2050, /* kernel generated signal via DTrace action */
129 #define SI_DTRACE SI_DTRACE
130     SI_RCTL = 2049, /* kernel generated signal via rctl action */
131 #define SI_RCTL SI_RCTL
132     SI_USER = 0, /* user generated signal via kill() */
133 #define SI_USER SI_USER
134     SI_LWP = -1, /* user generated signal via lwp_kill() */
135 #define SI_LWP SI_LWP
136     SI_QUEUE = -2, /* user generated signal via sigqueue() */
137 #define SI_QUEUE SI_QUEUE
138     SI_TIMER = -3, /* from timer expiration */
139 #define SI_TIMER SI_TIMER
140     SI_ASYNCIO = -4, /* from asynchronous I/O completion */
141 #define SI_ASYNCIO SI_ASYNCIO
142     SI_MESGQ = -5 /* from message arrival */
143 };
144
145 /* `si_code' values for SIGTRAP signal.  */
146 #define TRAP_BRKPT  1 /* breakpoint trap */
147 #define TRAP_TRACE  2 /* trace trap */
148 #define TRAP_RWATCH 3 /* read access watchpoint trap */
149 #define TRAP_WWATCH 4 /* write access watchpoint trap */
150 #define TRAP_XWATCH 5 /* execute access watchpoint trap */
151 #define TRAP_DTRACE 6 /* problem with fasttrap DTrace provider */
152 #define NSIGTRAP  6
153
154 /* `si_code' values for SIGCHLD signal.  */
155 #define CLD_EXITED  1 /* child has exited */
156 #define CLD_KILLED  2 /* child was killed */
157 #define CLD_DUMPED  3 /* child has coredumped */
158 #define CLD_TRAPPED 4 /* traced child has stopped */
159 #define CLD_STOPPED 5 /* child has stopped on signal */
160 #define CLD_CONTINUED 6 /* stopped child has continued */
161 #define NSIGCLD   6
162
163 /* `si_code' values for SIGPOLL signal.  */
164 #define POLL_IN   1 /* input available */
165 #define POLL_OUT  2 /* output possible */
166 #define POLL_MSG  3 /* message available */
167 #define POLL_ERR  4 /* I/O error */
168 #define POLL_PRI  5 /* high priority input available */
169 #define POLL_HUP  6 /* device disconnected */
170 #define NSIGPOLL  6
171
172 /* SIGPROF signal codes */
173 #define PROF_SIG  1 /* have to set code non-zero */
174 #define NSIGPROF  1
175
176 /* X/Open requires some more fields with fixed names.  */
177 #define si_pid    __data.__proc.__pid
178 #define si_ctid   __data.__proc.__ctid
179 #define si_zoneid __data.__proc.__zoneid
180 #define si_status __data.__proc.__pdata.__cld.__status
181 #define si_stime  __data.__proc.__pdata.__cld.__stime
182 #define si_utime  __data.__proc.__pdata.__cld.__utime
183 #define si_uid    __data.__proc.__pdata.__kill.__uid
184 #define si_value  __data.__proc.__pdata.__kill.__value
185 #define si_addr   __data.__fault.__addr
186 #define si_trapno __data.__fault.__trapno
187 #define si_trapafter  __data.__fault.__trapno
188 #define si_pc   __data.__fault.__pc
189 #define si_fd   __data.__file.__fd
190 #define si_band   __data.__file.__band
191 #define si_tstamp __data.__prof.__tstamp
192 #define si_syscall  __data.__prof.__syscall
193 #define si_nsysarg  __data.__prof.__nsysarg
194 #define si_sysarg __data.__prof.__sysarg
195 #define si_fault  __data.__prof.__fault
196 #define si_faddr  __data.__prof.__faddr
197 #define si_mstate __data.__prof.__mstate
198 #define si_entity __data.__rctl.__entity
199
200 # undef __need_siginfo_t
201 #endif  /* !have siginfo_t && (have _SIGNAL_H || need siginfo_t).  */
202
203 #if (defined _SIGNAL_H || defined __need_sigevent_t) \
204     && !defined __have_sigevent_t
205 # define __have_sigevent_t      1
206
207 /* Structure to transport application-defined values with signals.  */
208 # define __SIGEV_MAX_SIZE       64
209 # if __WORDSIZE == 64
210 #  define __SIGEV_PAD_SIZE      ((__SIGEV_MAX_SIZE / sizeof (int)) - 4)
211 # else
212 #  define __SIGEV_PAD_SIZE      ((__SIGEV_MAX_SIZE / sizeof (int)) - 3)
213 # endif
214
215 typedef struct sigevent
216 {
217     int sigev_notify;
218     int sigev_signo;
219     union sigval sigev_value;
220     void (*sigev_notify_function)(union sigval);
221     /*pthread_attr_t*/ void *sigev_notify_attributes;
222     int  __sigev_pad2;
223 } sigevent_t;
224
225 /* `sigev_notify' values.  */
226 enum
227 {
228   SIGEV_NONE = 1, /* no notification */
229 # define SIGEV_NONE     SIGEV_NONE
230   SIGEV_SIGNAL = 2, /* queued signal notification */
231 # define SIGEV_SIGNAL   SIGEV_SIGNAL
232   SIGEV_THREAD = 3, /* call back from another thread */
233 #define SIGEV_PORT SIGEV_PORT
234   SIGEV_PORT = 4 /* use event port for notification */
235 #define SIGEV_PORT SIGEV_PORT
236 };
237
238 #endif  /* have _SIGNAL_H.  */