1/* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef _BIONIC_TESTS_SCOPED_SIGNAL_HANDLER_H 18#define _BIONIC_TESTS_SCOPED_SIGNAL_HANDLER_H 19 20#include <signal.h> 21#include <string.h> 22 23#if defined(__GLIBC__) 24#define posix_spawnattr_getsigdefault64 posix_spawnattr_getsigdefault 25#define posix_spawnattr_getsigmask64 posix_spawnattr_getsigmask 26#define posix_spawnattr_setsigdefault64 posix_spawnattr_setsigdefault 27#define posix_spawnattr_setsigmask64 posix_spawnattr_setsigmask 28#define pthread_sigmask64 pthread_sigmask 29#define sigaction64 sigaction 30#define sigaddset64 sigaddset 31#define sigdelset64 sigdelset 32#define sigemptyset64 sigemptyset 33#define sigfillset64 sigfillset 34#define sigismember64 sigismember 35#define sigpending64 sigpending 36#define sigprocmask64 sigprocmask 37#define sigset64_t sigset_t 38#define sigsuspend64 sigsuspend 39#define sigtimedwait64 sigtimedwait 40#define sigwait64 sigwait 41#define sigwaitinfo64 sigwaitinfo 42#endif 43 44class ScopedSignalHandler { 45 public: 46 ScopedSignalHandler(int signal_number, void (*handler)(int), int sa_flags = 0) 47 : signal_number_(signal_number) { 48 memset(&action_, 0, sizeof(action_)); 49 action_.sa_flags = sa_flags; 50 action_.sa_handler = handler; 51 sigaction64(signal_number_, &action_, &old_action_); 52 } 53 54 ScopedSignalHandler(int signal_number, void (*action)(int, siginfo_t*, void*), 55 int sa_flags = SA_SIGINFO) 56 : signal_number_(signal_number) { 57 memset(&action_, 0, sizeof(action_)); 58 action_.sa_flags = sa_flags; 59 action_.sa_sigaction = action; 60 sigaction64(signal_number_, &action_, &old_action_); 61 } 62 63 ScopedSignalHandler(int signal_number) : signal_number_(signal_number) { 64 sigaction64(signal_number, nullptr, &old_action_); 65 } 66 67 ~ScopedSignalHandler() { 68 sigaction64(signal_number_, &old_action_, NULL); 69 } 70 71 private: 72 struct sigaction64 action_; 73 struct sigaction64 old_action_; 74 const int signal_number_; 75}; 76 77class SignalMaskRestorer { 78 public: 79 SignalMaskRestorer() { 80 sigprocmask64(SIG_SETMASK, nullptr, &old_mask_); 81 } 82 83 ~SignalMaskRestorer() { 84 sigprocmask64(SIG_SETMASK, &old_mask_, nullptr); 85 } 86 87 private: 88 sigset64_t old_mask_; 89}; 90 91#endif // _BIONIC_TESTS_SCOPED_SIGNAL_HANDLER_H 92