eden/src/common/signal_chain.cpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

37 lines
1.1 KiB
C++
Raw Normal View History

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 {
#ifdef __ANDROID__
2023-11-17 20:22:38 +02:00
template <typename T>
T* LookupLibcSymbol(const char* name) {
Common::DynamicLibrary provider("libc.so");
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);
}
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);
}
#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