This is the mail archive of the
ecos-discuss@sources.redhat.com
mailing list for the eCos project.
Re: fatfs lseek EOF bug
Gratian Crisan wrote:
Hi,
please see my answers below:
On Tuesday 10 May 2005 09:48, Savin Zlobec wrote:
Gratian Crisan wrote:
Hi all,
I think I've found a bug in the ecos FAT implementation for lseek
function. (fatfs_fo_lseek).
When calling the function like this 'lseek(fd, 0, SEEK_CUR)' to get the
current file position and the postion is right at the end of the file the
fat lseek function returns end of file error EEOF. I've looked at the
other filesystems from ecos and did a test in linux and the correct
behavior seems to be to return the current position of the end of file if
the read/write pointer is at the end of file (equal with the file size).
This bug occurs for example when creating a new file, writing some data in
it and calling lseek(fd, 0, SEEK_CUR) to get the current file position.
Suggestions?
[snip]
See the file attached. The test is for an MMC driver but should be pretty
straight forward to adapt (only the mount command should be changed).
The test creates a file and writes blocks of data into it while printing the
current file offset. In a new file after writing the first block, for which
the value returned is 0, the value returned by lseek function is -1. The
strange thing is that if you overwrite an existing file the lseek function
correctly returns the current file offset (equal to EOF).
Found the BUG -- Please try the attached patch and let me know if it works.
savin
Index: src/fatfs_supp.c
===================================================================
RCS file: /cvs/ecos/ecos/packages/fs/fat/current/src/fatfs_supp.c,v
retrieving revision 1.3
diff -u -r1.3 fatfs_supp.c
--- src/fatfs_supp.c 22 Oct 2004 14:10:23 -0000 1.3
+++ src/fatfs_supp.c 10 May 2005 10:43:14 -0000
@@ -1172,8 +1172,10 @@
// Err could be EEOF wich means that the given
// offset if out of given file (cluster chain)
- if (ENOERR == err)
- *pos = new_pos;
+ if (EEOF == err)
+ new_pos.cluster_pos = disk->cluster_size;
+
+ *pos = new_pos;
return err;
}
@@ -2056,11 +2058,18 @@
fatfs_data_pos_t *pos,
cyg_uint32 offset)
{
+ int err;
+
CYG_CHECK_DATA_PTRC(disk);
CYG_CHECK_DATA_PTRC(file);
CYG_CHECK_DATA_PTRC(pos);
- return get_position_from_off(disk, file->cluster, offset, pos, CO_NONE);
+ err = get_position_from_off(disk, file->cluster, offset, pos, CO_NONE);
+
+ if (EEOF == err && offset == file->size)
+ return ENOERR;
+ else
+ return err;
}
// -------------------------------------------------------------------------
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss