aboutsummaryrefslogtreecommitdiff
path: root/text.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2015-07-17 14:38:36 +0200
committerMarc André Tanner <mat@brain-dump.org>2015-07-19 14:12:43 +0200
commit0fa9885cda0778467ca5737ac888ece5ef371b3d (patch)
treefd3ab531ec8ab1e60b9ee9a782c2c38120202d7b /text.c
parent8129933ca51caf788e0cd7c5fdbcb43fdc64601d (diff)
downloadvis-0fa9885cda0778467ca5737ac888ece5ef371b3d.tar.gz
vis-0fa9885cda0778467ca5737ac888ece5ef371b3d.tar.xz
vis: handle file truncation more gracefully
If we use the file / virtual memory system as cache (using mmap(2)) and another process truncates the file we are editing, we have a problem. All we can do is catch the resulting SIGBUS, close the corresponding window and print a warning message. To test this use: $ dd if=/dev/zero of=TEST bs=8M count=1 $ vis TEST :! echo TRUNCATE > TEST
Diffstat (limited to 'text.c')
-rw-r--r--text.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/text.c b/text.c
index be9a8f5..5f516bc 100644
--- a/text.c
+++ b/text.c
@@ -1185,6 +1185,14 @@ bool text_modified(Text *txt) {
return txt->saved_action != txt->history;
}
+bool text_sigbus(Text *txt, const char *addr) {
+ for (Buffer *buf = txt->buffers; buf; buf = buf->next) {
+ if (buf->type == MMAP && buf->data <= addr && addr < buf->data + buf->size)
+ return true;
+ }
+ return false;
+}
+
enum TextNewLine text_newline_type(Text *txt){
if (!txt->newlines) {
txt->newlines = TEXT_NEWLINE_NL; /* default to UNIX style \n new lines */