aboutsummaryrefslogtreecommitdiff
path: root/editor.h
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 /editor.h
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 'editor.h')
-rw-r--r--editor.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/editor.h b/editor.h
index 76a3136..3e8e644 100644
--- a/editor.h
+++ b/editor.h
@@ -5,6 +5,7 @@
#include <signal.h>
#include <stddef.h>
#include <stdbool.h>
+#include <setjmp.h>
typedef struct Editor Editor;
typedef struct File File;
@@ -190,6 +191,7 @@ enum Mark {
struct File {
Text *text;
const char *name;
+ volatile sig_atomic_t truncated;
bool is_stdin;
struct stat stat;
int refcount;
@@ -244,6 +246,8 @@ struct Editor {
Mode *mode_before_prompt; /* user mode which was active before entering prompt */
volatile bool running; /* exit main loop once this becomes false */
volatile sig_atomic_t cancel_filter; /* abort external command */
+ volatile sig_atomic_t sigbus;
+ sigjmp_buf sigbus_jmpbuf;
};
Editor *editor_new(Ui*);