Bugfixing FAT Driver, Addint Multiboot2 Support
authorJohn Hodge <[email protected]>
Mon, 29 Mar 2010 02:33:00 +0000 (10:33 +0800)
committerJohn Hodge <[email protected]>
Mon, 29 Mar 2010 02:33:00 +0000 (10:33 +0800)
- I've decided not to support writing to FAT filesystems

Kernel/Makefile.BuildNum
Kernel/arch/x86/link.ld
Kernel/arch/x86/main.c
Kernel/arch/x86/mm_phys.c
Kernel/arch/x86/start.asm
Kernel/include/mboot.h
Modules/Filesystems/FAT/fat.c

index 200094b..f26427d 100644 (file)
@@ -1 +1 @@
-BUILD_NUM = 1602
+BUILD_NUM = 1633
index a142747..2fe1764 100644 (file)
@@ -3,12 +3,13 @@
  * Linker Script
  */
 
-lowStart = start - 0xC0000000;
-ENTRY(lowStart)
+//lowStart = start - 0xC0000000;
+ENTRY(start)
 OUTPUT_FORMAT(elf32-i386)
 
 SECTIONS {
        . = 0x100000;
+       __load_addr = .;
        .multiboot : AT(ADDR(.multiboot)) {
                *(.multiboot)
        }
@@ -58,6 +59,7 @@ SECTIONS {
                *(.data)
        }
 
+       __bss_start = .;
        .bss : AT(ADDR(.bss) - 0xC0000000) {
                _sbss = .;
                *(COMMON)
index 3ea4b0e..8660343 100644 (file)
@@ -5,6 +5,7 @@
  */
 #include <acess.h>
 #include <mboot.h>
+#include <multiboot2.h>
 #include <init.h>
 #include <mm_virt.h>
 #include <mp.h>
@@ -26,19 +27,46 @@ extern void Threads_Exit(void);
 extern int     Modules_LoadBuiltins(void);
 
 // === GLOBALS ===
+char   *gsBootCmdLine = NULL;
 
 // === CODE ===
-int kmain(Uint MbMagic, tMBoot_Info *MbInfo)
+int kmain(Uint MbMagic, void *MbInfoPtr)
 {
         int    i;
        tMBoot_Module   *mods;
+       tMBoot_Info     *mbInfo;
        
-       // Adjust Multiboot structure address
-       MbInfo = (void*)( (Uint)MbInfo + KERNEL_BASE );
+       Log("MbMagic = %08x", MbMagic);
+       Log("MbInfoPtr = %p", MbInfoPtr);
        
+       // Set up non-boot info dependent stuff
        Desctab_Install();      // Set up GDT and IDT
        MM_PreinitVirtual();    // Initialise vital mappings
-       MM_Install( MbInfo );   // Set up physical memory manager
+       
+       switch(MbMagic)
+       {
+       // Multiboot 1
+       case MULTIBOOT_MAGIC:
+               // Adjust Multiboot structure address
+               mbInfo = (void*)( (Uint)MbInfoPtr + KERNEL_BASE );
+               gsBootCmdLine = (char*)(mbInfo->CommandLine + KERNEL_BASE);
+               
+               MM_Install( mbInfo );   // Set up physical memory manager
+               break;
+       
+       // Multiboot 2
+       case MULTIBOOT2_MAGIC:
+               Warning("Multiboot 2 Not yet supported");
+               //MM_InstallMBoot2( MbInfo );   // Set up physical memory manager
+               return 0;
+               break;
+       
+       default:
+               Panic("Multiboot magic invalid %08x, expected %08x or %08x\n",
+                       MbMagic, MULTIBOOT_MAGIC, MULTIBOOT2_MAGIC);
+               return 0;
+       }
+       
        MM_InstallVirtual();    // Clean up virtual address space
        Heap_Install();         // Create initial heap
        
@@ -57,11 +85,11 @@ int kmain(Uint MbMagic, tMBoot_Info *MbInfo)
        Log("Initialising builtin modules...");
        Modules_LoadBuiltins();
        
-       Log("Loading %i Modules...", MbInfo->ModuleCount);
+       Log("Loading %i Modules...", mbInfo->ModuleCount);
        
        // Load initial modules
-       mods = (void*)( MbInfo->Modules + KERNEL_BASE );
-       for( i = 0; i < MbInfo->ModuleCount; i ++ )
+       mods = (void*)( mbInfo->Modules + KERNEL_BASE );
+       for( i = 0; i < mbInfo->ModuleCount; i ++ )
        {
                // Adjust into higher half
                mods[i].Start += KERNEL_BASE;
@@ -78,7 +106,7 @@ int kmain(Uint MbMagic, tMBoot_Info *MbInfo)
        
        // Pass on to Independent Loader
        Log("Loading Configuration...");
-       System_Init( (char*)(MbInfo->CommandLine + KERNEL_BASE) );
+       System_Init( gsBootCmdLine );
        
        // Sleep forever (sleeping beauty)
        for(;;)
index e4199e3..988a15e 100644 (file)
@@ -39,10 +39,12 @@ void MM_Install(tMBoot_Info *MBoot)
        tMBoot_MMapEnt  *ent;
        
        // --- Find largest address
+       Log("MBoot->MMapAddr = %08x", MBoot->MMapAddr);
        MBoot->MMapAddr |= KERNEL_BASE;
        ent = (void *)( MBoot->MMapAddr );
        while( (Uint)ent < MBoot->MMapAddr + MBoot->MMapLength )
        {
+               Log(" ent->Size = %08x", ent->Size);
                // Adjust for size
                ent->Size += 4;
                
@@ -89,10 +91,12 @@ void MM_Install(tMBoot_Info *MBoot)
        // Mark Multiboot's pages as taken
        // - Structure
        MM_RefPhys( (Uint)MBoot - KERNEL_BASE );
+       Log("MBoot->ModuleCount = %i", MBoot->ModuleCount);
        // - Module List
        for(i = (MBoot->ModuleCount*sizeof(tMBoot_Module)+0xFFF)>12; i--; )
                MM_RefPhys( MBoot->Modules + (i << 12) );
        // - Modules
+       Log("MBoot->Modules = %p", MBoot->Modules);
        mods = (void*)(MBoot->Modules + KERNEL_BASE);
        for(i = 0; i < MBoot->ModuleCount; i++)
        {
index f1d1ea7..b1884ae 100644 (file)
@@ -5,6 +5,9 @@
 \r
 KERNEL_BASE    equ 0xC0000000\r
 \r
+[extern __load_addr]\r
+[extern __bss_start]\r
+[extern gKernelEnd]\r
 [section .multiboot]\r
 mboot:\r
     ; Multiboot macros to make a few lines later more readable\r
@@ -20,6 +23,37 @@ mboot:
     dd MULTIBOOT_CHECKSUM\r
        dd mboot - KERNEL_BASE  ;Location of Multiboot Header\r
        \r
+; Multiboot 2 Header\r
+mboot2:\r
+    MULTIBOOT2_HEADER_MAGIC    equ 0xE85250D6\r
+    MULTIBOOT2_HEADER_ARCH     equ 0\r
+    MULTIBOOT2_HEADER_LENGTH   equ (mboot2_end-mboot2)\r
+    MULTIBOOT2_CHECKSUM        equ -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT2_HEADER_ARCH + MULTIBOOT2_HEADER_LENGTH)\r
+       \r
+    dd MULTIBOOT2_HEADER_MAGIC\r
+    dd MULTIBOOT2_HEADER_ARCH\r
+    dd MULTIBOOT2_HEADER_LENGTH\r
+    dd MULTIBOOT2_CHECKSUM\r
+       ; MBoot2 Address Header\r
+       dw      2, 0\r
+       dd      8 + 16\r
+       dd      mboot2  ; Location of Multiboot Header\r
+       dd      __load_addr - KERNEL_BASE       ; Kernel Load base\r
+       dd      __bss_start - KERNEL_BASE       ; Kernel Data End\r
+       dd      gKernelEnd - KERNEL_BASE        ; Kernel BSS End\r
+       ; MBoot2 Entry Point Tag\r
+       dw      3, 0\r
+       dd      8 + 4\r
+       dd      start - KERNEL_BASE\r
+       ; MBoot2 Module Alignment Tag\r
+       dw      6, 0\r
+       dd      12      ; ???\r
+       dd      0       ; Search me, seems it wants padding\r
+       ; Terminator\r
+       dw      0, 0\r
+       dd      8\r
+mboot2_end:\r
+       \r
 [section .text]\r
 [extern kmain]\r
 [global start]\r
index ff59d54..6d5e6a4 100644 (file)
@@ -5,6 +5,8 @@
 #ifndef _MBOOT_H
 #define _MBOOT_H
 
+#define MULTIBOOT_MAGIC        0x2BADB002
+
 // === TYPES ===
 typedef struct {
        Uint32  Flags;
index 9a3c79e..7796e3d 100644 (file)
@@ -1,16 +1,23 @@
 /*\r
  * Acess 2\r
  * FAT12/16/32 Driver Version (Incl LFN)\r
+ * \r
+ * NOTE: This driver will only support _reading_ long file names, not\r
+ * writing. I don't even know why i'm adding write-support. FAT sucks.\r
+ * \r
+ * Known Bugs:\r
+ * - LFN Is buggy in FAT_ReadDir\r
  */\r
 /**\r
  * \todo Implement changing of the parent directory when a file is written to\r
  * \todo Implement file creation / deletion\r
  */\r
-#define DEBUG  0\r
+#define DEBUG  1\r
 #define VERBOSE        1\r
 \r
 #define CACHE_FAT      1       //!< Caches the FAT in memory\r
 #define USE_LFN                1       //!< Enables the use of Long File Names\r
+#define        SUPPORT_WRITE   0\r
 \r
 #include <acess.h>\r
 #include <modules.h>\r
@@ -41,10 +48,12 @@ Uint32      FAT_int_GetFatValue(tFAT_VolInfo *Disk, Uint32 Cluster);
 Uint32 FAT_int_AllocateCluster(tFAT_VolInfo *Disk, Uint32 Previous);\r
 \r
 void   FAT_int_ReadCluster(tFAT_VolInfo *Disk, Uint32 Cluster, int Length, void *Buffer);\r
-void   FAT_int_WriteCluster(tFAT_VolInfo *Disk, Uint32 Cluster, void *Buffer);\r
-\r
 Uint64 FAT_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);\r
+#if SUPPORT_WRITE\r
+void   FAT_int_WriteCluster(tFAT_VolInfo *Disk, Uint32 Cluster, void *Buffer);\r
 Uint64 FAT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);\r
+#endif\r
+\r
 char   *FAT_ReadDir(tVFS_Node *Node, int ID);\r
 tVFS_Node      *FAT_FindDir(tVFS_Node *Node, char *Name);\r
  int   FAT_Mknod(tVFS_Node *Node, char *Name, Uint Flags);\r
@@ -241,8 +250,13 @@ tVFS_Node *FAT_InitDevice(char *Device, char **Options)
        node->Read = node->Write = NULL;\r
        node->ReadDir = FAT_ReadDir;\r
        node->FindDir = FAT_FindDir;\r
+       #if SUPPORT_WRITE\r
        node->Relink = FAT_Relink;\r
        node->MkNod = FAT_Mknod;\r
+       #else\r
+       node->Relink = NULL;\r
+       node->MkNod = NULL;\r
+       #endif\r
        //node->Close = FAT_Unmount;\r
        \r
        giFAT_PartCount ++;\r
@@ -290,12 +304,14 @@ int FAT_int_GetAddress(tVFS_Node *Node, Uint64 Offset, Uint64 *Addr, Uint32 *Clu
        ENTER("pNode XOffset", Node, Offset);\r
        \r
        cluster = Node->Inode & 0xFFFFFFFF;     // Cluster ID\r
+       LOG("cluster = %08x", cluster);\r
        \r
        // Do Cluster Skip\r
        // - Pre FAT32 had a reserved area for the root.\r
        if( disk->type == FAT32 || cluster != disk->rootOffset )\r
        {\r
                skip = Offset / disk->BytesPerCluster;\r
+               LOG("skip = %i", skip);\r
                // Skip previous clusters\r
                for(; skip-- ; )\r
                {\r
@@ -323,11 +339,12 @@ int FAT_int_GetAddress(tVFS_Node *Node, Uint64 Offset, Uint64 *Addr, Uint32 *Clu
                addr += cluster * disk->BytesPerCluster;\r
        }\r
        else {\r
-               addr = disk->firstDataSect;\r
+               addr = disk->firstDataSect * disk->bootsect.bps;\r
                addr += (cluster - 2) * disk->BytesPerCluster;\r
        }\r
        addr += Offset % disk->BytesPerCluster;\r
        \r
+       LOG("addr = 0x%08x", addr);\r
        *Addr = addr;\r
        LEAVE('i', 0);\r
        return 0;\r
@@ -373,6 +390,7 @@ Uint32 FAT_int_GetFatValue(tFAT_VolInfo *Disk, Uint32 cluster)
        return val;\r
 }\r
 \r
+#if SUPPORT_WRITE\r
 /**\r
  * \brief Allocate a new cluster\r
  */\r
@@ -504,6 +522,7 @@ Uint32 FAT_int_FreeCluster(tFAT_VolInfo *Disk, Uint32 Cluster)
        if(Disk->type == FAT32 && ret == EOC_FAT32)     ret = -1;\r
        return ret;\r
 }\r
+#endif\r
 \r
 /*\r
  * ====================\r
@@ -527,22 +546,6 @@ void FAT_int_ReadCluster(tFAT_VolInfo *Disk, Uint32 Cluster, int Length, void *B
        LEAVE('-');\r
 }\r
 \r
-/**\r
- * \brief Write a cluster to disk\r
- */\r
-void FAT_int_WriteCluster(tFAT_VolInfo *Disk, Uint32 Cluster, void *Buffer)\r
-{\r
-       ENTER("pDisk xCluster pBuffer", Disk, Cluster, Buffer);\r
-       VFS_ReadAt(\r
-               Disk->fileHandle,\r
-               (Disk->firstDataSect + (Cluster-2)*Disk->bootsect.spc )\r
-                       * Disk->bootsect.bps,\r
-               Disk->BytesPerCluster,\r
-               Buffer\r
-               );\r
-       LEAVE('-');\r
-}\r
-\r
 /* ====================\r
  *       File IO\r
  * ====================\r
@@ -668,6 +671,23 @@ Uint64 FAT_Read(tVFS_Node *Node, Uint64 offset, Uint64 length, void *buffer)
        return length;\r
 }\r
 \r
+#if SUPPORT_WRITE\r
+/**\r
+ * \brief Write a cluster to disk\r
+ */\r
+void FAT_int_WriteCluster(tFAT_VolInfo *Disk, Uint32 Cluster, void *Buffer)\r
+{\r
+       ENTER("pDisk xCluster pBuffer", Disk, Cluster, Buffer);\r
+       VFS_ReadAt(\r
+               Disk->fileHandle,\r
+               (Disk->firstDataSect + (Cluster-2)*Disk->bootsect.spc )\r
+                       * Disk->bootsect.bps,\r
+               Disk->BytesPerCluster,\r
+               Buffer\r
+               );\r
+       LEAVE('-');\r
+}\r
+\r
 /**\r
  * \brief Write to a file\r
  * \param Node File Node\r
@@ -772,6 +792,7 @@ Uint64 FAT_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        \r
        return Length;\r
 }\r
+#endif\r
 \r
 /* ====================\r
  *  File Names & Nodes\r
@@ -804,13 +825,14 @@ void FAT_int_ProperFilename(char *dest, char *src)
 }\r
 \r
 /**\r
- * \fn char *FAT_int_CreateName(tVFS_Node *parent, fat_filetable *ft, char *LongFileName)\r
+ * \fn char *FAT_int_CreateName(fat_filetable *ft, char *LongFileName)\r
  * \brief Converts either a LFN or a 8.3 Name into a proper name\r
  */\r
-char *FAT_int_CreateName(tVFS_Node *parent, fat_filetable *ft, char *LongFileName)\r
+char *FAT_int_CreateName(fat_filetable *ft, char *LongFileName)\r
 {\r
        char    *ret;\r
         int    len;\r
+       ENTER("pft sLongFileName", ft, LongFileName);\r
        #if USE_LFN\r
        if(LongFileName && LongFileName[0] != '\0')\r
        {       \r
@@ -827,32 +849,35 @@ char *FAT_int_CreateName(tVFS_Node *parent, fat_filetable *ft, char *LongFileNam
        #if USE_LFN\r
        }\r
        #endif\r
+       LEAVE('s', ret);\r
        return ret;\r
 }\r
 \r
 /**\r
- * \fn tVFS_Node *FAT_int_CreateNode(tVFS_Node *parent, fat_filetable *ft, char *LongFileName)\r
+ * \fn tVFS_Node *FAT_int_CreateNode(tVFS_Node *parent, fat_filetable *ft)\r
  * \brief Creates a tVFS_Node structure for a given file entry\r
  */\r
-tVFS_Node *FAT_int_CreateNode(tVFS_Node *parent, fat_filetable *ft, char *LongFileName)\r
+tVFS_Node *FAT_int_CreateNode(tVFS_Node *Parent, fat_filetable *Entry, int Pos)\r
 {\r
        tVFS_Node       node = {0};\r
        tVFS_Node       *ret;\r
-       tFAT_VolInfo    *disk = parent->ImplPtr;\r
+       tFAT_VolInfo    *disk = Parent->ImplPtr;\r
        \r
-       ENTER("pParent pFT sLongFileName", parent, ft, LongFileName);\r
+       ENTER("pParent pFT", Parent, Entry);\r
        \r
        // Set Other Data\r
-       node.Inode = ft->cluster | (ft->clusterHi<<16);\r
-       node.Size = ft->size;\r
-       LOG("ft->size = %i", ft->size);\r
-       node.ImplPtr = parent->ImplPtr;\r
+       node.Inode = Entry->cluster | (Entry->clusterHi<<16) | (Parent->Inode << 32);\r
+       LOG("node.Inode = %llx", node.Inode);\r
+       node.ImplInt = Pos & 0xFFFF;\r
+       node.ImplPtr = disk;\r
+       node.Size = Entry->size;\r
+       LOG("Entry->size = %i", Entry->size);\r
        node.UID = 0;   node.GID = 0;\r
        node.NumACLs = 1;\r
        \r
        node.Flags = 0;\r
-       if(ft->attrib & ATTR_DIRECTORY) node.Flags |= VFS_FFLAG_DIRECTORY;\r
-       if(ft->attrib & ATTR_READONLY) {\r
+       if(Entry->attrib & ATTR_DIRECTORY)      node.Flags |= VFS_FFLAG_DIRECTORY;\r
+       if(Entry->attrib & ATTR_READONLY) {\r
                node.Flags |= VFS_FFLAG_READONLY;\r
                node.ACLs = &gVFS_ACL_EveryoneRX;       // R-XR-XR-X\r
        }\r
@@ -861,38 +886,46 @@ tVFS_Node *FAT_int_CreateNode(tVFS_Node *parent, fat_filetable *ft, char *LongFi
        }\r
        \r
        node.ATime = timestamp(0,0,0,\r
-                       ((ft->adate&0x1F)-1),   //Days\r
-                       ((ft->adate&0x1E0)-1),          //Months\r
-                       1980+((ft->adate&0xFF00)>>8));  //Years\r
+                       ((Entry->adate&0x1F) - 1),      // Days\r
+                       ((Entry->adate&0x1E0) - 1),     // Months\r
+                       1980+((Entry->adate&0xFF00)>>8) // Years\r
+                       );\r
        \r
-       node.CTime = ft->ctimems * 10;  //Miliseconds\r
+       node.CTime = Entry->ctimems * 10;       // Miliseconds\r
        node.CTime += timestamp(\r
-                       (ft->ctime&0x1F)<<1,    //Seconds\r
-                       ((ft->ctime&0x3F0)>>5), //Minutes\r
-                       ((ft->ctime&0xF800)>>11),       //Hours\r
-                       ((ft->cdate&0x1F)-1),           //Days\r
-                       ((ft->cdate&0x1E0)-1),          //Months\r
-                       1980+((ft->cdate&0xFF00)>>8));  //Years\r
+                       ((Entry->ctime&0x1F)<<1),       // Seconds\r
+                       ((Entry->ctime&0x3F0)>>5),      // Minutes\r
+                       ((Entry->ctime&0xF800)>>11),    // Hours\r
+                       ((Entry->cdate&0x1F)-1),                // Days\r
+                       ((Entry->cdate&0x1E0)-1),               // Months\r
+                       1980+((Entry->cdate&0xFF00)>>8) // Years\r
+                       );\r
                        \r
        node.MTime = timestamp(\r
-                       (ft->mtime&0x1F)<<1,    //Seconds\r
-                       ((ft->mtime&0x3F0)>>5), //Minuites\r
-                       ((ft->mtime&0xF800)>>11),       //Hours\r
-                       ((ft->mdate&0x1F)-1),           //Days\r
-                       ((ft->mdate&0x1E0)-1),          //Months\r
-                       1980+((ft->mdate&0xFF00)>>8));  //Years\r
+                       ((Entry->mtime&0x1F)<<1),       // Seconds\r
+                       ((Entry->mtime&0x3F0)>>5),      // Minutes\r
+                       ((Entry->mtime&0xF800)>>11),    // Hours\r
+                       ((Entry->mdate&0x1F)-1),                // Days\r
+                       ((Entry->mdate&0x1E0)-1),               // Months\r
+                       1980+((Entry->mdate&0xFF00)>>8) // Years\r
+                       );\r
        \r
        if(node.Flags & VFS_FFLAG_DIRECTORY) {\r
+               //Log_Debug("FAT", "Directory %08x has size 0x%x", node.Inode, node.Size);\r
                node.ReadDir = FAT_ReadDir;\r
                node.FindDir = FAT_FindDir;\r
+               #if SUPPORT_WRITE\r
                node.MkNod = FAT_Mknod;\r
+               node.Relink = FAT_Relink;\r
+               #endif\r
                node.Size = -1;\r
        } else {\r
                node.Read = FAT_Read;\r
+               #if SUPPORT_WRITE\r
                node.Write = FAT_Write;\r
+               #endif\r
        }\r
        node.Close = FAT_CloseFile;\r
-       node.Relink = FAT_Relink;\r
        \r
        ret = Inode_CacheNode(disk->inodeHandle, &node);\r
        LEAVE('p', ret);\r
@@ -912,7 +945,7 @@ int FAT_int_ReadDirSector(tVFS_Node *Node, int Sector, fat_filetable *Buffer)
        Uint64  addr;\r
        tFAT_VolInfo    *disk = Node->ImplPtr;\r
        \r
-       ENTER("pNode iSector pEntry", Node, Sector, Buffer)\r
+       ENTER("pNode iSector pEntry", Node, Sector, Buffer);\r
        \r
        if(FAT_int_GetAddress(Node, Sector * 512, &addr, NULL))\r
        {\r
@@ -921,12 +954,17 @@ int FAT_int_ReadDirSector(tVFS_Node *Node, int Sector, fat_filetable *Buffer)
        }\r
        \r
        // Read Sector\r
-       VFS_ReadAt(disk->fileHandle, addr, 512, Buffer);        // Read Dir Data\r
+       if(VFS_ReadAt(disk->fileHandle, addr, 512, Buffer) != 512)\r
+       {\r
+               LEAVE('i', 1);\r
+               return 1;\r
+       }\r
        \r
        LEAVE('i', 0);\r
        return 0;\r
 }\r
 \r
+#if SUPPORT_WRITE\r
 /**\r
  * \brief Writes an entry to the disk\r
  * \todo Support expanding a directory\r
@@ -963,6 +1001,7 @@ int FAT_int_WriteDirEntry(tVFS_Node *Node, int ID, fat_filetable *Entry)
        LEAVE('i', 0);\r
        return 0;\r
 }\r
+#endif\r
 \r
 #if USE_LFN\r
 // I should probably more tightly associate the LFN cache with the node\r
@@ -1042,7 +1081,7 @@ char *FAT_ReadDir(tVFS_Node *Node, int ID)
        \r
        ENTER("pNode iID", Node, ID);\r
        \r
-       if(FAT_int_ReadDirSector(Node, ID, fileinfo))\r
+       if(FAT_int_ReadDirSector(Node, ID/16, fileinfo))\r
        {\r
                LEAVE('n');\r
                return NULL;\r
@@ -1096,6 +1135,7 @@ char *FAT_ReadDir(tVFS_Node *Node, int ID)
                lfn[ 7] = lfnInfo->name2[2];    lfn[ 8] = lfnInfo->name2[3];\r
                lfn[ 9] = lfnInfo->name2[4];    lfn[10] = lfnInfo->name2[5];\r
                lfn[11] = lfnInfo->name3[0];    lfn[12] = lfnInfo->name3[1];\r
+               LOG("lfn = '%s'", lfn);\r
                LEAVE('p', VFS_SKIP);\r
                return VFS_SKIP;\r
        }\r
@@ -1112,16 +1152,16 @@ char *FAT_ReadDir(tVFS_Node *Node, int ID)
                return VFS_SKIP;\r
        }       \r
        \r
-       LOG("name='%c%c%c%c%c%c%c%c.%c%c%c'\n",\r
+       LOG("name='%c%c%c%c%c%c%c%c.%c%c%c'",\r
                fileinfo[a].name[0], fileinfo[a].name[1], fileinfo[a].name[2], fileinfo[a].name[3],\r
                fileinfo[a].name[4], fileinfo[a].name[5], fileinfo[a].name[6], fileinfo[a].name[7],\r
                fileinfo[a].name[8], fileinfo[a].name[9], fileinfo[a].name[10] );\r
        \r
        #if USE_LFN\r
-       ret = FAT_int_CreateName(Node, &fileinfo[a], lfn);\r
+       ret = FAT_int_CreateName(&fileinfo[a], lfn);\r
        lfn[0] = '\0';\r
        #else\r
-       ret = FAT_int_CreateName(Node, &fileinfo[a], NULL);\r
+       ret = FAT_int_CreateName(&fileinfo[a], NULL);\r
        #endif\r
        \r
        LEAVE('s', ret);\r
@@ -1132,32 +1172,32 @@ char *FAT_ReadDir(tVFS_Node *Node, int ID)
  * \fn tVFS_Node *FAT_FindDir(tVFS_Node *node, char *name)\r
  * \brief Finds an entry in the current directory\r
  */\r
-tVFS_Node *FAT_FindDir(tVFS_Node *Node, char *name)\r
+tVFS_Node *FAT_FindDir(tVFS_Node *Node, char *Name)\r
 {\r
        fat_filetable   fileinfo[16];\r
-       char    tmpName[11];\r
+       char    tmpName[13];\r
        #if USE_LFN\r
        fat_longfilename        *lfnInfo;\r
        char    lfn[256];\r
         int    lfnPos=255, lfnId = -1;\r
        #endif\r
-        int    i=0;\r
+        int    i;\r
        tVFS_Node       *tmpNode;\r
        tFAT_VolInfo    *disk = Node->ImplPtr;\r
        Uint32  cluster;\r
        \r
-       ENTER("pNode sname", Node, name);\r
+       ENTER("pNode sname", Node, Name);\r
        \r
        // Fast Returns\r
-       if(!name || name[0] == '\0') {\r
+       if(!Name || Name[0] == '\0') {\r
                LEAVE('n');\r
                return NULL;\r
        }\r
        \r
-       for(;;i++)\r
+       for( i = 0; ; i++ )\r
        {\r
                if((i & 0xF) == 0) {\r
-                       if(FAT_int_ReadDirSector(Node, i, fileinfo))\r
+                       if(FAT_int_ReadDirSector(Node, i/16, fileinfo))\r
                        {\r
                                LEAVE('n');\r
                                return NULL;\r
@@ -1165,8 +1205,8 @@ tVFS_Node *FAT_FindDir(tVFS_Node *Node, char *name)
                }\r
                \r
                //Check if the files are free\r
-               if(fileinfo[i&0xF].name[0] == '\0')     break;  // Free and last\r
-               if(fileinfo[i&0xF].name[0] == '\xE5')   continue;       //Free\r
+               if(fileinfo[i&0xF].name[0] == '\0')     break;  // End of List marker\r
+               if(fileinfo[i&0xF].name[0] == '\xE5')   continue;       // Free entry\r
                \r
                \r
                #if USE_LFN\r
@@ -1198,28 +1238,21 @@ tVFS_Node *FAT_FindDir(tVFS_Node *Node, char *name)
                #endif\r
                        // Get Real Filename\r
                        FAT_int_ProperFilename(tmpName, fileinfo[i&0xF].name);\r
-               \r
                        LOG("tmpName = '%s'", tmpName);\r
                \r
-                       //Only Long name is case sensitive, 8.3 is not\r
+                       // Only the long name is case sensitive, 8.3 is not\r
                        #if USE_LFN\r
-                       if(strucmp(tmpName, name) == 0 || strcmp(lfn, name) == 0) {\r
+                       if(strucmp(tmpName, Name) == 0 || strcmp(lfn, Name) == 0)\r
                        #else\r
-                       if(strucmp(tmpName, name) == 0) {\r
+                       if(strucmp(tmpName, Name) == 0)\r
                        #endif\r
+                       {\r
                                cluster = fileinfo[i&0xF].cluster | (fileinfo[i&0xF].clusterHi << 16);\r
                                tmpNode = Inode_GetCache(disk->inodeHandle, cluster);\r
                                if(tmpNode == NULL)     // Node is not cached\r
                                {\r
-                                       #if USE_LFN\r
-                                       tmpNode = FAT_int_CreateNode(Node, &fileinfo[i&0xF], lfn);\r
-                                       #else\r
-                                       tmpNode = FAT_int_CreateNode(Node, &fileinfo[i&0xF], NULL);\r
-                                       #endif\r
+                                       tmpNode = FAT_int_CreateNode(Node, &fileinfo[i&0xF], i);\r
                                }\r
-                               #if USE_LFN\r
-                               lfn[0] = '\0';\r
-                               #endif\r
                                LEAVE('p', tmpNode);\r
                                return tmpNode;\r
                        }\r
@@ -1232,6 +1265,7 @@ tVFS_Node *FAT_FindDir(tVFS_Node *Node, char *name)
        return NULL;\r
 }\r
 \r
+#if SUPPORT_WRITE\r
 /**\r
  * \fn int FAT_Mknod(tVFS_Node *Node, char *Name, Uint Flags)\r
  * \brief Create a new node\r
@@ -1278,6 +1312,7 @@ int FAT_Relink(tVFS_Node *Node, char *OldName, char *NewName)
        child->Close( child );\r
        return ret;\r
 }\r
+#endif\r
 \r
 /**\r
  * \fn void FAT_CloseFile(tVFS_Node *Node)\r
@@ -1288,6 +1323,7 @@ void FAT_CloseFile(tVFS_Node *Node)
        tFAT_VolInfo    *disk = Node->ImplPtr;\r
        if(Node == NULL)        return ;\r
        \r
+       #if SUPPORT_WRITE\r
        // Update the node if it's dirty (don't bother if it's marked for\r
        // deletion)\r
        if( Node->ImplInt & FAT_FLAG_DIRTY && !(Node->ImplInt & FAT_FLAG_DELETE) )\r
@@ -1302,6 +1338,7 @@ void FAT_CloseFile(tVFS_Node *Node)
                \r
                Node->ImplInt &= ~FAT_FLAG_DIRTY;\r
        }\r
+       #endif\r
        \r
        // TODO: Make this more thread safe somehow, probably by moving the\r
        // Inode_UncacheNode higher up and saving the cluster value somewhere\r
@@ -1313,6 +1350,7 @@ void FAT_CloseFile(tVFS_Node *Node)
                        FAT_int_DelLFN(Node);\r
                #endif\r
                \r
+               #if SUPPORT_WRITE\r
                // Delete File\r
                if( Node->ImplInt & FAT_FLAG_DELETE ) {\r
                        // Since the node is marked, we only need to remove it's data\r
@@ -1320,6 +1358,7 @@ void FAT_CloseFile(tVFS_Node *Node)
                        while( cluster != -1 )\r
                                cluster = FAT_int_FreeCluster(Node->ImplPtr, cluster);\r
                }\r
+               #endif\r
        }\r
        \r
        Inode_UncacheNode(disk->inodeHandle, Node->Inode);\r

UCC git Repository :: git.ucc.asn.au