From 30d28c558015afe22822647cc3943e2afb14afde Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Mon, 30 Nov 2015 12:07:33 +0100 Subject: Extract actual function acquisition The pointers to the actual function implementations are now fetched inside the `actual` namespace declared in the `actual_function.h` header. Fixed source of _noreturn_ related warning during compilation by adding the appropriate flag. Sadly this means that we can not use `std::function` in this context as it doesn't seem to carry these _c-like_ flags. --- src/actual_function.h | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/actual_function.h (limited to 'src/actual_function.h') diff --git a/src/actual_function.h b/src/actual_function.h new file mode 100644 index 0000000..0ffe0c2 --- /dev/null +++ b/src/actual_function.h @@ -0,0 +1,60 @@ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#ifndef CHANGE_SRC_ACTUAL_FUNCTION_H_ +#define CHANGE_SRC_ACTUAL_FUNCTION_H_ + +#include +#include + +#include +#include + +namespace { + template + std::function get_actual_function( + const std::string& symbol_name) { + + Result (*real_function)(Arguments...) = nullptr; + const void* symbol_address = dlsym(RTLD_NEXT, symbol_name.c_str()); + + std::memcpy(&real_function, &symbol_address, sizeof(symbol_address)); + + return std::function(real_function); + } +} + +namespace actual { + static auto write = get_actual_function< + ssize_t, + int, const void*, size_t + >("write"); + + static auto rename = get_actual_function< + int, + const char*, const char* + >("rename"); + + static auto rmdir = get_actual_function< + int, + const char* + >("rmdir"); + + static auto unlink = get_actual_function< + int, + const char* + >("unlink"); + + static auto unlinkat = get_actual_function< + int, + int, const char*, int + >("unlinkat"); + + static auto mmap = get_actual_function< + void*, + void*, size_t, int, int, int, off_t + >("mmap"); +} + +#endif // CHANGE_SRC_ACTUAL_FUNCTION_H_ -- cgit v1.2.3