]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/unix/sysv/linux/sigstack.c
Update copyright notices with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / sigstack.c
CommitLineData
350eb336 1/* Emulate sigstack function using sigaltstack.
d4697bc9 2 Copyright (C) 1998-2014 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
26int
27sigstack (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
65link_warning (sigstack, "the `sigstack' function is dangerous. `sigaltstack' should be used instead.")
66#else
2826ac7e 67# include <signal/sigstack.c>
899d423e 68#endif