diff options
author | Björn Stenberg <bjorn@haxx.se> | 2002-10-31 20:41:36 +0000 |
---|---|---|
committer | Björn Stenberg <bjorn@haxx.se> | 2002-10-31 20:41:36 +0000 |
commit | 675d258575575afd2439362f44c2a73882a9890e (patch) | |
tree | 3bd29aed0a5189bc555632bfcd18b8789c6c0c63 /firmware | |
parent | f9b5fdcd4d0a8095d6bc5bb91473de56ab6381c6 (diff) | |
download | rockbox-675d258575575afd2439362f44c2a73882a9890e.tar.gz rockbox-675d258575575afd2439362f44c2a73882a9890e.zip |
Fixed lseek().
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2796 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/common/file.c | 14 | ||||
-rw-r--r-- | firmware/drivers/fat.c | 62 |
2 files changed, 31 insertions, 45 deletions
diff --git a/firmware/common/file.c b/firmware/common/file.c index 3e730c2880..ae5560407b 100644 --- a/firmware/common/file.c +++ b/firmware/common/file.c | |||
@@ -363,13 +363,15 @@ int lseek(int fd, int offset, int whence) | |||
363 | return -4; | 363 | return -4; |
364 | } | 364 | } |
365 | } | 365 | } |
366 | rc = fat_readwrite(&(openfiles[fd].fatfile), 1, | 366 | if ( sectoroffset ) { |
367 | &(openfiles[fd].cache),false); | 367 | rc = fat_readwrite(&(openfiles[fd].fatfile), 1, |
368 | if ( rc < 0 ) { | 368 | &(openfiles[fd].cache),false); |
369 | errno = EIO; | 369 | if ( rc < 0 ) { |
370 | return -5; | 370 | errno = EIO; |
371 | return -5; | ||
372 | } | ||
373 | openfiles[fd].cacheoffset = sectoroffset; | ||
371 | } | 374 | } |
372 | openfiles[fd].cacheoffset = sectoroffset; | ||
373 | } | 375 | } |
374 | else | 376 | else |
375 | if ( openfiles[fd].cacheoffset != -1 ) | 377 | if ( openfiles[fd].cacheoffset != -1 ) |
diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c index 884311c1f5..6f6873b65e 100644 --- a/firmware/drivers/fat.c +++ b/firmware/drivers/fat.c | |||
@@ -1102,7 +1102,7 @@ static bool transfer( int start, int count, char* buf, bool write ) | |||
1102 | { | 1102 | { |
1103 | int err; | 1103 | int err; |
1104 | 1104 | ||
1105 | LDEBUGF("transfer(s=%x, c=%x)\n",start, count); | 1105 | LDEBUGF("transfer(s=%x, c=%x, %s)\n",start, count, write?"write":"read"); |
1106 | if (write) | 1106 | if (write) |
1107 | err = ata_write_sectors(start, count, buf); | 1107 | err = ata_write_sectors(start, count, buf); |
1108 | else | 1108 | else |
@@ -1126,9 +1126,9 @@ int fat_readwrite( struct fat_file *file, int sectorcount, | |||
1126 | int first=0, last=0; | 1126 | int first=0, last=0; |
1127 | int i; | 1127 | int i; |
1128 | 1128 | ||
1129 | LDEBUGF( "fat_write(file:%x,count:%d,buf:%x)\n", | 1129 | LDEBUGF( "fat_readwrite(file:%x,count:0x%x,buf:%x,%s)\n", |
1130 | cluster,sectorcount,buf); | 1130 | cluster,sectorcount,buf,write?"write":"read"); |
1131 | LDEBUGF( "fat_write: c=%x s=%x n=%d\n", cluster,sector,numsec); | 1131 | LDEBUGF( "fat_readwrite: sec=%x numsec=%d\n", sector,numsec); |
1132 | if ( sector == -1 ) | 1132 | if ( sector == -1 ) |
1133 | return 0; | 1133 | return 0; |
1134 | 1134 | ||
@@ -1176,15 +1176,11 @@ int fat_readwrite( struct fat_file *file, int sectorcount, | |||
1176 | first = sector; | 1176 | first = sector; |
1177 | } | 1177 | } |
1178 | else { | 1178 | else { |
1179 | /* last sector requested */ | 1179 | if (i == sectorcount-1) { /* last sector requested */ |
1180 | if (i >= sectorcount-1) { | ||
1181 | int count = sector - first + 1; | 1180 | int count = sector - first + 1; |
1182 | if (!transfer( first + fat_bpb.startsector, | 1181 | if (!transfer( first + fat_bpb.startsector, |
1183 | count, buf, write )) | 1182 | count, buf, write )) |
1184 | return -2; | 1183 | return -2; |
1185 | |||
1186 | ((char*)buf) += count * SECTOR_SIZE; | ||
1187 | first = sector; | ||
1188 | } | 1184 | } |
1189 | } | 1185 | } |
1190 | 1186 | ||
@@ -1204,43 +1200,31 @@ int fat_readwrite( struct fat_file *file, int sectorcount, | |||
1204 | 1200 | ||
1205 | int fat_seek(struct fat_file *file, int seeksector ) | 1201 | int fat_seek(struct fat_file *file, int seeksector ) |
1206 | { | 1202 | { |
1203 | int clusternum, sectornum, sector; | ||
1207 | int cluster = file->firstcluster; | 1204 | int cluster = file->firstcluster; |
1208 | int sector = cluster2sec(cluster); | ||
1209 | int numsec = 0; | ||
1210 | int i; | 1205 | int i; |
1211 | 1206 | ||
1212 | if ( seeksector ) { | 1207 | seeksector--; |
1213 | for (i=0; i<seeksector; i++) { | 1208 | clusternum = seeksector / fat_bpb.bpb_secperclus; |
1214 | numsec++; | 1209 | sectornum = seeksector % fat_bpb.bpb_secperclus; |
1215 | if ( numsec >= fat_bpb.bpb_secperclus ) { | 1210 | |
1216 | cluster = get_next_cluster(cluster); | 1211 | for (i=0; i<clusternum; i++) { |
1217 | if (!cluster) | 1212 | cluster = get_next_cluster(cluster); |
1218 | { | 1213 | if (!cluster) { |
1219 | /* end of file */ | 1214 | sector = -1; |
1220 | if (i == (seeksector-1)) | 1215 | break; |
1221 | { | ||
1222 | /* seeksector is last sector in file */ | ||
1223 | sector = -1; | ||
1224 | break; | ||
1225 | } | ||
1226 | else | ||
1227 | /* attempting to seek beyond end of file */ | ||
1228 | return -1; | ||
1229 | } | ||
1230 | |||
1231 | sector = cluster2sec(cluster); | ||
1232 | if (sector<0) | ||
1233 | return -2; | ||
1234 | numsec=0; | ||
1235 | } | ||
1236 | else | ||
1237 | sector++; | ||
1238 | } | 1216 | } |
1239 | } | 1217 | } |
1240 | 1218 | ||
1219 | if ( sector > -1 ) | ||
1220 | sector = cluster2sec(cluster) + sectornum; | ||
1221 | |||
1222 | LDEBUGF("fat_seek(%x) == %x, %x, %x\n", | ||
1223 | seeksector, cluster, sector, sectornum); | ||
1224 | |||
1241 | file->lastcluster = cluster; | 1225 | file->lastcluster = cluster; |
1242 | file->lastsector = sector; | 1226 | file->lastsector = sector; |
1243 | file->sectornum = numsec; | 1227 | file->sectornum = sectornum + 1; |
1244 | return 0; | 1228 | return 0; |
1245 | } | 1229 | } |
1246 | 1230 | ||