Kernel - Slight reworks to timer code
[tpg/acess2.git] / Kernel / vfs / dir.c
index 8e8234c..d4c1530 100644 (file)
@@ -2,7 +2,7 @@
  * Acess2 VFS
  * - Directory Management Functions
  */
-#define DEBUG  1
+#define DEBUG  0
 #include <acess.h>
 #include <vfs.h>
 #include <vfs_int.h>
 extern tVFS_Mount      *gRootMount;
 
 // === PROTOTYPES ===
- int   VFS_MkDir(char *Path);
- int   VFS_MkNod(char *Path, Uint Flags);
+#if 0
+ int   VFS_MkDir(const char *Path);
+ int   VFS_MkNod(const char *Path, Uint Flags);
+ int   VFS_Symlink(const char *Name, const char *Link);
+#endif
 
 // === CODE ===
 /**
@@ -20,7 +23,7 @@ extern tVFS_Mount     *gRootMount;
  * \brief Create a new node
  * \param Path Path of directory to create
  */
-int VFS_MkDir(char *Path)
+int VFS_MkDir(const char *Path)
 {
        return VFS_MkNod(Path, VFS_FFLAG_DIRECTORY);
 }
@@ -31,7 +34,7 @@ int VFS_MkDir(char *Path)
  * \param Path Path of new node
  * \param Flags        Flags to apply to the node
  */
-int VFS_MkNod(char *Path, Uint Flags)
+int VFS_MkNod(const char *Path, Uint Flags)
 {
        char    *absPath, *name;
         int    pos = 0, oldpos = 0;
@@ -57,9 +60,9 @@ int VFS_MkNod(char *Path, Uint Flags)
        
        // Check for root
        if(absPath[0] == '\0')
-               parent = VFS_ParsePath("/", NULL);
+               parent = VFS_ParsePath("/", NULL, NULL);
        else
-               parent = VFS_ParsePath(absPath, NULL);
+               parent = VFS_ParsePath(absPath, NULL, NULL);
        
        LOG("parent = %p", parent);
        
@@ -70,7 +73,7 @@ int VFS_MkNod(char *Path, Uint Flags)
        
        // Permissions Check
        if( !VFS_CheckACL(parent, VFS_PERM_EXECUTE|VFS_PERM_WRITE) ) {
-               if(parent->Close)       parent->Close( parent );
+               _CloseNode(parent);
                free(absPath);
                LEAVE('i', -1);
                return -1;
@@ -78,20 +81,20 @@ int VFS_MkNod(char *Path, Uint Flags)
        
        LOG("parent = %p", parent);
        
-       if(parent->MkNod == NULL) {
+       if(!parent->Type || !parent->Type->MkNod) {
                Warning("VFS_MkNod - Directory has no MkNod method");
                LEAVE('i', -1);
                return -1;
        }
        
        // Create node
-       ret = parent->MkNod(parent, name, Flags);
+       ret = parent->Type->MkNod(parent, name, Flags);
        
        // Free allocated string
        free(absPath);
        
        // Free Parent
-       if(parent->Close)       parent->Close( parent );
+       _CloseNode(parent);
        
        // Error Check
        if(ret == 0) {
@@ -104,42 +107,33 @@ int VFS_MkNod(char *Path, Uint Flags)
 }
 
 /**
- * \fn int VFS_Symlink(char *Name, char *Link)
+ * \fn int VFS_Symlink(const char *Name, const char *Link)
  * \brief Creates a symlink called \a Name to \a Link
  * \param Name Name of symbolic link
  * \param Link Destination of symbolic link
  */
-int VFS_Symlink(char *Name, char *Link)
+int VFS_Symlink(const char *Name, const char *Link)
 {
        char    *realLink;
         int    fp;
-       tVFS_Node       *destNode;
        
-       //ENTER("sName sLink", Name, Link);
+       ENTER("sName sLink", Name, Link);
        
        // Get absolue path name
-       Link = VFS_GetAbsPath( Link );
-       if(!Link) {
-               Warning("Path '%s' is badly formed", Link);
-               return -1;
-       }
-       
-       // Get true path and node
-       destNode = VFS_ParsePath( Link, &realLink );
-       free(Link);
-       
-       // Check if destination exists
-       if(!destNode) {
-               Warning("File '%s' does not exist, symlink not created", Link);
+       realLink = VFS_GetAbsPath( Link );
+       if(!realLink) {
+               Log_Warning("VFS", "Path '%s' is badly formed", Link);
+               LEAVE('i', -1);
                return -1;
        }
-       
-       // Derefence the destination
-       if(destNode->Close)     destNode->Close(destNode);
-       
+
+       LOG("realLink = '%s'", realLink);
+
        // Make node
        if( VFS_MkNod(Name, VFS_FFLAG_SYMLINK) != 0 ) {
-               Warning("Unable to create link node '%s'", Name);
+               Log_Warning("VFS", "Unable to create link node '%s'", Name);
+               free(realLink);
+               LEAVE('i', -2);
                return -2;      // Make link node
        }
        
@@ -150,6 +144,7 @@ int VFS_Symlink(char *Name, char *Link)
        
        free(realLink);
        
+       LEAVE('i', 1);
        return 1;
 }
 
@@ -164,7 +159,7 @@ int VFS_ReadDir(int FD, char *Dest)
        
        //ENTER("ph pDest", h, Dest);
        
-       if(!h || h->Node->ReadDir == NULL) {
+       if(!h || !h->Node->Type || !h->Node->Type->ReadDir) {
                //LEAVE('i', 0);
                return 0;
        }
@@ -175,7 +170,7 @@ int VFS_ReadDir(int FD, char *Dest)
        }
        
        do {
-               tmp = h->Node->ReadDir(h->Node, h->Position);
+               tmp = h->Node->Type->ReadDir(h->Node, h->Position);
                if((Uint)tmp < (Uint)VFS_MAXSKIP)
                        h->Position += (Uint)tmp;
                else

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