diff options
author | GPUCode <geoster3d@gmail.com> | 2023-11-17 19:22:38 +0100 |
---|---|---|
committer | t895 <clombardo169@gmail.com> | 2023-11-25 06:46:15 +0100 |
commit | 20011dfeb8d1fa00a862e9b31ce10ceca8015fa2 (patch) | |
tree | 9c1ab232863147e0121ed62276528fc59accdf7c /src/common/signal_chain.cpp | |
parent | Merge pull request #11889 from t895/ini-lib (diff) | |
download | yuzu-20011dfeb8d1fa00a862e9b31ce10ceca8015fa2.tar yuzu-20011dfeb8d1fa00a862e9b31ce10ceca8015fa2.tar.gz yuzu-20011dfeb8d1fa00a862e9b31ce10ceca8015fa2.tar.bz2 yuzu-20011dfeb8d1fa00a862e9b31ce10ceca8015fa2.tar.lz yuzu-20011dfeb8d1fa00a862e9b31ce10ceca8015fa2.tar.xz yuzu-20011dfeb8d1fa00a862e9b31ce10ceca8015fa2.tar.zst yuzu-20011dfeb8d1fa00a862e9b31ce10ceca8015fa2.zip |
Diffstat (limited to 'src/common/signal_chain.cpp')
-rw-r--r-- | src/common/signal_chain.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/common/signal_chain.cpp b/src/common/signal_chain.cpp new file mode 100644 index 000000000..e0c6b9d4e --- /dev/null +++ b/src/common/signal_chain.cpp @@ -0,0 +1,42 @@ +// 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 { + +template <typename T> +T* LookupLibcSymbol(const char* name) { +#if defined(__BIONIC__) + Common::DynamicLibrary provider("libc.so"); + if (!provider.IsOpen()) { + UNREACHABLE_MSG("Failed to open libc!"); + } +#else + // For other operating environments, we assume the symbol is not overriden. + const char* base = nullptr; + Common::DynamicLibrary provider(base); +#endif + + void* sym = provider.GetSymbolAddress(name); + if (sym == nullptr) { + sym = dlsym(RTLD_DEFAULT, name); + } + if (sym == nullptr) { + UNREACHABLE_MSG("Unable to find symbol {}!", name); + } + + 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); +} + +} // namespace Common |