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:
patacongo 2007-05-21 00:42:06 +00:00
parent 60f48b9ab9
commit 982949fd81
4 changed files with 223 additions and 24 deletions

View File

@ -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

View File

@ -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>

View File

@ -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.

View File

@ -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