X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fvfs%2Fopen.c;h=54838e94eba69261169ed9c5a578b9118f3da532;hb=e349c65dfdc7bb37c83bcf8eb34f26fe7efc7869;hp=f025e0de0d9044d47b971f7ddbcaed5dcbc72ce8;hpb=8bc40333b1401d7616b225945fee53d972c2f418;p=tpg%2Facess2.git diff --git a/Kernel/vfs/open.c b/Kernel/vfs/open.c index f025e0de..54838e94 100644 --- a/Kernel/vfs/open.c +++ b/Kernel/vfs/open.c @@ -224,7 +224,10 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath) // Check permissions on root of filesystem if( !VFS_CheckACL(curNode, VFS_PERM_EXECUTE) ) { curNode->Close( curNode ); - if(TruePath) free(*TruePath); + if(TruePath) { + free(*TruePath); + *TruePath = NULL; + } LEAVE('n'); return NULL; } @@ -232,7 +235,10 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath) // Check if the node has a FindDir method if(!curNode->FindDir) { if(curNode->Close) curNode->Close(curNode); - if(TruePath) free(*TruePath); + if(TruePath) { + free(*TruePath); + *TruePath = NULL; + } Path[nextSlash] = '/'; LEAVE('n'); return NULL; @@ -248,8 +254,10 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath) // Error Check if(!curNode) { LOG("Node '%s' not found in dir '%s'", &Path[ofs], Path); - if(TruePath) + if(TruePath) { free(*TruePath); + *TruePath = NULL; + } Path[nextSlash] = '/'; LEAVE('n'); return NULL; @@ -257,18 +265,20 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath) // Handle Symbolic Links if(curNode->Flags & VFS_FFLAG_SYMLINK) { - if(TruePath) + if(TruePath) { free(*TruePath); + *TruePath = NULL; + } tmp = malloc( curNode->Size + 1 ); curNode->Read( curNode, 0, curNode->Size, tmp ); tmp[ curNode->Size ] = '\0'; // Parse Symlink Path curNode = VFS_ParsePath(tmp, TruePath); - free(tmp); // Free temp string // Error Check if(!curNode) { + free(tmp); // Free temp string LEAVE('n'); return NULL; } @@ -277,6 +287,8 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath) if(TruePath) { *TruePath = tmp; retLength = strlen(tmp); + } else { + free(tmp); // Free temp string } continue; @@ -380,7 +392,7 @@ int VFS_Open(char *Path, Uint Mode) 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; } @@ -483,20 +495,60 @@ void VFS_Close(int FD) h->Node = NULL; } +/** + * \fn int VFS_ChDir(char *New) + * \brief Change current working directory + */ +int VFS_ChDir(char *New) +{ + char *buf; + tVFS_Node *node; + + // Create Absolute + buf = VFS_GetAbsPath(New); + if(buf == NULL) return -1; + + // Check if path is valid + node = VFS_ParsePath(buf, NULL); + if(!node) return -1; + + // Check if is a directory + if( !(node->Flags & VFS_FFLAG_DIRECTORY) ) { + if(node->Close) node->Close(node); + return -1; + } + // Close node + if(node->Close) node->Close(node); + + // Copy over + strcpy(buf, New); + + // Free old and set new + free( CFGPTR(CFG_VFS_CWD) ); + CFGPTR(CFG_VFS_CWD) = buf; + + return 1; +} + /** * \fn tVFS_Handle *VFS_GetHandle(int FD) * \brief Gets a pointer to the handle information structure */ tVFS_Handle *VFS_GetHandle(int FD) { + tVFS_Handle *h; + if(FD < 0) return NULL; if(FD & VFS_KERNEL_FLAG) { FD &= (VFS_KERNEL_FLAG - 1); if(FD >= MAX_KERNEL_FILES) return NULL; - return &gaKernelHandles[ FD ]; + h = &gaKernelHandles[ FD ]; } else { if(FD >= CFGINT(CFG_VFS_MAXFILES)) return NULL; - return &gaUserHandles[ FD ]; + h = &gaUserHandles[ FD ]; } + + if(h->Node == NULL) return NULL; + return h; }