diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2015-07-17 14:38:36 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2015-07-19 14:12:43 +0200 |
| commit | 0fa9885cda0778467ca5737ac888ece5ef371b3d (patch) | |
| tree | fd3ab531ec8ab1e60b9ee9a782c2c38120202d7b /editor.h | |
| parent | 8129933ca51caf788e0cd7c5fdbcb43fdc64601d (diff) | |
| download | vis-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.h | 4 |
1 files changed, 4 insertions, 0 deletions
@@ -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*); |
