summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-05-21 00:42:06 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-05-21 00:42:06 +0000
commitd7ab605d158cdbd32907d87707e356414e4727dc (patch)
treebf1c823b78738cbbbfebf4b8c6ca7e599229e41a
parent4815a2fb0e87d0b64a61f57f287de92be5027e90 (diff)
downloadnuttx-d7ab605d158cdbd32907d87707e356414e4727dc.tar.gz
nuttx-d7ab605d158cdbd32907d87707e356414e4727dc.tar.bz2
nuttx-d7ab605d158cdbd32907d87707e356414e4727dc.zip
Add lseek; prep for 0.2.5nuttx-2.5
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@245 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r--nuttx/ChangeLog7
-rw-r--r--nuttx/Documentation/NuttX.html11
-rw-r--r--nuttx/ReleaseNotes26
-rw-r--r--nuttx/fs/fs_fat32.c203
4 files changed, 223 insertions, 24 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index 6216f38e4..03942b0f7 100644
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -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
diff --git a/nuttx/Documentation/NuttX.html b/nuttx/Documentation/NuttX.html
index 4050e7258..965b575e7 100644
--- a/nuttx/Documentation/NuttX.html
+++ b/nuttx/Documentation/NuttX.html
@@ -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>
diff --git a/nuttx/ReleaseNotes b/nuttx/ReleaseNotes
index 57ed2aab0..7010da673 100644
--- a/nuttx/ReleaseNotes
+++ b/nuttx/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.
diff --git a/nuttx/fs/fs_fat32.c b/nuttx/fs/fs_fat32.c
index a5b68831f..f6c0ec421 100644
--- a/nuttx/fs/fs_fat32.c
+++ b/nuttx/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