Add lseek; prep for 0.2.5
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@245 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
60f48b9ab9
commit
982949fd81
@ -121,7 +121,7 @@
|
||||
arch/c5471 and arch/dm320 are deprecated and will be removed
|
||||
when the new c5471 and dm320 logic is verified.
|
||||
|
||||
0.2.5 2007-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||
0.2.5 2007-05-19 Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||
|
||||
* Corrected some build/configuration issues introduced with the
|
||||
last release.
|
||||
@ -129,7 +129,7 @@
|
||||
development board (untested)
|
||||
* Added support for block devices.
|
||||
* Simulated target now exports a VFAT filesystem
|
||||
* Begin support for VFAT filesystem (not yet functional)
|
||||
* Begin support for VFAT filesystem (missing functionalit)
|
||||
* Added mount() and umount()
|
||||
* Fix bug in memcmp return value
|
||||
* Fix errors in timeslice calculation (several places)
|
||||
@ -137,5 +137,8 @@
|
||||
* close() was not closing the underlying device.
|
||||
* Added fsync()
|
||||
* Added strspn() and strcspn()
|
||||
|
||||
0.2.6 2007-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||
|
||||
* Started m68322
|
||||
|
||||
|
@ -183,7 +183,7 @@
|
||||
</table>
|
||||
|
||||
<p>
|
||||
The seventh release of NuttX (nuttx-0.2.4) is available for download
|
||||
The 8th release of NuttX (nuttx-0.2.5) is available for download
|
||||
from the <a href="http://sourceforge.net/project/showfiles.php?group_id=189573">SourceForge</a>
|
||||
website.
|
||||
</p>
|
||||
@ -248,7 +248,7 @@
|
||||
</p>
|
||||
<p>
|
||||
<b>STATUS:</b>
|
||||
This port is in progress and should be available in the nuttx-0.2.5 release.
|
||||
This port is in progress and should be available in the nuttx-0.2.6 release.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
@ -500,7 +500,7 @@ Other memory:
|
||||
arch/c5471 and arch/dm320 are deprecated and will be removed
|
||||
when the new c5471 and dm320 logic is verified.
|
||||
|
||||
0.2.5 2007-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||
0.2.5 2007-05-19 Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||
|
||||
* Corrected some build/configuration issues introduced with the
|
||||
last release.
|
||||
@ -508,7 +508,7 @@ Other memory:
|
||||
development board (untested)
|
||||
* Added support for block devices.
|
||||
* Simulated target now exports a VFAT filesystem
|
||||
* Begin support for VFAT filesystem (not yet functional)
|
||||
* Begin support for VFAT filesystem (missing functionalit)
|
||||
* Added mount() and umount()
|
||||
* Fix bug in memcmp return value
|
||||
* Fix errors in timeslice calculation (several places)
|
||||
@ -516,6 +516,9 @@ Other memory:
|
||||
* close() was not closing the underlying device.
|
||||
* Added fsync()
|
||||
* Added strspn() and strcspn()
|
||||
|
||||
0.2.6 2007-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||
|
||||
* Started m68322
|
||||
</pre></ul>
|
||||
|
||||
|
26
ReleaseNotes
26
ReleaseNotes
@ -1,20 +1,18 @@
|
||||
nuttx-0.2.4
|
||||
nuttx-0.2.5
|
||||
^^^^^^^^^^^^
|
||||
|
||||
This is the 7th release of NuttX. This release is only to roll out
|
||||
build changes to better support different SoC's that use the same
|
||||
processor architecture. In particular, the two existing ARM architectures,
|
||||
c5471 and DM320 were combined into a single ARM directory. This was done
|
||||
in preparation for an LPC2148 port that is currently in progress. There
|
||||
is NO new functionality or significant bufixes in this release.
|
||||
This is the 8th release of NuttX. This release includes:
|
||||
|
||||
(1) Several bug fixes
|
||||
(2) Initial support for FAT filesystems. Testing has not been
|
||||
exhaustive and some functionality is missing (mkdir, stat, unlink
|
||||
chmod, and rename functionality is not yet implemented).
|
||||
(3) Support for the NXP lpc2148 processor is included but is
|
||||
untested as of this writing. The current implementation includes
|
||||
only support for serial console and timer interrupt.
|
||||
|
||||
See the ChangeLog for a complete list of changes.
|
||||
|
||||
This release has been verified on the Linux user-mode platform
|
||||
and the Neuros OSD using the test program under examples/ostest.
|
||||
The results of the testing is available in the source tree under
|
||||
configs/ntosd-dm320/doc/test-results and under configs/sim/doc/test-results.
|
||||
There are no known, critical defects but the project development status
|
||||
remains at 'beta' status pending further test and evaluation.
|
||||
This release has been verified only on the Linux user-mode platform.
|
||||
|
||||
This tarball contains a complete CVS snapshot from April 28, 2007.
|
||||
This tarball contains a complete CVS snapshot from May 19, 2007.
|
||||
|
203
fs/fs_fat32.c
203
fs/fs_fat32.c
@ -46,6 +46,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <semaphore.h>
|
||||
#include <assert.h>
|
||||
@ -829,6 +830,10 @@ static off_t fat_seek(FAR struct file *filp, off_t offset, int whence)
|
||||
struct inode *inode;
|
||||
struct fat_mountpt_s *fs;
|
||||
struct fat_file_s *ff;
|
||||
sint32 cluster;
|
||||
ssize_t position;
|
||||
unsigned int clustersize;
|
||||
unsigned int sectoroffset;
|
||||
int ret;
|
||||
|
||||
/* Sanity checks */
|
||||
@ -843,18 +848,208 @@ static off_t fat_seek(FAR struct file *filp, off_t offset, int whence)
|
||||
|
||||
DEBUGASSERT(fs != NULL);
|
||||
|
||||
/* Map the offset according to the whence option */
|
||||
switch (whence)
|
||||
{
|
||||
case SEEK_SET: /* The offset is set to offset bytes. */
|
||||
position = offset;
|
||||
break;
|
||||
|
||||
case SEEK_CUR: /* The offset is set to its current location plus
|
||||
* offset bytes. */
|
||||
|
||||
position = offset + ff->ff_position;
|
||||
break;
|
||||
|
||||
case SEEK_END: /* The offset is set to the size of the file plus
|
||||
* offset bytes. */
|
||||
|
||||
position = offset + ff->ff_size;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Make sure that the mount is still healthy */
|
||||
|
||||
fat_semtake(fs);
|
||||
ret = fat_checkmount(fs);
|
||||
if (ret != OK)
|
||||
{
|
||||
fat_semgive(fs);
|
||||
return ret;
|
||||
goto errout_with_semaphore;
|
||||
}
|
||||
|
||||
/* Check if there is unwritten data in the file buffer */
|
||||
|
||||
ret = fat_ffcacheflush(fs, ff);
|
||||
if (ret < 0)
|
||||
{
|
||||
goto errout_with_semaphore;
|
||||
}
|
||||
|
||||
/* Attempts to set the position beyound the end of file will
|
||||
* work if the file is open for write access.
|
||||
*/
|
||||
|
||||
if (position > ff->ff_size && (ff->ff_oflags & O_WROK) == 0)
|
||||
{
|
||||
/* Otherwise, the position is limited to the file size */
|
||||
position = ff->ff_size;
|
||||
}
|
||||
|
||||
/* Set file position to the beginning of the file */
|
||||
|
||||
ff->ff_position = 0;
|
||||
ff->ff_sectorsincluster = 1;
|
||||
|
||||
/* Move file position if necessary */
|
||||
|
||||
if (position)
|
||||
{
|
||||
/* Get the start cluster of the file */
|
||||
|
||||
cluster = ff->ff_startcluster;
|
||||
if (!cluster)
|
||||
{
|
||||
/* Create a new cluster chain if the file does not have one */
|
||||
|
||||
cluster = fat_createchain(fs);
|
||||
if (cluster < 0)
|
||||
{
|
||||
ret = cluster;
|
||||
goto errout_with_semaphore;
|
||||
}
|
||||
ff->ff_startcluster = cluster;
|
||||
}
|
||||
|
||||
if (cluster)
|
||||
{
|
||||
/* If the file has a cluster chain, follow it to the
|
||||
* requested position.
|
||||
*/
|
||||
|
||||
clustersize = fs->fs_fatsecperclus * fs->fs_hwsectorsize;
|
||||
for (;;)
|
||||
{
|
||||
/* Skip over clusters prior to the one containing
|
||||
* the requested position.
|
||||
*/
|
||||
|
||||
ff->ff_currentcluster = cluster;
|
||||
if (position <= clustersize)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
/* Extend the cluster chain if write in enabled. NOTE:
|
||||
* this is not consistent with the lseek description:
|
||||
* "The lseek() function allows the file offset to be
|
||||
* set beyond the end of the file (but this does not
|
||||
* change the size of the file). If data is later written
|
||||
* at this point, subsequent reads of the data in the
|
||||
* gap (a "hole") return null bytes ('\0') until data
|
||||
* is actually written into the gap."
|
||||
*/
|
||||
|
||||
if ((ff->ff_oflags & O_WROK) != 0)
|
||||
{
|
||||
/* Extend the cluster chain (fat_extendchain
|
||||
* will follow the existing chain or add new
|
||||
* clusters as needed.
|
||||
*/
|
||||
|
||||
cluster = fat_extendchain(fs, cluster);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Other we can only follong the existing chain */
|
||||
|
||||
cluster = fat_getcluster(fs, cluster);
|
||||
}
|
||||
|
||||
if (cluster < 0)
|
||||
{
|
||||
/* An error occurred getting the cluster */
|
||||
|
||||
ret = cluster;
|
||||
goto errout_with_semaphore;
|
||||
}
|
||||
|
||||
/* Zero means that there is no further clusters available
|
||||
* in the chain.
|
||||
*/
|
||||
|
||||
if (cluster == 0)
|
||||
{
|
||||
/* At the position to the current locaiton and
|
||||
* break out.
|
||||
*/
|
||||
|
||||
position = clustersize;
|
||||
break;
|
||||
}
|
||||
|
||||
if (cluster >= fs->fs_nclusters)
|
||||
{
|
||||
ret = -ENOSPC;
|
||||
goto errout_with_semaphore;
|
||||
}
|
||||
|
||||
/* Otherwise, update the position and continue looking */
|
||||
|
||||
ff->ff_position += clustersize;
|
||||
position -= clustersize;
|
||||
}
|
||||
|
||||
/* We get here after we have found the sector containing
|
||||
* the requested position.
|
||||
*/
|
||||
|
||||
sectoroffset = (position - 1) / fs->fs_hwsectorsize;
|
||||
|
||||
/* And get the current sector from the cluster and
|
||||
* the sectoroffset into the cluster.
|
||||
*/
|
||||
|
||||
ff->ff_currentsector =
|
||||
fat_cluster2sector(fs, cluster) + sectoroffset;
|
||||
|
||||
/* Load the sector corresponding to the position */
|
||||
|
||||
if ((position & SEC_NDXMASK(fs)) != 0)
|
||||
{
|
||||
ret = fat_ffcacheread(fs, ff, ff->ff_currentsector);
|
||||
if (ret < 0)
|
||||
{
|
||||
goto errout_with_semaphore;
|
||||
}
|
||||
}
|
||||
|
||||
/* Save the number of sectors left in the cluster */
|
||||
|
||||
ff->ff_sectorsincluster = fs->fs_fatsecperclus - sectoroffset;
|
||||
|
||||
/* And save the new file position */
|
||||
|
||||
ff->ff_position += position;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we extended the size of the file, then mark the file as modified. */
|
||||
|
||||
if ((ff->ff_oflags & O_WROK) != 0 && ff->ff_position > ff->ff_size)
|
||||
{
|
||||
ff->ff_size = ff->ff_position;
|
||||
ff->ff_bflags |= FFBUFF_MODIFIED;
|
||||
}
|
||||
|
||||
fat_semgive(fs);
|
||||
return -ENOSYS;
|
||||
return OK;
|
||||
|
||||
errout_with_semaphore:
|
||||
fat_semgive(fs);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -959,7 +1154,7 @@ static int fat_sync(FAR struct file *filp)
|
||||
* in the sector using the saved directory index.
|
||||
*/
|
||||
|
||||
direntry = &fs->fs_buffer[ff->ff_dirindex];
|
||||
direntry = &fs->fs_buffer[ff->ff_dirindex * 32];
|
||||
|
||||
/* Set the archive bit, set the write time, and update
|
||||
* anything that may have* changed in the directory
|
||||
|
Loading…
Reference in New Issue
Block a user