1
0
Fork 0
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:
Björn Stenberg 2002-11-11 10:21:51 +00:00
parent 7912a6d39d
commit 11a09e632c
3 changed files with 57 additions and 24 deletions

View file

@ -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 );
} }

View file

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

View file

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