forked from len0rd/rockbox
close() now does not truncate the file.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2821 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
7912a6d39d
commit
11a09e632c
3 changed files with 57 additions and 24 deletions
|
@ -38,7 +38,7 @@
|
||||||
struct filedesc {
|
struct filedesc {
|
||||||
unsigned char cache[SECTOR_SIZE];
|
unsigned char cache[SECTOR_SIZE];
|
||||||
int cacheoffset;
|
int cacheoffset;
|
||||||
int fileoffset;
|
unsigned int fileoffset;
|
||||||
int size;
|
int size;
|
||||||
struct fat_file fatfile;
|
struct fat_file fatfile;
|
||||||
bool busy;
|
bool busy;
|
||||||
|
@ -178,7 +178,7 @@ int close(int fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* tie up all loose ends */
|
/* tie up all loose ends */
|
||||||
fat_closewrite(&(openfiles[fd].fatfile), openfiles[fd].fileoffset);
|
fat_closewrite(&(openfiles[fd].fatfile), openfiles[fd].size);
|
||||||
}
|
}
|
||||||
openfiles[fd].busy = false;
|
openfiles[fd].busy = false;
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -191,7 +191,21 @@ int remove(const char* name)
|
||||||
if ( fd < 0 )
|
if ( fd < 0 )
|
||||||
return fd;
|
return fd;
|
||||||
|
|
||||||
|
rc = fat_truncate(&(openfiles[fd].fatfile));
|
||||||
|
if ( rc < 0 ) {
|
||||||
|
DEBUGF("Failed truncating file\n");
|
||||||
|
errno = EIO;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
rc = fat_remove(&(openfiles[fd].fatfile));
|
rc = fat_remove(&(openfiles[fd].fatfile));
|
||||||
|
if ( rc < 0 ) {
|
||||||
|
DEBUGF("Failed removing file\n");
|
||||||
|
errno = EIO;
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
openfiles[fd].size = 0;
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
|
@ -259,7 +273,7 @@ static int readwrite(int fd, void* buf, int count, bool write)
|
||||||
if ( rc < 0 ) {
|
if ( rc < 0 ) {
|
||||||
DEBUGF("Failed read/writing %d sectors\n",sectors);
|
DEBUGF("Failed read/writing %d sectors\n",sectors);
|
||||||
errno = EIO;
|
errno = EIO;
|
||||||
return -2;
|
return -3;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ( rc > 0 ) {
|
if ( rc > 0 ) {
|
||||||
|
@ -278,10 +292,30 @@ static int readwrite(int fd, void* buf, int count, bool write)
|
||||||
openfiles[fd].cacheoffset = -1;
|
openfiles[fd].cacheoffset = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
openfiles[fd].fileoffset += nread;
|
||||||
|
nread = 0;
|
||||||
|
|
||||||
/* any tail bytes? */
|
/* any tail bytes? */
|
||||||
if ( count ) {
|
if ( count ) {
|
||||||
if (write) {
|
if (write) {
|
||||||
|
/* sector is only partially filled. copy-back from disk */
|
||||||
|
int rc;
|
||||||
|
LDEBUGF("Copy-back tail cache\n");
|
||||||
|
rc = fat_readwrite(&(openfiles[fd].fatfile), 1,
|
||||||
|
openfiles[fd].cache, false );
|
||||||
|
if ( rc < 0 ) {
|
||||||
|
DEBUGF("Failed reading\n");
|
||||||
|
errno = EIO;
|
||||||
|
return -4;
|
||||||
|
}
|
||||||
|
/* seek back one sector to put file position right */
|
||||||
|
rc = fat_seek(&(openfiles[fd].fatfile),
|
||||||
|
openfiles[fd].fileoffset / SECTOR_SIZE);
|
||||||
|
if ( rc < 0 ) {
|
||||||
|
DEBUGF("fat_seek() failed\n");
|
||||||
|
errno = EIO;
|
||||||
|
return -5;
|
||||||
|
}
|
||||||
memcpy( openfiles[fd].cache, buf + nread, count );
|
memcpy( openfiles[fd].cache, buf + nread, count );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -289,7 +323,7 @@ static int readwrite(int fd, void* buf, int count, bool write)
|
||||||
&(openfiles[fd].cache),false) < 1 ) {
|
&(openfiles[fd].cache),false) < 1 ) {
|
||||||
DEBUGF("Failed caching sector\n");
|
DEBUGF("Failed caching sector\n");
|
||||||
errno = EIO;
|
errno = EIO;
|
||||||
return -1;
|
return -6;
|
||||||
}
|
}
|
||||||
memcpy( buf + nread, openfiles[fd].cache, count );
|
memcpy( buf + nread, openfiles[fd].cache, count );
|
||||||
}
|
}
|
||||||
|
|
|
@ -167,7 +167,7 @@ static unsigned int getcurrdostime(unsigned short *dosdate,
|
||||||
unsigned short *dostime,
|
unsigned short *dostime,
|
||||||
unsigned char *dostenth);
|
unsigned char *dostenth);
|
||||||
static int create_dos_name(unsigned char *name, unsigned char *newname);
|
static int create_dos_name(unsigned char *name, unsigned char *newname);
|
||||||
static int find_free_cluster(int start);
|
static unsigned int find_free_cluster(unsigned int start);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define FAT_CACHE_SIZE 0x20
|
#define FAT_CACHE_SIZE 0x20
|
||||||
|
@ -438,10 +438,10 @@ static void *cache_fat_sector(int fatsector)
|
||||||
return sectorbuf;
|
return sectorbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int find_free_cluster(int startcluster)
|
static unsigned int find_free_cluster(unsigned int startcluster)
|
||||||
{
|
{
|
||||||
int sector = startcluster / CLUSTERS_PER_FAT_SECTOR;
|
unsigned int sector = startcluster / CLUSTERS_PER_FAT_SECTOR;
|
||||||
int offset = startcluster % CLUSTERS_PER_FAT_SECTOR;
|
unsigned int offset = startcluster % CLUSTERS_PER_FAT_SECTOR;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* don't waste time scanning if the disk is already full */
|
/* don't waste time scanning if the disk is already full */
|
||||||
|
@ -511,7 +511,7 @@ static int update_fat_entry(unsigned int entry, unsigned int val)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int read_fat_entry(int entry)
|
static int read_fat_entry(unsigned int entry)
|
||||||
{
|
{
|
||||||
int sector = entry / CLUSTERS_PER_FAT_SECTOR;
|
int sector = entry / CLUSTERS_PER_FAT_SECTOR;
|
||||||
int offset = entry % CLUSTERS_PER_FAT_SECTOR;
|
int offset = entry % CLUSTERS_PER_FAT_SECTOR;
|
||||||
|
@ -998,24 +998,23 @@ int fat_create_file(char* name,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fat_closewrite(struct fat_file *file, int size)
|
int fat_truncate(struct fat_file *file)
|
||||||
{
|
{
|
||||||
int next, last = file->lastcluster;
|
|
||||||
int endcluster = last;
|
|
||||||
|
|
||||||
LDEBUGF("fat_closewrite(size=%d, last=%x)\n",size, last);
|
|
||||||
|
|
||||||
/* truncate trailing clusters */
|
/* truncate trailing clusters */
|
||||||
last = get_next_cluster(last);
|
int next;
|
||||||
|
int last = get_next_cluster(file->lastcluster);
|
||||||
while ( last && last != FAT_EOF_MARK ) {
|
while ( last && last != FAT_EOF_MARK ) {
|
||||||
next = get_next_cluster(last);
|
next = get_next_cluster(last);
|
||||||
update_fat_entry(last,0);
|
update_fat_entry(last,0);
|
||||||
last = next;
|
last = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if no cluster was written, size is 0 */
|
return 0;
|
||||||
if (!endcluster)
|
}
|
||||||
size = 0;
|
|
||||||
|
int fat_closewrite(struct fat_file *file, int size)
|
||||||
|
{
|
||||||
|
LDEBUGF("fat_closewrite(size=%d)\n",size);
|
||||||
|
|
||||||
if (!size) {
|
if (!size) {
|
||||||
/* empty file */
|
/* empty file */
|
||||||
|
@ -1024,18 +1023,17 @@ int fat_closewrite(struct fat_file *file, int size)
|
||||||
file->firstcluster = 0;
|
file->firstcluster = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
update_fat_entry(endcluster, FAT_EOF_MARK);
|
|
||||||
|
|
||||||
if (file->dirsector)
|
if (file->dirsector)
|
||||||
update_dir_entry(file, size);
|
update_dir_entry(file, size);
|
||||||
flush_fat();
|
flush_fat();
|
||||||
|
|
||||||
#ifdef TEST_FAT
|
#ifdef TEST_FAT
|
||||||
{
|
if ( file->firstcluster ) {
|
||||||
/* debug */
|
/* debug */
|
||||||
int count = 0;
|
int count = 0;
|
||||||
int len;
|
int len;
|
||||||
|
int next;
|
||||||
for ( next = file->firstcluster; next;
|
for ( next = file->firstcluster; next;
|
||||||
next = get_next_cluster(next) )
|
next = get_next_cluster(next) )
|
||||||
LDEBUGF("cluster %d: %x\n", count++, next);
|
LDEBUGF("cluster %d: %x\n", count++, next);
|
||||||
|
@ -1213,7 +1211,7 @@ int fat_readwrite( struct fat_file *file, int sectorcount,
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fat_seek(struct fat_file *file, int seeksector )
|
int fat_seek(struct fat_file *file, unsigned int seeksector )
|
||||||
{
|
{
|
||||||
int clusternum=0, sectornum=0, sector=0;
|
int clusternum=0, sectornum=0, sector=0;
|
||||||
int cluster = file->firstcluster;
|
int cluster = file->firstcluster;
|
||||||
|
|
|
@ -79,8 +79,9 @@ extern int fat_create_file(char* name,
|
||||||
extern int fat_readwrite(struct fat_file *ent, int sectorcount,
|
extern int fat_readwrite(struct fat_file *ent, int sectorcount,
|
||||||
void* buf, bool write );
|
void* buf, bool write );
|
||||||
extern int fat_closewrite(struct fat_file *ent, int size);
|
extern int fat_closewrite(struct fat_file *ent, int size);
|
||||||
extern int fat_seek(struct fat_file *ent, int sector );
|
extern int fat_seek(struct fat_file *ent, unsigned int sector );
|
||||||
extern int fat_remove(struct fat_file *ent);
|
extern int fat_remove(struct fat_file *ent);
|
||||||
|
extern int fat_truncate(struct fat_file *ent);
|
||||||
|
|
||||||
extern int fat_opendir(struct fat_dir *ent, unsigned int currdir);
|
extern int fat_opendir(struct fat_dir *ent, unsigned int currdir);
|
||||||
extern int fat_getnext(struct fat_dir *ent, struct fat_direntry *entry);
|
extern int fat_getnext(struct fat_dir *ent, struct fat_direntry *entry);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue