X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fvfs%2Fopen.c;h=54838e94eba69261169ed9c5a578b9118f3da532;hb=e349c65dfdc7bb37c83bcf8eb34f26fe7efc7869;hp=fa5fe66f96f29a5e805783d46de9fdab5f0f00cc;hpb=346dd128d3d15f0af34346355cb248e7f414431e;p=tpg%2Facess2.git diff --git a/Kernel/vfs/open.c b/Kernel/vfs/open.c index fa5fe66f..54838e94 100644 --- a/Kernel/vfs/open.c +++ b/Kernel/vfs/open.c @@ -392,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; } @@ -495,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; }