// Memory File
if(Path[0] == '$') {
ret = malloc(strlen(Path)+1);
+ if(!ret) {
+ Warning("VFS_GetAbsPath - malloc() returned NULL");
+ return NULL;
+ }
strcpy(ret, Path);
LEAVE('p', ret);
return ret;
// Check if the path is already absolute
if(Path[0] == '/') {
ret = malloc(pathLen + 1);
+ if(!ret) {
+ Warning("VFS_GetAbsPath - malloc() returned NULL");
+ return NULL;
+ }
strcpy(ret, Path);
baseLen = 1;
} else {
if( !(Mode & VFS_OPENFLAG_NOLINK) && (node->Flags & VFS_FFLAG_SYMLINK) )
{
if( !node->Read ) {
- LOG("No read method on symlink");
+ Warning("No read method on symlink");
LEAVE('i', -1);
return -1;
}
h->Node = NULL;
}
+/**
+ * \fn int VFS_ChDir(char *New)
+ * \brief Change current working directory
+ */
+int VFS_ChDir(char *New)
+{
+ char *buf;
+ int fd;
+ tVFS_Handle *h;
+
+ // Create Absolute
+ buf = VFS_GetAbsPath(New);
+ if(buf == NULL) {
+ Log("VFS_ChDir: Path expansion failed");
+ return -1;
+ }
+
+ // Check if path exists
+ fd = VFS_Open(buf, VFS_OPENFLAG_EXEC);
+ if(fd == -1) {
+ Log("VFS_ChDir: 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("VFS_ChDir: Path is not a directory");
+ VFS_Close(fd);
+ return -1;
+ }
+
+ // Close file
+ VFS_Close(fd);
+
+ // Free working directory and set new one
+ free( CFGPTR(CFG_VFS_CWD) );
+ CFGPTR(CFG_VFS_CWD) = buf;
+
+ Log("Updated CWD to '%s'", buf);
+
+ return 1;
+}
+
/**
* \fn tVFS_Handle *VFS_GetHandle(int FD)
* \brief Gets a pointer to the handle information structure