2023-11-17 20:22:38 +02:00
|
|
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
|
|
|
#include <dlfcn.h>
|
|
|
|
|
|
|
|
#include "common/assert.h"
|
|
|
|
#include "common/dynamic_library.h"
|
|
|
|
#include "common/scope_exit.h"
|
|
|
|
#include "common/signal_chain.h"
|
|
|
|
|
|
|
|
namespace Common {
|
|
|
|
|
2025-09-05 05:12:54 +00:00
|
|
|
#ifdef __ANDROID__
|
2023-11-17 20:22:38 +02:00
|
|
|
template <typename T>
|
|
|
|
T* LookupLibcSymbol(const char* name) {
|
|
|
|
Common::DynamicLibrary provider("libc.so");
|
2025-09-05 05:12:54 +00:00
|
|
|
ASSERT_MSG(provider.IsOpen(), "Failed to open libc!");
|
2023-11-17 20:22:38 +02:00
|
|
|
void* sym = provider.GetSymbolAddress(name);
|
|
|
|
if (sym == nullptr) {
|
|
|
|
sym = dlsym(RTLD_DEFAULT, name);
|
|
|
|
}
|
2025-09-05 05:12:54 +00:00
|
|
|
ASSERT_MSG(sym != nullptr, "Unable to find symbol {}!", name);
|
2023-11-17 20:22:38 +02:00
|
|
|
return reinterpret_cast<T*>(sym);
|
|
|
|
}
|
|
|
|
|
|
|
|
int SigAction(int signum, const struct sigaction* act, struct sigaction* oldact) {
|
|
|
|
static auto libc_sigaction = LookupLibcSymbol<decltype(sigaction)>("sigaction");
|
|
|
|
return libc_sigaction(signum, act, oldact);
|
|
|
|
}
|
2025-09-05 05:12:54 +00:00
|
|
|
#else
|
|
|
|
int SigAction(int signum, const struct sigaction* act, struct sigaction* oldact) {
|
|
|
|
return sigaction(signum, act, oldact);
|
|
|
|
}
|
|
|
|
#endif
|
2023-11-17 20:22:38 +02:00
|
|
|
|
|
|
|
} // namespace Common
|