diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-05-03 11:35:59 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-05-03 11:35:59 +0000 |
commit | 8abae8841019fcc75852131b2d1d16bf5710b4b7 (patch) | |
tree | 4403426255190fb5cb4dbf82a0c77c81a0469a37 | |
parent | 96b99b860cc15f13b85b1b2d5b5b20ab7183a652 (diff) | |
download | busybox-8abae8841019fcc75852131b2d1d16bf5710b4b7.tar.gz |
vi: do not truncate file to zero length. closes bug 2944.
function old new delta
file_write 98 104 +6
-rw-r--r-- | editors/vi.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/editors/vi.c b/editors/vi.c index 454cfcee4..4e5a5ac4a 100644 --- a/editors/vi.c +++ b/editors/vi.c @@ -2437,11 +2437,16 @@ static int file_write(char * fn, char * first, char * last) return -2; } charcnt = 0; - fd = open(fn, (O_WRONLY | O_CREAT | O_TRUNC), 0666); + /* By popular request we do not open file with O_TRUNC, + * but instead ftruncate() it _after_ successful write. + * Might reduce amount of data lost on power fail etc. + */ + fd = open(fn, (O_WRONLY | O_CREAT), 0666); if (fd < 0) return -1; cnt = last - first + 1; charcnt = full_write(fd, first, cnt); + ftruncate(fd, charcnt); if (charcnt == cnt) { // good write //file_modified = FALSE; // the file has not been modified |