source: rtems/cpukit/posix/src/psignal.c @ 895efd9

4.104.114.84.95
Last change on this file since 895efd9 was 895efd9, checked in by Joel Sherrill <joel.sherrill@…>, on 06/07/96 at 13:54:23

key destructor is now run at correct point in pthread_exit() sequence and
should be correct for other apis as well.

missing page numbers added on some references.

initial attempt at sig_procmask() and pthread_sigmask().

  • Property mode set to 100644
File size: 5.8 KB
Line 
1/*
2 *  $Id$
3 */
4
5#include <assert.h>
6#include <errno.h>
7#include <signal.h>
8
9#include <rtems/system.h>
10#include <rtems/score/thread.h>
11#include <rtems/posix/seterr.h>
12#include <rtems/posix/threadsup.h>
13
14/*
15 *  Currently 32 signals numbered 1-32 are defined
16 */
17
18#define SIGNAL_EMPTY_MASK  0x00000000
19#define SIGNAL_ALL_MASK    0xffffffff
20
21#define signo_to_mask( _sig ) (1 << ((_sig) - 1))
22
23#define is_valid_signo( _sig ) \
24  ((signo_to_mask(_sig) & SIGNAL_ALL_MASK) != 0 )
25
26/*** PROCESS WIDE STUFF ****/
27
28sigset_t  _POSIX_signals_Blocked = SIGNAL_EMPTY_MASK;
29sigset_t  _POSIX_signals_Pending = SIGNAL_EMPTY_MASK;
30
31struct sigaction _POSIX_signals_Vectors[ SIGRTMAX ];
32
33/*PAGE
34 *
35 *  _POSIX_signals_Manager_Initialization
36 */
37
38void _POSIX_signals_Manager_Initialization( void )
39{
40  /* XXX install default actions for all vectors */
41}
42
43/*
44 *  3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
45 */
46
47int sigemptyset(
48  sigset_t   *set
49)
50{
51  if ( !set )
52    set_errno_and_return_minus_one( EFAULT );
53
54  *set = 0;
55  return 0;
56}
57
58/*
59 *  3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
60 */
61
62int sigfillset(
63  sigset_t   *set
64)
65{
66  if ( !set )
67    set_errno_and_return_minus_one( EFAULT );
68
69  *set = SIGNAL_ALL_MASK;
70  return 0;
71}
72
73/*
74 *  3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
75 */
76
77int sigaddset(
78  sigset_t   *set,
79  int         signo
80)
81{
82  if ( !set )
83    set_errno_and_return_minus_one( EFAULT );
84
85  if ( !is_valid_signo(signo) )
86    set_errno_and_return_minus_one( EINVAL );
87
88  *set |= signo_to_mask(signo);
89  return 0;
90}
91
92/*
93 *  3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
94 */
95
96int sigdelset(
97  sigset_t   *set,
98  int         signo
99)
100{
101  if ( !set )
102    set_errno_and_return_minus_one( EFAULT );
103 
104  if ( !is_valid_signo(signo) )
105    set_errno_and_return_minus_one( EINVAL );
106 
107  *set &= ~signo_to_mask(signo);
108  return 0;
109}
110
111/*
112 *  3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
113 */
114
115int sigismember(
116  const sigset_t   *set,
117  int               signo
118)
119{
120  if ( !set )
121    set_errno_and_return_minus_one( EFAULT );
122 
123  if ( !is_valid_signo(signo) )
124    set_errno_and_return_minus_one( EINVAL );
125 
126  if ( *set & signo_to_mask(signo) )
127    return 1;
128
129  return 0;
130}
131
132/*
133 *  3.3.4 Examine and Change Signal Action, P1003.1b-1993, p. 70
134 */
135
136int sigaction(
137  int                     sig,
138  const struct sigaction *act,
139  struct sigaction       *oact
140)
141{
142  if ( !act )
143    set_errno_and_return_minus_one( EFAULT );
144
145  if ( !is_valid_signo(sig) )
146    set_errno_and_return_minus_one( EINVAL );
147 
148  if ( oact )
149    *oact = _POSIX_signals_Vectors[ sig ];
150
151  /* XXX need to interpret some stuff here */
152
153  _POSIX_signals_Vectors[ sig ] = *act;
154
155  return POSIX_NOT_IMPLEMENTED();
156}
157
158/*
159 *  3.3.5 Examine and Change Blocked Signals, P1003.1b-1993, p. 73
160 *
161 *  NOTE: P1003.1c/D10, p. 37 adds pthread_sigmask().
162 *
163 */
164
165int sigprocmask(
166  int               how,
167  const sigset_t   *set,
168  sigset_t         *oset
169)
170{
171  /*
172   *  P1003.1c/Draft 10, p. 38 maps sigprocmask to pthread_sigmask.
173   */
174
175  return pthread_sigmask( how, set, oset );
176}
177
178/*
179 *  3.3.5 Examine and Change Blocked Signals, P1003.1b-1993, p. 73
180 *
181 *  NOTE: P1003.1c/D10, p. 37 adds pthread_sigmask().
182 */
183
184int pthread_sigmask(
185  int               how,
186  const sigset_t   *set,
187  sigset_t         *oset
188)
189{
190  POSIX_API_Control  *api;
191
192  if ( !set && !oset )
193    set_errno_and_return_minus_one( EFAULT );
194
195  api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
196
197  if ( oset )
198    *oset = api->signals_blocked;
199 
200  if ( !set )
201    set_errno_and_return_minus_one( EFAULT );
202
203  switch ( how ) {
204    case SIG_BLOCK:
205      api->signals_blocked |= *set;
206      break;
207    case SIG_UNBLOCK:
208      api->signals_blocked &= ~*set;
209      break;
210    case SIG_SETMASK:
211      api->signals_blocked = *set;
212      break;
213    default:
214      set_errno_and_return_minus_one( EINVAL );
215  }
216
217  /* XXX evaluate the new set */
218
219  return POSIX_NOT_IMPLEMENTED();
220}
221
222/*
223 *  3.3.6 Examine Pending Signals, P1003.1b-1993, p. 75
224 */
225
226int sigpending(
227  sigset_t  *set
228)
229{
230  return POSIX_NOT_IMPLEMENTED();
231}
232
233/*
234 *  3.3.7 Wait for a Signal, P1003.1b-1993, p. 75
235 */
236
237int sigsuspend(
238  const sigset_t  *sigmask
239)
240{
241  return POSIX_NOT_IMPLEMENTED();
242}
243
244/*
245 *  3.3.8 Synchronously Accept a Signal, P1003.1b-1993, p. 76
246 *
247 *  NOTE: P1003.1c/D10, p. 39 adds sigwait().
248 */
249
250int sigwaitinfo(
251  const sigset_t  *set,
252  siginfo_t       *info
253)
254{
255  return POSIX_NOT_IMPLEMENTED();
256}
257
258/*
259 *  3.3.8 Synchronously Accept a Signal, P1003.1b-1993, p. 76
260 *
261 *  NOTE: P1003.1c/D10, p. 39 adds sigwait().
262 */
263
264int sigtimedwait(
265  const sigset_t         *set,
266  siginfo_t              *info,
267  const struct timespec  *timeout
268)
269{
270  return POSIX_NOT_IMPLEMENTED();
271}
272
273/*
274 *  3.3.8 Synchronously Accept a Signal, P1003.1b-1993, p. 76
275 *
276 *  NOTE: P1003.1c/D10, p. 39 adds sigwait().
277 */
278
279int sigwait(
280  const sigset_t  *set,
281  int             *sig
282)
283{
284  return POSIX_NOT_IMPLEMENTED();
285}
286
287/*
288 *  3.3.9 Queue a Signal to a Process, P1003.1b-1993, p. 78
289 */
290
291int sigqueue(
292  pid_t               pid,
293  int                 signo,
294  const union sigval  value
295)
296{
297  return POSIX_NOT_IMPLEMENTED();
298}
299
300/*
301 *  3.3.2 Send a Signal to a Process, P1003.1b-1993, p. 68
302 *
303 *  NOTE: Behavior of kill() depends on _POSIX_SAVED_IDS.
304 */
305
306int kill(
307  pid_t pid,
308  int   sig
309)
310{
311  /*
312   *  Only supported for the "calling process" (i.e. this node).
313   */
314 
315  assert( pid == getpid() );
316
317  /* SIGABRT comes from abort via assert */
318  if ( sig == SIGABRT ) {
319    exit( 1 );
320  }
321  return POSIX_NOT_IMPLEMENTED();
322}
323
324/*
325 *  3.3.10 Send a Signal to a Thread, P1003.1c/D10, p. 43
326 */
327
328int pthread_kill(
329  pthread_t   thread,
330  int         sig
331)
332{
333  return POSIX_NOT_IMPLEMENTED();
334}
335
336/*
337 *  3.4.1 Schedule Alarm, P1003.1b-1993, p. 79
338 */
339
340unsigned int alarm(
341  unsigned int seconds
342)
343{
344  return POSIX_NOT_IMPLEMENTED();
345}
346
347/*
348 *  3.4.2 Suspend Process Execution, P1003.1b-1993, p. 81
349 */
350
351int pause( void )
352{
353  return POSIX_NOT_IMPLEMENTED();
354}
Note: See TracBrowser for help on using the repository browser.