aboutsummaryrefslogtreecommitdiff
path: root/editors/vi.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-05-03 11:35:59 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-05-03 11:35:59 +0000
commit8abae8841019fcc75852131b2d1d16bf5710b4b7 (patch)
tree4403426255190fb5cb4dbf82a0c77c81a0469a37 /editors/vi.c
parent96b99b860cc15f13b85b1b2d5b5b20ab7183a652 (diff)
downloadbusybox-8abae8841019fcc75852131b2d1d16bf5710b4b7.tar.gz
vi: do not truncate file to zero length. closes bug 2944.
function old new delta file_write 98 104 +6
Diffstat (limited to 'editors/vi.c')
-rw-r--r--editors/vi.c7
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