少年修仙传客户端基础资源
hch
2024-04-01 d01413b00ef631ac20347716b23818b0b811f65f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#if defined(__ANDROID__)
#include <signal.h>
 
#define SIGMAX 64
 
static void (*wrapped_signal_handlers[SIGMAX]) (int, siginfo_t *, void *);
 
static void signal_handler(int signum, siginfo_t* siginfo, void* sigcontext)
{
  if (wrapped_signal_handlers[signum])
    wrapped_signal_handlers[signum](signum, siginfo, sigcontext);
}
 
extern int __real_sigaction(int signum, const struct sigaction *action, struct sigaction *old_action);
__attribute__((used)) int __wrap_sigaction(int signum, const struct sigaction *action, struct sigaction *old_action)
{
  struct sigaction  wrapper_action_data;
  struct sigaction* wrapper_action = NULL;
 
  if (signum >= SIGMAX)
    return __real_sigaction(signum, action, old_action);
 
  // patch sig action with our thumb compiled dispatcher
  if (action)
  {
    wrapper_action = &wrapper_action_data;
    memcpy(wrapper_action, action, sizeof(*action));
    wrapper_action->sa_sigaction = signal_handler;
 
  }
 
  // install handler (abort on error)
  if (__real_sigaction(signum, wrapper_action, old_action) == -1)
    return -1;
 
  // hide any previously installed wrapper
  if (old_action && old_action->sa_sigaction == signal_handler)
    old_action->sa_sigaction = wrapped_signal_handlers[signum];
 
  // add action to dispatch table
  if (action)
    wrapped_signal_handlers[signum] = action->sa_sigaction;
 
  return 0;
}
 
#undef SIGMAX
#endif /* __ANDROID__ */