[BusyBox 0005124]: vi in busybox always writes files with length 0
bugs at busybox.net
bugs at busybox.net
Fri Sep 26 11:40:12 UTC 2008
A NOTE has been added to this issue.
======================================================================
http://busybox.net/bugs/view.php?id=5124
======================================================================
Reported By: DanLiang
Assigned To: BusyBox
======================================================================
Project: BusyBox
Issue ID: 5124
Category: Documentation
Reproducibility: always
Severity: minor
Priority: normal
Status: assigned
======================================================================
Date Submitted: 09-23-2008 20:43 PDT
Last Modified: 09-26-2008 04:40 PDT
======================================================================
Summary: vi in busybox always writes files with length 0
Description:
I use buildroot to create a rootfs and test it.
My configuration is
uclibc-0.9.29
gcc-4.2.4
busybox-1.12.0
When I try to modify a existing file or create a new one with vi, after I
save the contents and exit from vi, the file length is always 0 and all
the contents are lost.
In file vi.c, I find if I comment out the line "ftruncate(fd, charcnt);"
in function "static int file_write(char *fn, char *first, char *last)",
everything is OK.
======================================================================
----------------------------------------------------------------------
vda - 09-24-08 04:14
----------------------------------------------------------------------
Please add this debugging code:
charcnt = full_write(fd, first, cnt);
bb_error_msg("file_write: cnt:%d charcnt:%d", cnt, charcnt);
sleep(5);
ftruncate(fd, charcnt);
and let me know what do you see when you try to save a file.
----------------------------------------------------------------------
DanLiang - 09-24-08 19:20
----------------------------------------------------------------------
Hi vda
when I try to save a file, a message is printed out like this:
vi: file_write: cnt:10 charcnt:10.
Variable 'cnt' always has the same value with 'charcnt'.
which means no matter what value I pass to ftruncate(), it will truncate
the file length to 0.
But it's very strange when I wrote a small program:
---------------------------------------------------
#include <unistd.h>
#include <fcntl.h>
int main()
{
char buf[] = "test";
int fd, cnt, charcnt;
fd = open("test.txt", (O_RDWR | O_CREAT), 0666);
if (fd < 0)
return -1;
cnt = sizeof(buf);
buf[cnt-1] = 0x0A;
charcnt = write(fd, buf, cnt);
ftruncate(fd, charcnt);
if (charcnt == cnt) {
// good write
//file_modified = FALSE;
} else {
charcnt = 0;
}
close(fd);
return charcnt;
}
---------------------------------------------------
I tested it on my ARM board, and it's ok with string "test" in that file.
----------------------------------------------------------------------
vda - 09-25-08 14:30
----------------------------------------------------------------------
Can you strace vi? "strace -o s.log vi ..."
Do the same with your test program.
Look how ftruncate's are different in the logs.
If you can't figure it out, just attach strace logs to this bug.
----------------------------------------------------------------------
DanLiang - 09-26-08 00:35
----------------------------------------------------------------------
Hi vda,
trace_vi.log is logged when I tried to write string "abcd" into file
abc.txt.
trace_test.log is logged when the samll program is run.
In trace_vi.log, ftruncate64 is called, while in trace_test.log, ftruncate
is called.
In source code "vi.c" ftruncate() is called.
If I rewrite the samll test program to explicitly use ftruncate64, a weird
file size 21474836485 is seen.
----------------------------------------------------------------------
vda - 09-26-08 02:41
----------------------------------------------------------------------
Does it help if you replace
ftruncate(fd, charcnt);
with
ftruncate(fd, (off_t)charcnt);
?
----------------------------------------------------------------------
DanLiang - 09-26-08 03:04
----------------------------------------------------------------------
It has the same result. :-(
----------------------------------------------------------------------
vda - 09-26-08 03:43
----------------------------------------------------------------------
Looks like your libc or kernel mishandle ftruncate64(). Which version of
kernel is it?
----------------------------------------------------------------------
bernhardf - 09-26-08 04:40
----------------------------------------------------------------------
What arch (and if arm, which ABI) do you use? How did you build your
toolchain?
Issue History
Date Modified Username Field Change
======================================================================
09-23-08 20:43 DanLiang New Issue
09-23-08 20:43 DanLiang Status new => assigned
09-23-08 20:43 DanLiang Assigned To => BusyBox
09-24-08 01:14 DanLiang Issue Monitored: DanLiang
09-24-08 04:14 vda Note Added: 0011854
09-24-08 19:20 DanLiang Note Added: 0011934
09-25-08 14:30 vda Note Added: 0012084
09-25-08 23:36 DanLiang File Added: trace_vi.log
09-25-08 23:36 DanLiang File Added: trace_test.log
09-25-08 23:39 DanLiang Note Added: 0012124
09-26-08 00:28 DanLiang Note Edited: 0012124
09-26-08 00:35 DanLiang Note Edited: 0012124
09-26-08 02:41 vda Note Added: 0012134
09-26-08 03:04 DanLiang Note Added: 0012144
09-26-08 03:43 vda Note Added: 0012154
09-26-08 04:40 bernhardf Note Added: 0012184
======================================================================
More information about the busybox-cvs
mailing list