]>
Commit | Line | Data |
---|---|---|
350eb336 | 1 | /* Emulate sigstack function using sigaltstack. |
b168057a | 2 | Copyright (C) 1998-2015 Free Software Foundation, Inc. |
dfab448b UD |
3 | This file is part of the GNU C Library. |
4 | Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. | |
5 | ||
6 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
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. | |
dfab448b UD |
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 | |
41bdb6e2 | 14 | Lesser General Public License for more details. |
dfab448b | 15 | |
41bdb6e2 | 16 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
17 | License along with the GNU C Library; if not, see |
18 | <http://www.gnu.org/licenses/>. */ | |
dfab448b UD |
19 | |
20 | #include <signal.h> | |
c3966b88 | 21 | #include <stddef.h> |
899d423e | 22 | #include <sys/syscall.h> |
dfab448b UD |
23 | |
24 | ||
899d423e | 25 | #ifdef __NR_sigaltstack |
dfab448b UD |
26 | int |
27 | sigstack (ss, oss) | |
8ce9ea0c | 28 | struct sigstack *ss; |
dfab448b UD |
29 | struct sigstack *oss; |
30 | { | |
31 | stack_t sas; | |
32 | stack_t *sasp = NULL; | |
33 | stack_t osas; | |
34 | stack_t *osasp = oss == NULL ? NULL : &osas; | |
35 | int result; | |
36 | ||
37 | if (ss != NULL) | |
38 | { | |
39 | /* We have to convert the information. */ | |
40 | sas.ss_sp = ss->ss_sp; | |
41 | sas.ss_flags = ss->ss_onstack ? SS_ONSTACK : 0; | |
42 | ||
43 | /* For the size of the stack we have no value we can pass to the | |
44 | kernel. This is why this function should not be used. We simply | |
45 | assume that all the memory down to address zero (in case the stack | |
46 | grows down) is available. */ | |
47 | sas.ss_size = ss->ss_sp - NULL; | |
48 | ||
49 | sasp = &sas; | |
50 | } | |
51 | ||
52 | /* Call the kernel. */ | |
53 | result = __sigaltstack (sasp, osasp); | |
54 | ||
55 | /* Convert the result, if wanted and possible. */ | |
56 | if (result == 0 && oss != NULL) | |
57 | { | |
58 | oss->ss_sp = osas.ss_sp; | |
59 | oss->ss_onstack = (osas.ss_flags & SS_ONSTACK) != 0; | |
60 | } | |
61 | ||
62 | return result; | |
63 | } | |
899d423e UD |
64 | |
65 | link_warning (sigstack, "the `sigstack' function is dangerous. `sigaltstack' should be used instead.") | |
66 | #else | |
2826ac7e | 67 | # include <signal/sigstack.c> |
899d423e | 68 | #endif |