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