Added `strdup` library function and removed VFS_FREEPLZ, also added valid tVFS_Node...
authorJohn Hodge <[email protected]>
Sat, 26 Sep 2009 02:19:13 +0000 (10:19 +0800)
committerJohn Hodge <[email protected]>
Sat, 26 Sep 2009 02:19:13 +0000 (10:19 +0800)
Kernel/drv/ata_x86.c
Kernel/drv/pci.c
Kernel/drv/vterm.c
Kernel/include/common.h
Kernel/include/vfs.h
Kernel/lib.c
Kernel/vfs/dir.c
Kernel/vfs/fs/devfs.c
Kernel/vfs/fs/fat.c
Kernel/vfs/fs/root.c

index 837085b..ae6c55f 100644 (file)
@@ -115,6 +115,7 @@ tDevFS_Driver       gATA_DriverInfo = {
        NULL, "ata",
        {
                .NumACLs = 1,
+               .Size = -1,
                .Flags = VFS_FFLAG_DIRECTORY,
                .ACLs = &gVFS_ACL_EveryoneRX,
                .ReadDir = ATA_ReadDir,
@@ -247,6 +248,8 @@ void ATA_SetupVFS()
                for( j = 0; j < gATA_Disks[i].NumPartitions; j ++ )
                        gATA_Nodes[ k++ ] = &gATA_Disks[i].Partitions[j].Node;
        }
+       
+       gATA_DriverInfo.RootNode.Size = giATA_NumNodes;
 }
 
 /**
@@ -604,7 +607,7 @@ Uint16 ATA_GetBasePort(int Disk)
 char *ATA_ReadDir(tVFS_Node *Node, int Pos)
 {
        if(Pos >= giATA_NumNodes || Pos < 0)    return NULL;
-       return gATA_Nodes[Pos]->ImplPtr;
+       return strdup( gATA_Nodes[Pos]->ImplPtr );
 }
 
 /**
index e0a25b5..35977e1 100644 (file)
@@ -61,6 +61,7 @@ tDevFS_Driver gPCI_DriverStruct = {
        NULL, "pci",\r
        {\r
        .Flags = VFS_FFLAG_DIRECTORY,\r
+       .Size = -1,\r
        .NumACLs = 1,\r
        .ACLs = &gVFS_ACL_EveryoneRX,\r
        .ReadDir = PCI_ReadDirRoot,\r
@@ -163,7 +164,7 @@ char *PCI_ReadDirRoot(tVFS_Node *node, int pos)
        if(pos < 0 || pos >= giPCI_DeviceCount)\r
                return NULL;\r
        \r
-       return gPCI_Devices[pos].Name;\r
+       return strdup( gPCI_Devices[pos].Name );\r
 }\r
 /**\r
  * \fn tVFS_Node *PCI_FindDirRoot(tVFS_Node *node, char *filename)\r
index 522a882..af92717 100644 (file)
@@ -72,6 +72,7 @@ tDevFS_Driver gVT_DrvInfo = {
        NULL, "VTerm",
        {
        .Flags = VFS_FFLAG_DIRECTORY,
+       .Size = NUM_VTS,
        .Inode = -1,
        .NumACLs = 0,
        .ReadDir = VT_ReadDir,
@@ -194,7 +195,7 @@ char *VT_ReadDir(tVFS_Node *Node, int Pos)
 {
        if(Pos < 0)     return NULL;
        if(Pos >= NUM_VTS)      return NULL;
-       return gVT_Terminals[Pos].Name;
+       return strdup( gVT_Terminals[Pos].Name );
 }
 
 /**
index 4fb0952..8b8d5a5 100644 (file)
@@ -82,6 +82,7 @@ extern char   *strcpy(char *__dest, char *__src);
 extern int     strcmp(char *__dest, char *__src);
 extern int     strncmp(char *Str1, char *Str2, size_t num);
 extern int     strucmp(char *Str1, char *Str2);
+extern char    *strdup(char *__str);
 extern int     strpos(char *Str, char Ch);
 extern int     strpos8(char *str, Uint32 search);
 extern void    itoa(char *buf, Uint num, int base, int minLength, char pad);
index cbec140..32caf1b 100644 (file)
@@ -63,7 +63,7 @@ typedef struct sVFS_Node {
        
        //! Find an directory entry by name
        struct sVFS_Node        *(*FindDir)(struct sVFS_Node *Node, char *Name);
-       //! Read from a directory
+       //! Read from a directory - MUST return a heap address
        char    *(*ReadDir)(struct sVFS_Node *Node, int Pos);
        //! Create a node in a directory
         int    (*MkNod)(struct sVFS_Node *Node, char *Name, Uint Flags);
@@ -88,7 +88,6 @@ typedef struct sVFS_Driver {
 #define        VFS_MAXSKIP     ((void*)1024)
 #define        VFS_SKIP        ((void*)1)
 #define        VFS_SKIPN(n)    ((void*)(n))
-#define VFS_FREEPLZ(ptr)       ((void*)(((Uint)ptr)|1))
 extern tVFS_Node       NULLNode;
 extern tVFS_ACL        gVFS_ACL_EveryoneRWX;
 extern tVFS_ACL        gVFS_ACL_EveryoneRW;
index 0dbb9b9..35805b5 100644 (file)
@@ -142,6 +142,18 @@ int strncmp(char *Str1, char *Str2, size_t num)
        return *Str1-*Str2;
 }
 
+/**
+ * \fn char *strdup(char *str)
+ * \brief Duplicates a string
+ */
+char *strdup(char *str)
+{
+       char    *ret;
+       ret = malloc(strlen(str)+1);
+       strcpy(ret, str);
+       return ret;
+}
+
 /**
  * \fn int strpos8(char *str, Uint32 search)
  * \brief Search a string for a UTF-8 character
index 5ee1661..15f90b6 100644 (file)
@@ -132,7 +132,6 @@ int VFS_Symlink(char *Name, char *Link)
        return 1;
 }
 
-#define READDIR_FIXUP(ptr)     (void*)( (Uint)(ptr) & ~1 )
 /**
  * \fn int VFS_ReadDir(int FD, char *Dest)
  * \brief Read from a directory
@@ -162,17 +161,15 @@ int VFS_ReadDir(int FD, char *Dest)
                        h->Position ++;
        } while(tmp != NULL && (Uint)tmp < (Uint)VFS_MAXSKIP);
        
-       //LOG("tmp = '%s'", READDIR_FIXUP(tmp));
+       //LOG("tmp = '%s'", tmp);
        
        if(!tmp) {
                //LEAVE('i', 0);
                return 0;
        }
        
-       strcpy(Dest, READDIR_FIXUP(tmp));
-       
-       if((Uint)tmp & 1)
-               free(READDIR_FIXUP(tmp));
+       strcpy(Dest, tmp);
+       free(tmp);
        
        //LEAVE('i', 1);
        return 1;
index 82b0387..9bb60ab 100644 (file)
@@ -64,7 +64,7 @@ char *DevFS_ReadDir(tVFS_Node *Node, int Pos)
                dev = dev->Next
                );
        
-       return dev->Name;
+       return strdup(dev->Name);
 }
 
 /**
index 5bd7bac..8a55827 100644 (file)
@@ -743,7 +743,7 @@ char *FAT_ReadDir(tVFS_Node *dirNode, int dirpos)
        #endif\r
        \r
        LEAVE('s', ret);\r
-       return VFS_FREEPLZ(ret);\r
+       return ret;\r
 }\r
 \r
 /**\r
index 4a81715..2f5d6e5 100644 (file)
@@ -146,7 +146,7 @@ char *Root_ReadDir(tVFS_Node *Node, int Pos)
        
        if(Pos) return child->Name;
        
-       return child->Name;
+       return strdup(child->Name);
 }
 
 /**

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