+
+/**
+ * \fn int VFS_ChRoot(char *New)
+ * \brief Change current root directory
+ */
+int VFS_ChRoot(const 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;
+}
+
+// === EXPORTS ===
+EXPORT(VFS_Open);
+EXPORT(VFS_Close);