Fixed heap troubles (and bugs in VFS_GetTruePath)
[tpg/acess2.git] / Kernel / vfs / dir.c
index d3214a4..3e004b9 100644 (file)
@@ -1,7 +1,11 @@
 /*
+ * Acess2 VFS
+ * - Directory Management Functions
  */
-#include "vfs.h"
-#include "vfs_int.h"
+#define DEBUG  0
+#include <acess.h>
+#include <vfs.h>
+#include <vfs_int.h>
 
 // === IMPORTS ===
 extern tVFS_Mount      *gRootMount;
@@ -30,39 +34,53 @@ int VFS_MkDir(char *Path)
 int VFS_MkNod(char *Path, Uint Flags)
 {
        char    *absPath, *name;
-        int    pos=0, oldpos = 0;
+        int    pos = 0, oldpos = 0;
+        int    next = 0;
        tVFS_Node       *parent;
         int    ret;
        
-       Debug_Enter("VFS_MkNod", "sPath xFlags", Path, Flags);
+       ENTER("sPath xFlags", Path, Flags);
        
        absPath = VFS_GetAbsPath(Path);
+       LOG("absPath = '%s'", absPath);
        
-       while( (pos = strpos8(&absPath[pos+1], '/')) != -1 )    oldpos = pos;
+       while( (next = strpos(&absPath[pos+1], '/')) != -1 ) {
+               LOG("next = %i", next);
+               pos += next+1;
+               LOG("pos = %i", pos);
+               oldpos = pos;
+       }
        absPath[oldpos] = '\0'; // Mutilate path
        name = &absPath[oldpos+1];
        
+       LOG("absPath = '%s', name = '%s'", absPath, name);
+       
        // Check for root
        if(absPath[0] == '\0')
                parent = VFS_ParsePath("/", NULL);
        else
                parent = VFS_ParsePath(absPath, NULL);
        
-       if(!parent)     return -1;      // Error Check
+       LOG("parent = %p", parent);
+       
+       if(!parent) {
+               LEAVE('i', -1);
+               return -1;      // Error Check
+       }
        
        // Permissions Check
        if( !VFS_CheckACL(parent, VFS_PERM_EXECUTE|VFS_PERM_WRITE) ) {
                if(parent->Close)       parent->Close( parent );
                free(absPath);
-               Debug_Leave("VFS_MkNod", 'i', -1);
+               LEAVE('i', -1);
                return -1;
        }
        
-       Debug_Log("VFS_MkNod", "parent = %p\n", parent);
+       LOG("parent = %p", parent);
        
        if(parent->MkNod == NULL) {
                Warning("VFS_MkNod - Directory has no MkNod method");
-               Debug_Leave("VFS_MkNod", 'i', -1);
+               LEAVE('i', -1);
                return -1;
        }
        
@@ -76,9 +94,12 @@ int VFS_MkNod(char *Path, Uint Flags)
        if(parent->Close)       parent->Close( parent );
        
        // Error Check
-       if(ret == 0)    return -1;
+       if(ret == 0) {
+               LEAVE('i', -1);
+               return -1;
+       }
        
-       Debug_Leave("VFS_MkNod", 'i', 0);
+       LEAVE('i', 0);
        return 0;
 }
 
@@ -94,7 +115,7 @@ int VFS_Symlink(char *Name, char *Link)
         int    fp;
        tVFS_Node       *destNode;
        
-       //LogF("vfs_symlink: (name='%s', link='%s')\n", name, link);
+       //ENTER("sName sLink", Name, Link);
        
        // Get absolue path name
        Link = VFS_GetAbsPath( Link );
@@ -141,15 +162,15 @@ int VFS_ReadDir(int FD, char *Dest)
        tVFS_Handle     *h = VFS_GetHandle(FD);
        char    *tmp;
        
-       ENTER("ph pDest", h, Dest);
+       //ENTER("ph pDest", h, Dest);
        
        if(!h || h->Node->ReadDir == NULL) {
-               LEAVE('i', 0);
+               //LEAVE('i', 0);
                return 0;
        }
        
-       if(h->Position >= h->Node->Size) {
-               LEAVE('i', 0);
+       if(h->Node->Size != -1 && h->Position >= h->Node->Size) {
+               //LEAVE('i', 0);
                return 0;
        }
        
@@ -159,18 +180,18 @@ int VFS_ReadDir(int FD, char *Dest)
                        h->Position += (Uint)tmp;
                else
                        h->Position ++;
-       } while((Uint)tmp < (Uint)VFS_MAXSKIP);
-       LOG("tmp = '%s'", tmp);
+       } while(tmp != NULL && (Uint)tmp < (Uint)VFS_MAXSKIP);
+       
+       //LOG("tmp = '%s'", tmp);
        
        if(!tmp) {
-               LEAVE('i', 0);
+               //LEAVE('i', 0);
                return 0;
        }
        
        strcpy(Dest, tmp);
+       free(tmp);
        
-       if(IsHeap(tmp)) free(tmp);
-       
-       LEAVE('i', 1);
+       //LEAVE('i', 1);
        return 1;
 }

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