diff options
author | Adrian Kummerlaender | 2016-02-20 22:30:11 +0100 |
---|---|---|
committer | Adrian Kummerlaender | 2016-02-20 22:30:11 +0100 |
commit | b3ef0fc8daa41e433f1919a4933a1cc047f59341 (patch) | |
tree | b551c34e381d6df29334848d6aff242c14b69817 /README.md | |
parent | ee51dc19c859e718280bebae1c089be058737b1c (diff) | |
download | change-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 'README.md')
-rw-r--r-- | README.md | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -22,7 +22,7 @@ The goal is to develop `change` into a utility that can be dropped in front of a ## Filtering -Due to it's nature of interposing low level system calls such as `write` and `unlink` the library by default exposes lots of the internal write logic of the wrapped application. For instance it reports _vim_ creating a file called `4913` to verify the target directory's writability as well as the creation of various temporary backup files. While this is certainly interesting for debugging purposes it hinders the library's goal of providing a higher level summary consisting primarily of the actions the user explicity performed such as the changed file contents. +Due to it's nature of interposing low level calls such as `write` and `unlink` the library by default exposes lots of the internal write logic of the wrapped application. For instance it reports _vim_ creating a file called `4913` to verify the target directory's writability as well as the creation of various temporary backup files. While this is certainly interesting for debugging purposes it hinders the library's goal of providing a higher level summary consisting primarily of the actions the user explicity performed such as the changed file contents. To solve this problem one may provide a list of regular expressions to be matched against the file paths via the `CHANGE_LOG_IGNORE_PATTERN_PATH` environment variable. |