1/* 2 * Copyright 2002-2011, Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT license. 4 * 5 * Author: 6 * Daniel Reinhold, danielre@users.sf.net 7 * Ingo Weinhold, ingo_weinhold@gmx.de 8 */ 9 10 11#include <signal.h> 12 13#include <errno.h> 14#include <stdio.h> 15 16#include <symbol_versioning.h> 17 18#include <errno_private.h> 19#include <signal_private.h> 20 21 22static __sighandler_t 23signal_common(int signal, __sighandler_t signalHandler, int flags) 24{ 25 struct sigaction newAction, oldAction; 26 27 // setup the replacement sigaction 28 newAction.sa_handler = signalHandler; 29 newAction.sa_mask = 0; 30 newAction.sa_flags = flags; 31 32 if (__sigaction(signal, &newAction, &oldAction) != 0) 33 return SIG_ERR; 34 35 // success, return the original handler 36 return oldAction.sa_handler; 37} 38 39 40__sighandler_t 41__signal_beos(int signal, __sighandler_t signalHandler) 42{ 43 // check signal range 44 if (signal < 0 || signal > MAX_SIGNAL_NUMBER_BEOS) { 45 __set_errno(EINVAL); 46 return SIG_ERR; 47 } 48 49 // set the signal handler 50 __sighandler_t result = signal_common(signal, signalHandler, 51 SA_BEOS_COMPATIBLE_HANDLER); 52 if (result == SIG_ERR) 53 return SIG_ERR; 54 55 // If the signal is SIGSEGV, set the same signal handler for SIGBUS. Those 56 // constants had the same value under BeOS. 57 if (signal == SIGSEGV) 58 signal_common(SIGBUS, signalHandler, SA_BEOS_COMPATIBLE_HANDLER); 59 60 return result; 61} 62 63 64__sighandler_t 65__signal(int signal, __sighandler_t signalHandler) 66{ 67 return signal_common(signal, signalHandler, 0); 68} 69 70 71DEFINE_LIBROOT_KERNEL_SYMBOL_VERSION("__signal_beos", "signal@", "BASE"); 72 73DEFINE_LIBROOT_KERNEL_SYMBOL_VERSION("__signal", "signal@@", "1_ALPHA4"); 74