// --- Directory IO\r
char *FAT_ReadDir(tVFS_Node *Node, int ID);\r
tVFS_Node *FAT_FindDir(tVFS_Node *Node, const char *Name);\r
+tVFS_Node *FAT_GetNodeFromINode(tVFS_Node *Root, Uint64 Inode);\r
#if SUPPORT_WRITE\r
int FAT_Mknod(tVFS_Node *Node, const char *Name, Uint Flags);\r
int FAT_Relink(tVFS_Node *node, const char *OldName, const char *NewName);\r
MODULE_DEFINE(0, (0<<8)|50 /*v0.50*/, VFAT, FAT_Install, NULL, NULL);\r
tFAT_VolInfo gFAT_Disks[8];\r
int giFAT_PartCount = 0;\r
-tVFS_Driver gFAT_FSInfo = {"fat", 0, FAT_InitDevice, FAT_Unmount, NULL};\r
+tVFS_Driver gFAT_FSInfo = {"fat", 0, FAT_InitDevice, FAT_Unmount, FAT_GetNodeFromINode, NULL};\r
\r
// === CODE ===\r
/**\r
// - From Microsoft FAT Specifcation\r
RootDirSectors = ((bs->files_in_root*32) + (bs->bps - 1)) / bs->bps;\r
\r
- if(bs->fatSz16 != 0) FATSz = bs->fatSz16;\r
- else FATSz = bs->spec.fat32.fatSz32;\r
+ if(bs->fatSz16 != 0)\r
+ FATSz = bs->fatSz16;\r
+ else\r
+ FATSz = bs->spec.fat32.fatSz32;\r
\r
- if(bs->totalSect16 != 0) TotSec = bs->totalSect16;\r
- else TotSec = bs->totalSect32;\r
+ if(bs->totalSect16 != 0)\r
+ TotSec = bs->totalSect16;\r
+ else\r
+ TotSec = bs->totalSect32;\r
\r
diskInfo->ClusterCount = (TotSec - (bs->resvSectCount + (bs->fatCount * FATSz) + RootDirSectors)) / bs->spc;\r
\r
\r
ENTER("pNode XOffset", Node, Offset);\r
\r
- cluster = Node->Inode & 0xFFFFFFFF; // Cluster ID\r
- LOG("cluster = %08x", cluster);\r
+ cluster = Node->Inode & 0xFFFFFFF; // Cluster ID\r
+ LOG("cluster = 0x%07x", cluster);\r
\r
// Do Cluster Skip\r
// - Pre FAT32 had a reserved area for the root.\r
{\r
int preSkip, count;\r
int i, cluster, pos;\r
- int bpc;\r
- void *tmpBuf;\r
tFAT_VolInfo *disk = Node->ImplPtr;\r
+ char tmpBuf[disk->BytesPerCluster];\r
+ int bpc = disk->BytesPerCluster;\r
\r
ENTER("pNode Xoffset Xlength pbuffer", Node, Offset, Length, Buffer);\r
\r
return 0;\r
}\r
\r
- // Calculate and Allocate Bytes Per Cluster\r
- bpc = disk->BytesPerCluster;\r
- tmpBuf = (void*) malloc(bpc);\r
- if( !tmpBuf ) return 0;\r
- \r
// Cluster is stored in the low 32-bits of the Inode field\r
cluster = Node->Inode & 0xFFFFFFFF;\r
\r
LOG("First cluster only");\r
FAT_int_ReadCluster(disk, cluster, bpc, tmpBuf);\r
memcpy( Buffer, (void*)( tmpBuf + Offset%bpc ), Length );\r
- free(tmpBuf);\r
#if DEBUG\r
//Debug_HexDump("FAT_Read", Buffer, Length);\r
#endif\r
cluster = FAT_int_GetFatValue(disk, cluster);\r
if(cluster == -1) {\r
Log_Warning("FAT", "Offset is past end of cluster chain mark");\r
- free(tmpBuf);\r
LEAVE('i', 0);\r
return 0;\r
}\r
#if DEBUG\r
//Debug_HexDump("FAT_Read", Buffer, Length);\r
#endif\r
- free(tmpBuf);\r
LEAVE('i', 1);\r
return Length;\r
}\r
// Get next cluster in the chain\r
cluster = FAT_int_GetFatValue(disk, cluster);\r
if(cluster == -1) {\r
- Warning("FAT_Read - Read past End of Cluster Chain");\r
- free(tmpBuf);\r
+ Log_Warning("FAT", "FAT_Read: Read past End of Cluster Chain");\r
LEAVE('i', 0);\r
return 0;\r
}\r
// Get next cluster in the chain\r
cluster = FAT_int_GetFatValue(disk, cluster);\r
if(cluster == -1) {\r
- Warning("FAT_Read - Read past End of Cluster Chain");\r
- free(tmpBuf);\r
+ Log_Warning("FAT", "FAT_Read: Read past End of Cluster Chain");\r
LEAVE('i', 0);\r
return 0;\r
}\r
//Debug_HexDump("FAT_Read", Buffer, Length);\r
#endif\r
\r
- free(tmpBuf);\r
LEAVE('X', Length);\r
return Length;\r
}\r
Uint64 FAT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)\r
{\r
tFAT_VolInfo *disk = Node->ImplPtr;\r
- void *tmpBuf;\r
+ char tmpBuf[disk->BytesPerCluster];\r
int remLength = Length;\r
Uint32 cluster, tmpCluster;\r
int bNewCluster = 0;\r
\r
if( Offset + Length < disk->BytesPerCluster )\r
{\r
- tmpBuf = malloc( disk->BytesPerCluster );\r
+ char tmpBuf[disk->BytesPerCluster];\r
\r
// Read-Modify-Write\r
FAT_int_ReadCluster( disk, cluster, disk->BytesPerCluster, tmpBuf );\r
memcpy( tmpBuf + Offset, Buffer, Length );\r
FAT_int_WriteCluster( disk, cluster, tmpBuf );\r
\r
- free(tmpBuf);\r
return Length;\r
}\r
\r
// Clean up changes within a cluster\r
if( Offset )\r
- {\r
- tmpBuf = malloc( disk->BytesPerCluster );\r
- \r
+ { \r
// Read-Modify-Write\r
FAT_int_ReadCluster( disk, cluster, disk->BytesPerCluster, tmpBuf );\r
memcpy( tmpBuf + Offset, Buffer, disk->BytesPerCluster - Offset );\r
FAT_int_WriteCluster( disk, cluster, tmpBuf );\r
\r
- free(tmpBuf);\r
- \r
remLength -= disk->BytesPerCluster - Offset;\r
Buffer += disk->BytesPerCluster - Offset;\r
\r
memset(&node, 0, sizeof(tVFS_Node));\r
\r
// Set Other Data\r
- // 0-31: Cluster, 32-63: Parent Cluster\r
+ // 0-27: Cluster, 32-59: Parent Cluster\r
node.Inode = Entry->cluster | (Entry->clusterHi<<16) | (Parent->Inode << 32);\r
LOG("node.Inode = %llx", node.Inode);\r
// Position in parent directory\r
return NULL;\r
}\r
\r
+tVFS_Node *FAT_GetNodeFromINode(tVFS_Node *Root, Uint64 Inode)\r
+{\r
+ tFAT_VolInfo *disk = Root->ImplPtr;\r
+ int ents_per_sector = 512 / sizeof(fat_filetable); \r
+ fat_filetable fileinfo[ents_per_sector];\r
+ int sector = 0, i;\r
+ tVFS_Node stub_node;\r
+\r
+ ENTER("pRoot XInode", Root, Inode);\r
+\r
+ stub_node.ImplPtr = disk;\r
+ stub_node.Size = -1;\r
+ stub_node.Inode = Inode >> 32;\r
+\r
+ for( i = 0; ; i ++ )\r
+ {\r
+ if( i == 0 || i == ents_per_sector )\r
+ {\r
+ if(FAT_int_ReadDirSector(&stub_node, sector, fileinfo))\r
+ {\r
+ LOG("ReadDirSector failed");\r
+ LEAVE('n');\r
+ return NULL;\r
+ }\r
+ i = 0;\r
+ sector ++;\r
+ }\r
+ \r
+ // Check for free/end of list\r
+ if(fileinfo[i].name[0] == '\0') break; // End of List marker\r
+ if(fileinfo[i].name[0] == '\xE5') continue; // Free entry\r
+ \r
+ if(fileinfo[i].attrib == ATTR_LFN) continue;\r
+\r
+ LOG("fileinfo[i].cluster = %x %04x", fileinfo[i].clusterHi, fileinfo[i].cluster);\r
+ #if DEBUG\r
+ {\r
+ char tmpName[13];\r
+ FAT_int_ProperFilename(tmpName, fileinfo[i].name);\r
+ LOG("tmpName = '%s'", tmpName);\r
+ }\r
+ #endif\r
+ \r
+ \r
+ if(fileinfo[i].cluster != (Inode & 0xFFFF)) continue;\r
+ if(fileinfo[i].clusterHi != ((Inode >> 16) & 0xFFFF)) continue;\r
+\r
+ LEAVE_RET('p', FAT_int_CreateNode(&stub_node, &fileinfo[i], sector*ents_per_sector+i));\r
+ }\r
+ LOG("sector = %i, i = %i", sector, i);\r
+ LEAVE('n');\r
+ return NULL;\r
+}\r
+\r
#if SUPPORT_WRITE\r
/**\r
* \fn int FAT_Mknod(tVFS_Node *Node, char *Name, Uint Flags)\r