Cleanup and Bugfixes
[tpg/acess2.git] / Kernel / vfs / open.c
index 50641ca..3a68703 100644 (file)
@@ -34,10 +34,11 @@ char *VFS_GetAbsPath(char *Path)
        char    *tmpStr;
        int             iPos = 0;
        int             iPos2 = 0;
+       char    *chroot = CFGPTR(CFG_VFS_CHROOT);
+        int    chrootLen;
        char    *cwd = CFGPTR(CFG_VFS_CWD);
         int    cwdLen;
        
-       
        ENTER("sPath", Path);
        
        // Memory File
@@ -52,6 +53,14 @@ char *VFS_GetAbsPath(char *Path)
                return ret;
        }
        
+       // - Fetch ChRoot
+       if( chroot == NULL ) {
+               chroot = "";
+               chrootLen = 0;
+       } else {
+               chrootLen = strlen(chroot);
+       }
+       
        // Check if the path is already absolute
        if(Path[0] == '/') {
                ret = malloc(pathLen + 1);
@@ -143,6 +152,14 @@ char *VFS_GetAbsPath(char *Path)
        else
                ret[iPos2] = 0;
        
+       
+       // Prepend the chroot
+       tmpStr = malloc(chrootLen + strlen(ret) + 1);
+       strcpy( tmpStr, chroot );
+       strcpy( tmpStr+chrootLen, ret );
+       free(ret);
+       ret = tmpStr;
+       
        LEAVE('s', ret);
        //Log("VFS_GetAbsPath: RETURN '%s'", ret);
        return ret;
@@ -578,6 +595,55 @@ int VFS_ChDir(char *New)
        return 1;
 }
 
+/**
+ * \fn int VFS_ChRoot(char *New)
+ * \brief Change current root directory
+ */
+int VFS_ChRoot(char *New)
+{
+       char    *buf;
+        int    fd;
+       tVFS_Handle     *h;
+       
+       if(New[0] == '/' && New[1] == '\0')
+               return 1;       // What a useless thing to ask!
+       
+       // Create Absolute
+       buf = VFS_GetAbsPath(New);
+       if(buf == NULL) {
+               LOG("Path expansion failed");
+               return -1;
+       }
+       
+       // Check if path exists
+       fd = VFS_Open(buf, VFS_OPENFLAG_EXEC);
+       if(fd == -1) {
+               LOG("Path is invalid");
+               return -1;
+       }
+       
+       // Get node so we can check for directory
+       h = VFS_GetHandle(fd);
+       if( !(h->Node->Flags & VFS_FFLAG_DIRECTORY) ) {
+               LOG("Path is not a directory");
+               VFS_Close(fd);
+               return -1;
+       }
+       
+       // Close file
+       VFS_Close(fd);
+       
+       // Free old working directory
+       if( CFGPTR(CFG_VFS_CHROOT) )
+               free( CFGPTR(CFG_VFS_CHROOT) );
+       // Set new
+       CFGPTR(CFG_VFS_CHROOT) = buf;
+       
+       LOG("Updated Root to '%s'", buf);
+       
+       return 1;
+}
+
 /**
  * \fn tVFS_Handle *VFS_GetHandle(int FD)
  * \brief Gets a pointer to the handle information structure
@@ -600,3 +666,7 @@ tVFS_Handle *VFS_GetHandle(int FD)
        if(h->Node == NULL)     return NULL;
        return h;
 }
+
+// === EXPORTS ===
+EXPORT(VFS_Open);
+EXPORT(VFS_Close);

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