1466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert/* 2466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * Copyright (C) 2015 The Android Open Source Project 3466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * All rights reserved. 4466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * 5466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * Redistribution and use in source and binary forms, with or without 6466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * modification, are permitted provided that the following conditions 7466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * are met: 8466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * * Redistributions of source code must retain the above copyright 9466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * notice, this list of conditions and the following disclaimer. 10466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * * Redistributions in binary form must reproduce the above copyright 11466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * notice, this list of conditions and the following disclaimer in 12466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * the documentation and/or other materials provided with the 13466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * distribution. 14466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * 15466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert * SUCH DAMAGE. 27466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert */ 28466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert 29466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert#ifndef _ANDROID_LEGACY_SIGNAL_INLINES_H_ 30466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert#define _ANDROID_LEGACY_SIGNAL_INLINES_H_ 31466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert 32b8e1b705d187886decb5970f791358f928f93d75Josh Gao#include <errno.h> 33b8e1b705d187886decb5970f791358f928f93d75Josh Gao#include <signal.h> 34466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert#include <string.h> 35466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert#include <sys/cdefs.h> 36466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert 37b8e1b705d187886decb5970f791358f928f93d75Josh Gao 38466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert__BEGIN_DECLS 39466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert 403b2096a9d6edd74622b94cacc76b77100f919b84Elliott Hughessighandler_t bsd_signal(int signum, sighandler_t handler) __REMOVED_IN(21); 4146b44160e9e4c466be0faf1bb8d6ec70ecc83273Josh Gao 425bc78c8bcd0c1e634c04029309ede3ec05f2d424Elliott Hughes#if __ANDROID_API__ < __ANDROID_API_L__ 43466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert 44b8e1b705d187886decb5970f791358f928f93d75Josh Gaostatic __inline int sigismember(const sigset_t *set, int signum) { 45466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert /* Signal numbers start at 1, but bit positions start at 0. */ 46466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert int bit = signum - 1; 47466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert const unsigned long *local_set = (const unsigned long *)set; 48466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert if (set == NULL || bit < 0 || bit >= (int)(8 * sizeof(sigset_t))) { 49466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert errno = EINVAL; 50466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert return -1; 51466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert } 52466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert return (int)((local_set[bit / LONG_BIT] >> (bit % LONG_BIT)) & 1); 53466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert} 54466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert 55466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albertstatic __inline int sigaddset(sigset_t *set, int signum) { 56466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert /* Signal numbers start at 1, but bit positions start at 0. */ 57466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert int bit = signum - 1; 58466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert unsigned long *local_set = (unsigned long *)set; 59466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert if (set == NULL || bit < 0 || bit >= (int)(8 * sizeof(sigset_t))) { 60466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert errno = EINVAL; 61466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert return -1; 62466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert } 63466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert local_set[bit / LONG_BIT] |= 1UL << (bit % LONG_BIT); 64466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert return 0; 65466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert} 66466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert 67466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albertstatic __inline int sigdelset(sigset_t *set, int signum) { 68466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert /* Signal numbers start at 1, but bit positions start at 0. */ 69466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert int bit = signum - 1; 70466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert unsigned long *local_set = (unsigned long *)set; 71466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert if (set == NULL || bit < 0 || bit >= (int)(8 * sizeof(sigset_t))) { 72466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert errno = EINVAL; 73466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert return -1; 74466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert } 75466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert local_set[bit / LONG_BIT] &= ~(1UL << (bit % LONG_BIT)); 76466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert return 0; 77466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert} 78466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert 79466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albertstatic __inline int sigemptyset(sigset_t *set) { 80466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert if (set == NULL) { 81466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert errno = EINVAL; 82466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert return -1; 83466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert } 84466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert memset(set, 0, sizeof(sigset_t)); 85466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert return 0; 86466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert} 87466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert 88466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albertstatic __inline int sigfillset(sigset_t *set) { 89466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert if (set == NULL) { 90466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert errno = EINVAL; 91466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert return -1; 92466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert } 93466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert memset(set, ~0, sizeof(sigset_t)); 94466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert return 0; 95466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert} 96466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert 97466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albertstatic __inline sighandler_t signal(int s, sighandler_t f) { 98466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert return bsd_signal(s, f); 99466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert} 100466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert 1015bc78c8bcd0c1e634c04029309ede3ec05f2d424Elliott Hughes#endif /* __ANDROID_API__ < __ANDROID_API_L__ */ 10246b44160e9e4c466be0faf1bb8d6ec70ecc83273Josh Gao 103466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert__END_DECLS 104466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert 105466dbe444446da0a8729ae9ac7294f54276e29d7Dan Albert#endif /* _ANDROID_LEGACY_SIGNAL_INLINES_H_ */ 106