// 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;
}
// 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;
// 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;
// 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;
}
if(TruePath) {
*TruePath = tmp;
retLength = strlen(tmp);
+ } else {
+ free(tmp); // Free temp string
}
continue;
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;
+ 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;
}