* sysdeps/unix/sysv/linux/x86_64/bits/sigcontext.h (struct
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / sigaction.c
1 /* Copyright (C) 1992, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 #include <sysdep.h>
20 #include <errno.h>
21 #include <stddef.h>
22 #include <signal.h>
23
24
25 /* If ACT is not NULL, change the action for SIG to *ACT.
26    If OACT is not NULL, put the old action for SIG in *OACT.  */
27 int
28 __sigaction (sig, act, oact)
29      int sig;
30      const struct sigaction *act;
31      struct sigaction *oact;
32 {
33   sighandler_t handler;
34   int save;
35
36   if (sig <= 0 || sig >= NSIG)
37     {
38       __set_errno (EINVAL);
39       return -1;
40     }
41
42   if (act == NULL)
43     {
44       if (oact == NULL)
45         return 0;
46       /* Race condition, but this is the only way to do it.  */
47       handler = signal (sig, SIG_IGN);
48       if (handler == SIG_ERR)
49         return -1;
50       save = errno;
51       (void) signal (sig, handler);
52       __set_errno (save);
53     }
54   else
55     {
56       int i;
57
58       if (act->sa_flags != 0)
59         {
60         unimplemented:
61           __set_errno (ENOSYS);
62           return -1;
63         }
64
65       for (i = 1; i < NSIG; ++i)
66         if (__sigismember (&act->sa_mask, i))
67           goto unimplemented;
68
69       handler = signal (sig, act->sa_handler);
70       if (handler == SIG_ERR)
71         return -1;
72     }
73
74   if (oact != NULL)
75     {
76       oact->sa_handler = handler;
77       __sigemptyset (&oact->sa_mask);
78       oact->sa_flags = 0;
79     }
80
81   return 0;
82 }
83
84 weak_alias (__sigaction, sigaction)