diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-12-27 22:10:24 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-12-27 22:10:24 +0100 |
| commit | 4fd59da003ac28f4d0b50d8a9f2efc9809d6d203 (patch) | |
| tree | 27c8180963958a596401458c21dfc6b3dc6c705e /src | |
| parent | e2d7cc5011f8f88d7c96d4d395ea9927a9d9ce8e (diff) | |
| download | box64-4fd59da003ac28f4d0b50d8a9f2efc9809d6d203.tar.gz box64-4fd59da003ac28f4d0b50d8a9f2efc9809d6d203.zip | |
[ANDROID] Try to fix signal handling on android
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/signals.h | 12 | ||||
| -rw-r--r-- | src/libtools/signals.c | 12 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/include/signals.h b/src/include/signals.h index ef72f401..353b7054 100644 --- a/src/include/signals.h +++ b/src/include/signals.h @@ -14,6 +14,18 @@ typedef struct x64_sigaction_s { void (*sa_restorer)(void); } x64_sigaction_t; +#ifdef ANDROID +typedef struct android_sigaction_s { + union { + sighandler_t _sa_handler; + void (*_sa_sigaction)(int, siginfo_t *, void *); + } _u; + sigset_t sa_mask; + uint32_t sa_flags; + void (*sa_restorer)(void); +} android_sigaction_t; +#endif + typedef struct x64_sigaction_restorer_s { union { sighandler_t _sa_handler; diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 4abf8a4f..81250766 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -2064,7 +2064,11 @@ EXPORT sighandler_t my_signal(x64emu_t* emu, int signum, sighandler_t handler) EXPORT sighandler_t my___sysv_signal(x64emu_t* emu, int signum, sighandler_t handler) __attribute__((alias("my_signal"))); EXPORT sighandler_t my_sysv_signal(x64emu_t* emu, int signum, sighandler_t handler) __attribute__((alias("my_signal"))); // not completely exact +#ifdef ANDROID +int EXPORT my_sigaction(x64emu_t* emu, int signum, const android_sigaction_t *act, android_sigaction_t *oldact) +#else int EXPORT my_sigaction(x64emu_t* emu, int signum, const x64_sigaction_t *act, x64_sigaction_t *oldact) +#endif { printf_log(LOG_DEBUG, "Sigaction(signum=%d, act=%p(f=%p, flags=0x%x), old=%p)\n", signum, act, act?act->_u._sa_handler:NULL, act?act->sa_flags:0, oldact); if(signum<0 || signum>MAX_SIGNAL) { @@ -2118,10 +2122,18 @@ int EXPORT my_sigaction(x64emu_t* emu, int signum, const x64_sigaction_t *act, x } return ret; } +#ifdef ANDROID +int EXPORT my___sigaction(x64emu_t* emu, int signum, const android_sigaction_t *act, android_sigaction_t *oldact) +#else int EXPORT my___sigaction(x64emu_t* emu, int signum, const x64_sigaction_t *act, x64_sigaction_t *oldact) +#endif __attribute__((alias("my_sigaction"))); +#ifdef ANDROID +int EXPORT my_syscall_rt_sigaction(x64emu_t* emu, int signum, const android_sigaction_restorer_t *act, android_sigaction_restorer_t *oldact, int sigsetsize) +#else int EXPORT my_syscall_rt_sigaction(x64emu_t* emu, int signum, const x64_sigaction_restorer_t *act, x64_sigaction_restorer_t *oldact, int sigsetsize) +#endif { printf_log(LOG_DEBUG, "Syscall/Sigaction(signum=%d, act=%p, old=%p, size=%d)\n", signum, act, oldact, sigsetsize); if(signum<0 || signum>MAX_SIGNAL) { |