]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/unix/sysv/linux/sigstack.c
RISC-V: Build Infastructure
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / sigstack.c
CommitLineData
350eb336 1/* Emulate sigstack function using sigaltstack.
688903eb 2 Copyright (C) 1998-2018 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 26int
bd2260a2 27sigstack (struct sigstack *ss, struct sigstack *oss)
dfab448b
UD
28{
29 stack_t sas;
30 stack_t *sasp = NULL;
31 stack_t osas;
32 stack_t *osasp = oss == NULL ? NULL : &osas;
33 int result;
34
35 if (ss != NULL)
36 {
37 /* We have to convert the information. */
38 sas.ss_sp = ss->ss_sp;
39 sas.ss_flags = ss->ss_onstack ? SS_ONSTACK : 0;
40
41 /* For the size of the stack we have no value we can pass to the
42 kernel. This is why this function should not be used. We simply
43 assume that all the memory down to address zero (in case the stack
44 grows down) is available. */
45 sas.ss_size = ss->ss_sp - NULL;
46
47 sasp = &sas;
48 }
49
50 /* Call the kernel. */
51 result = __sigaltstack (sasp, osasp);
52
53 /* Convert the result, if wanted and possible. */
54 if (result == 0 && oss != NULL)
55 {
56 oss->ss_sp = osas.ss_sp;
57 oss->ss_onstack = (osas.ss_flags & SS_ONSTACK) != 0;
58 }
59
60 return result;
61}
899d423e
UD
62
63link_warning (sigstack, "the `sigstack' function is dangerous. `sigaltstack' should be used instead.")
64#else
2826ac7e 65# include <signal/sigstack.c>
899d423e 66#endif