this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

signal support wrappers

+234 -8
-8
src/libSystem/libc/mac.c
··· 213 213 #endif 214 214 } 215 215 216 - int __darwin_sigaction() { 217 - return 0; 218 - } 219 - 220 - void* __darwin_signal() { 221 - return NULL; 222 - } 223 - 224 216 typedef struct malloc_statistics_t { 225 217 unsigned blocks_in_use; 226 218 size_t size_in_use;
+190
src/libSystem/libc/signals.cpp
··· 1 + #include "config.h" 2 + #include "signals.h" 3 + #include "errno.h" 4 + #include "common/auto.h" 5 + #include <signal.h> 6 + #include <memory> 7 + #include "darwin_errno_codes.h" 8 + 9 + static Darling::MappedFlag g_sigactionFlags[] = { 10 + { DARWIN_SA_ONSTACK, SA_ONSTACK }, 11 + { DARWIN_SA_RESTART, SA_RESTART }, 12 + { DARWIN_SA_RESETHAND, int(SA_RESETHAND) }, 13 + { DARWIN_SA_NOCLDSTOP, SA_NOCLDSTOP }, 14 + { DARWIN_SA_NODEFER, SA_NODEFER }, 15 + { DARWIN_SA_NOCLDWAIT, SA_NOCLDWAIT }, 16 + { DARWIN_SA_SIGINFO, SA_SIGINFO } 17 + }; 18 + 19 + static sigset_t sigsetDarwinToLinux(const __darwin_sigset_t* set) 20 + { 21 + sigset_t rv; 22 + 23 + sigemptyset(&rv); 24 + 25 + for (int i = 0; i < 19; i++) 26 + { 27 + if (*set & (1 << i)) 28 + sigaddset(&rv, i+1); 29 + } 30 + 31 + return rv; 32 + } 33 + 34 + static __darwin_sigset_t sigsetLinuxToDarwin(const sigset_t* set) 35 + { 36 + __darwin_sigset_t rv = 0; 37 + 38 + for (int i = 0; i < 19; i++) 39 + { 40 + if (sigismember(set, i+1) > 0) 41 + rv |= (1 << (i+1)); 42 + } 43 + 44 + return rv; 45 + } 46 + 47 + // TODO: check siginfo compatibility 48 + int __darwin_sigaction(int signum, const struct __darwin_sigaction* act, struct __darwin_sigaction* oldact) 49 + { 50 + std::unique_ptr<struct sigaction> nact; 51 + std::unique_ptr<struct sigaction> noldact; 52 + 53 + if (oldact) 54 + noldact.reset(new struct sigaction); 55 + 56 + if (act) 57 + { 58 + nact.reset(new struct sigaction); 59 + nact->sa_flags = Darling::flagsDarwinToNative(g_sigactionFlags, sizeof(g_sigactionFlags)/sizeof(g_sigactionFlags[0]), act->sa_flags); 60 + nact->sa_handler = act->xsa_handler; 61 + nact->sa_sigaction = act->xsa_sigaction; 62 + nact->sa_mask = sigsetDarwinToLinux(&act->sa_mask); 63 + } 64 + 65 + int rv = sigaction(signum, nact.get(), noldact.get()); 66 + 67 + if (rv != -1 && noldact) 68 + { 69 + oldact->sa_flags = Darling::flagsNativeToDarwin(g_sigactionFlags, sizeof(g_sigactionFlags)/sizeof(g_sigactionFlags[0]), noldact->sa_flags); 70 + 71 + if (noldact->sa_flags & SA_SIGINFO) 72 + oldact->xsa_sigaction = noldact->sa_sigaction; 73 + else 74 + oldact->xsa_handler = noldact->sa_handler; 75 + oldact->sa_mask = sigsetLinuxToDarwin(&noldact->sa_mask); 76 + } 77 + if (rv == -1) 78 + errnoOut(); 79 + 80 + return rv; 81 + } 82 + 83 + int __darwin_sigemptyset(__darwin_sigset_t *set) 84 + { 85 + *set = 0; 86 + return 0; 87 + } 88 + 89 + int __darwin_sigfillset(__darwin_sigset_t *set) 90 + { 91 + *set = 0x7ffff; // 19 signals on Linux 92 + return 0; 93 + } 94 + 95 + int __darwin_sigaddset(__darwin_sigset_t *set, int signum) 96 + { 97 + if (signum > 19) 98 + { 99 + errno = DARWIN_EINVAL; 100 + return -1; 101 + } 102 + else 103 + { 104 + *set |= (1 << (signum-1)); 105 + return 0; 106 + } 107 + } 108 + 109 + int __darwin_sigdelset(__darwin_sigset_t *set, int signum) 110 + { 111 + if (signum > 19) 112 + { 113 + errno = DARWIN_EINVAL; 114 + return -1; 115 + } 116 + else 117 + { 118 + *set &= ~(1 << (signum-1)); 119 + return 0; 120 + } 121 + } 122 + 123 + int __darwin_sigismember(__darwin_sigset_t *set, int signum) 124 + { 125 + if (signum > 19) 126 + { 127 + errno = DARWIN_EINVAL; 128 + return -1; 129 + } 130 + else 131 + { 132 + return (*set & (1 << (signum-1))) ? 1 : 0; 133 + } 134 + } 135 + 136 + int __darwin_sigprocmask(int how, const __darwin_sigset_t *set, __darwin_sigset_t *oldset) 137 + { 138 + std::unique_ptr<sigset_t> nset; 139 + std::unique_ptr<sigset_t> noldset; 140 + 141 + if (set) 142 + { 143 + nset.reset(new sigset_t); 144 + *nset = sigsetDarwinToLinux(set); 145 + } 146 + if (oldset) 147 + noldset.reset(new sigset_t); 148 + 149 + // -1 -> conversion from Darwin to Linux 150 + int rv = sigprocmask(how - 1, nset.get(), noldset.get()); 151 + 152 + if (rv == -1) 153 + errnoOut(); 154 + else if (oldset) 155 + *oldset = sigsetLinuxToDarwin(noldset.get()); 156 + 157 + return rv; 158 + } 159 + 160 + int __darwin_sigsuspend(const __darwin_sigset_t *mask) 161 + { 162 + sigset_t set = sigsetDarwinToLinux(mask); 163 + int rv = sigsuspend(&set); 164 + if (rv == -1) 165 + errnoOut(); 166 + return rv; 167 + } 168 + 169 + int __darwin_sigwait(const __darwin_sigset_t *set, int *sig) 170 + { 171 + sigset_t nset = sigsetDarwinToLinux(set); 172 + int rv = sigwait(&nset, sig); 173 + if (rv == -1) 174 + errnoOut(); 175 + return rv; 176 + } 177 + 178 + int __darwin_sigpending(__darwin_sigset_t *set) 179 + { 180 + sigset_t nset; 181 + int rv = sigpending(&nset); 182 + 183 + if (rv == -1) 184 + errnoOut(); 185 + else 186 + *set = sigsetLinuxToDarwin(&nset); 187 + return rv; 188 + } 189 + 190 +
+44
src/libSystem/libc/signals.h
··· 1 + #ifndef SIGNALS_H 2 + #define SIGNALS_H 3 + #include <signal.h> 4 + 5 + #define DARWIN_SA_ONSTACK 0x0001 6 + #define DARWIN_SA_RESTART 0x0002 7 + #define DARWIN_SA_RESETHAND 0x0004 8 + #define DARWIN_SA_NOCLDSTOP 0x0008 9 + #define DARWIN_SA_NODEFER 0x0010 10 + #define DARWIN_SA_NOCLDWAIT 0x0020 11 + #define DARWIN_SA_SIGINFO 0x0040 12 + 13 + typedef int __darwin_sigset_t; 14 + struct __darwin_sigaction 15 + { 16 + union 17 + { 18 + void (*xsa_handler)(int); // sa_handler is often broken due to macro pollution 19 + void (*xsa_sigaction)(int, struct siginfo *, void*); 20 + }; 21 + __darwin_sigset_t sa_mask; 22 + int sa_flags; 23 + }; 24 + 25 + extern "C" 26 + { 27 + 28 + int __darwin_sigaction(int signum, const struct __darwin_sigaction* act, struct __darwin_sigaction* oldact); 29 + int __darwin_sigprocmask(int how, const __darwin_sigset_t *set, __darwin_sigset_t *oldset); 30 + 31 + int __darwin_sigemptyset(__darwin_sigset_t *set); 32 + int __darwin_sigfillset(__darwin_sigset_t *set); 33 + int __darwin_sigaddset(__darwin_sigset_t *set, int signum); 34 + int __darwin_sigdelset(__darwin_sigset_t *set, int signum); 35 + int __darwin_sigismember(__darwin_sigset_t *set, int signum); 36 + 37 + int __darwin_sigsuspend(const __darwin_sigset_t *mask); 38 + int __darwin_sigwait(const __darwin_sigset_t *set, int *sig); 39 + int __darwin_sigpending(__darwin_sigset_t *set); 40 + 41 + } 42 + 43 + #endif 44 +