/*
- * AcessMicro VFS
+ * Acess2 VFS
* - Open, Close and ChDir
*/
#define DEBUG 0
}
/**
- * \fn char *VFS_ParsePath(char *Path, char **TruePath)
+ * \fn char *VFS_ParsePath(const char *Path, char **TruePath)
* \brief Parses a path, resolving sysmlinks and applying permissions
*/
tVFS_Node *VFS_ParsePath(const char *Path, char **TruePath)
LEAVE('p', curNode);
return curNode;
}
- // For root we always fast return
+ // For root we always fast return
if(Path[0] == '/' && Path[1] == '\0') {
if(TruePath) {
*TruePath = malloc( gVFS_RootMount->MountPointLen+1 );
return gVFS_RootMount->RootNode;
}
- // Check if there is anything mounted
+ // Check if there is an`ything mounted
if(!gVFS_Mounts) {
Warning("WTF! There's nothing mounted?");
return NULL;
longestMount = mnt;
}
- // Sanity Check
- /*if(!longestMount) {
- Log("VFS_ParsePath - ERROR: No Root Node\n");
- return NULL;
- }*/
-
// Save to shorter variable
mnt = longestMount;
curNode->ReferenceCount ++;
// Parse Path
ofs = mnt->MountPointLen+1;
- for(; (nextSlash = strpos(&Path[ofs], '/')) != -1; ofs = nextSlash + 1)
+ for(; (nextSlash = strpos(&Path[ofs], '/')) != -1; ofs += nextSlash + 1)
{
char pathEle[nextSlash+1];
LEAVE('n');
return NULL;
}
- LOG("FindDir(%p, '%s')", curNode, pathEle);
+ LOG("FindDir{=%p}(%p, '%s')", curNode->FindDir, curNode, pathEle);
// Get Child Node
tmpNode = curNode->FindDir(curNode, pathEle);
LOG("tmpNode = %p", tmpNode);
- if(curNode->Close) curNode->Close(curNode);
+ if(curNode->Close) {
+ //LOG2("curNode->Close = %p", curNode->Close);
+ curNode->Close(curNode);
+ }
curNode = tmpNode;
// Error Check
free(*TruePath);
*TruePath = NULL;
}
- tmp = malloc( curNode->Size + 1 );
if(!curNode->Read) {
Warning("VFS_ParsePath - Read of node %p is NULL (%s)",
curNode, Path);
if(curNode->Close) curNode->Close(curNode);
+ // No need to free *TruePath, see above
+ LEAVE('n');
+ return NULL;
+ }
+
+ tmp = malloc( curNode->Size + 1 );
+ if(!tmp) {
+ Log_Warning("VFS", "VFS_ParsePath - Malloc failure");
+ // No need to free *TruePath, see above
LEAVE('n');
return NULL;
}
// Parse Symlink Path
curNode = VFS_ParsePath(tmp, TruePath);
if(TruePath)
- Log_Debug("VFS", "*TruePath='%s'", *TruePath);
+ LOG("VFS", "*TruePath='%s'", *TruePath);
// Error Check
if(!curNode) {
- Log("Symlink fail '%s'", tmp);
+ Log_Debug("VFS", "Symlink fail '%s'", tmp);
free(tmp); // Free temp string
+ if(TruePath) free(TruePath);
LEAVE('n');
return NULL;
}
if(!TruePath) continue;
// Increase buffer space
- tmp = realloc( *TruePath, retLength + strlen(&Path[ofs]) + 1 + 1 );
+ tmp = realloc( *TruePath, retLength + strlen(pathEle) + 1 + 1 );
// Check if allocation succeeded
if(!tmp) {
Warning("VFS_ParsePath - Unable to reallocate true path buffer");
free(*TruePath);
+ *TruePath = NULL;
if(curNode->Close) curNode->Close(curNode);
LEAVE('n');
return NULL;
// Append to path
(*TruePath)[retLength] = '/';
strcpy(*TruePath+retLength+1, pathEle);
+
+ LOG("*TruePath = '%s'", *TruePath);
+
// - Extend Path
- retLength += nextSlash;
+ retLength += nextSlash + 1;
+ }
+
+ if( !curNode->FindDir ) {
+ if(curNode->Close) curNode->Close(curNode);
+ if(TruePath) {
+ free(*TruePath);
+ *TruePath = NULL;
+ }
+ Log("FindDir fail on '%s'", Path);
+ LEAVE('n');
+ return NULL;
}
// Get last node