aboutsummaryrefslogtreecommitdiff
path: root/src/bootstrap.cc
diff options
context:
space:
mode:
authorAdrian Kummerlaender2016-02-20 22:30:11 +0100
committerAdrian Kummerlaender2016-02-20 22:30:11 +0100
commitb3ef0fc8daa41e433f1919a4933a1cc047f59341 (patch)
treeb551c34e381d6df29334848d6aff242c14b69817 /src/bootstrap.cc
parentee51dc19c859e718280bebae1c089be058737b1c (diff)
downloadchange-b3ef0fc8daa41e433f1919a4933a1cc047f59341.tar
change-b3ef0fc8daa41e433f1919a4933a1cc047f59341.tar.gz
change-b3ef0fc8daa41e433f1919a4933a1cc047f59341.tar.bz2
change-b3ef0fc8daa41e433f1919a4933a1cc047f59341.tar.lz
change-b3ef0fc8daa41e433f1919a4933a1cc047f59341.tar.xz
change-b3ef0fc8daa41e433f1919a4933a1cc047f59341.tar.zst
change-b3ef0fc8daa41e433f1919a4933a1cc047f59341.zip
Interpose `open` library function
`open` is not as side effect free as I had imagined - i.e. if the flag `O_TRUNC` is passed it truncates the file contents alongside opening the file descriptor. In practice this is done by _emacs_ prior to writing the new file content and as such needs to be intercepted so we can start tracking the file before it is changed. Interposing `open` required some changes to make the library work without including `fcntl.h`. This header not only defines some of the flags we require to check if a library call actually is able to change files but also defines the `open` library function. While implementing this change I noticed that the function interpositions implemented in C++ actually need to be declared as `external "C"` so their names do not get wrangled during compilation. I suspect that this was previously implicitly done for e.g. `mmap` and `write` by the included C standard library headers. However this did not work for `open` which is why all function interpositions are now explicitly declared external. End result: _emacs_ file changes are now tracked correctly.
Diffstat (limited to 'src/bootstrap.cc')
-rw-r--r--src/bootstrap.cc4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/bootstrap.cc b/src/bootstrap.cc
index 309ff20..1d509d8 100644
--- a/src/bootstrap.cc
+++ b/src/bootstrap.cc
@@ -2,6 +2,8 @@
#include "init/alloc.h"
+extern "C" {
+
void free(void* ptr) {
static actual::ptr<void, void*> actual_free{};
@@ -41,3 +43,5 @@ void* calloc(size_t block, size_t size) {
return actual_calloc(block, size);
}
}
+
+}