git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Near-Complete Joystick spec
[tpg/acess2.git]
/
Kernel
/
vfs
/
open.c
diff --git
a/Kernel/vfs/open.c
b/Kernel/vfs/open.c
index
04facc7
..
5420b33
100644
(file)
--- a/
Kernel/vfs/open.c
+++ b/
Kernel/vfs/open.c
@@
-1,5
+1,5
@@
/*
/*
- * Acess
Micro
VFS
+ * Acess
2
VFS
* - Open, Close and ChDir
*/
#define DEBUG 0
* - Open, Close and ChDir
*/
#define DEBUG 0
@@
-24,10
+24,10
@@
tVFS_Handle *gaKernelHandles = (void*)MM_KERNEL_VFS;
// === CODE ===
/**
// === CODE ===
/**
- * \fn char *VFS_GetAbsPath(char *Path)
+ * \fn char *VFS_GetAbsPath(c
onst c
har *Path)
* \brief Create an absolute path from a relative one
*/
* \brief Create an absolute path from a relative one
*/
-char *VFS_GetAbsPath(char *Path)
+char *VFS_GetAbsPath(c
onst c
har *Path)
{
char *ret;
int pathLen = strlen(Path);
{
char *ret;
int pathLen = strlen(Path);
@@
-167,10
+167,10
@@
char *VFS_GetAbsPath(char *Path)
}
/**
}
/**
- * \fn char *VFS_ParsePath(char *Path, char **TruePath)
+ * \fn char *VFS_ParsePath(c
onst c
har *Path, char **TruePath)
* \brief Parses a path, resolving sysmlinks and applying permissions
*/
* \brief Parses a path, resolving sysmlinks and applying permissions
*/
-tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
+tVFS_Node *VFS_ParsePath(c
onst c
har *Path, char **TruePath)
{
tVFS_Mount *mnt;
tVFS_Mount *longestMount = gVFS_RootMount; // Root is first
{
tVFS_Mount *mnt;
tVFS_Mount *longestMount = gVFS_RootMount; // Root is first
@@
-191,8
+191,8
@@
tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
LEAVE('p', curNode);
return curNode;
}
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 );
if(Path[0] == '/' && Path[1] == '\0') {
if(TruePath) {
*TruePath = malloc( gVFS_RootMount->MountPointLen+1 );
@@
-202,7
+202,7
@@
tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
return gVFS_RootMount->RootNode;
}
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;
if(!gVFS_Mounts) {
Warning("WTF! There's nothing mounted?");
return NULL;
@@
-237,12
+237,6
@@
tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
longestMount = mnt;
}
longestMount = mnt;
}
- // Sanity Check
- /*if(!longestMount) {
- Log("VFS_ParsePath - ERROR: No Root Node\n");
- return NULL;
- }*/
-
// Save to shorter variable
mnt = longestMount;
// Save to shorter variable
mnt = longestMount;
@@
-260,13
+254,15
@@
tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
curNode->ReferenceCount ++;
// Parse Path
ofs = mnt->MountPointLen+1;
curNode->ReferenceCount ++;
// Parse Path
ofs = mnt->MountPointLen+1;
- for(; (nextSlash = strpos(&Path[ofs], '/')) != -1;
Path[nextSlash]='/',ofs
= nextSlash + 1)
+ for(; (nextSlash = strpos(&Path[ofs], '/')) != -1;
ofs +
= nextSlash + 1)
{
{
- nextSlash += ofs;
- Path[nextSlash] = '\0';
-
- // Check for empty string
- if( Path[ofs] == '\0' ) continue;
+ char pathEle[nextSlash+1];
+
+ // Empty String
+ if(nextSlash == 0) continue;
+
+ memcpy(pathEle, &Path[ofs], nextSlash);
+ pathEle[nextSlash] = 0;
// Check permissions on root of filesystem
if( !VFS_CheckACL(curNode, VFS_PERM_EXECUTE) ) {
// Check permissions on root of filesystem
if( !VFS_CheckACL(curNode, VFS_PERM_EXECUTE) ) {
@@
-288,27
+284,28
@@
tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
free(*TruePath);
*TruePath = NULL;
}
free(*TruePath);
*TruePath = NULL;
}
- Path[nextSlash] = '/';
//Log("FindDir fail on '%s'", Path);
LEAVE('n');
return NULL;
}
//Log("FindDir fail on '%s'", Path);
LEAVE('n');
return NULL;
}
- LOG("FindDir
(%p, '%s')", curNode, &Path[ofs]
);
+ LOG("FindDir
{=%p}(%p, '%s')", curNode->FindDir, curNode, pathEle
);
// Get Child Node
// Get Child Node
- tmpNode = curNode->FindDir(curNode,
&Path[ofs]
);
+ tmpNode = curNode->FindDir(curNode,
pathEle
);
LOG("tmpNode = %p", tmpNode);
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
if(!curNode) {
curNode = tmpNode;
// Error Check
if(!curNode) {
- LOG("Node '%s' not found in dir '%s'",
&Path[ofs]
, Path);
+ LOG("Node '%s' not found in dir '%s'",
pathEle
, Path);
if(TruePath) {
free(*TruePath);
*TruePath = NULL;
}
if(TruePath) {
free(*TruePath);
*TruePath = NULL;
}
- //Log("Child fail on '%s' ('%s)", Path, &Path[ofs]);
- Path[nextSlash] = '/';
+ //Log("Child fail on '%s' ('%s)", Path, pathEle);
LEAVE('n');
return NULL;
}
LEAVE('n');
return NULL;
}
@@
-319,11
+316,19
@@
tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
free(*TruePath);
*TruePath = NULL;
}
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);
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;
}
LEAVE('n');
return NULL;
}
@@
-332,21
+337,24
@@
tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
// Parse Symlink Path
curNode = VFS_ParsePath(tmp, TruePath);
// Parse Symlink Path
curNode = VFS_ParsePath(tmp, TruePath);
+ if(TruePath)
+ LOG("VFS", "*TruePath='%s'", *TruePath);
// Error Check
if(!curNode) {
// Error Check
if(!curNode) {
- Log
(
"Symlink fail '%s'", tmp);
+ Log
_Debug("VFS",
"Symlink fail '%s'", tmp);
free(tmp); // Free temp string
free(tmp); // Free temp string
+ if(TruePath) free(TruePath);
LEAVE('n');
return NULL;
}
LEAVE('n');
return NULL;
}
+ // Free temp link
+ free(tmp);
+
// Set Path Variable
if(TruePath) {
// Set Path Variable
if(TruePath) {
- *TruePath = tmp;
- retLength = strlen(tmp);
- } else {
- free(tmp); // Free temp string
+ retLength = strlen(*TruePath);
}
continue;
}
continue;
@@
-365,11
+373,12
@@
tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
if(!TruePath) continue;
// Increase buffer space
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);
// 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;
if(curNode->Close) curNode->Close(curNode);
LEAVE('n');
return NULL;
@@
-377,9
+386,23
@@
tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
*TruePath = tmp;
// Append to path
(*TruePath)[retLength] = '/';
*TruePath = tmp;
// Append to path
(*TruePath)[retLength] = '/';
- strcpy(*TruePath+retLength+1, &Path[ofs]);
+ strcpy(*TruePath+retLength+1, pathEle);
+
+ LOG("*TruePath = '%s'", *TruePath);
+
// - Extend Path
// - Extend Path
- retLength += strlen(&Path[ofs])+1;
+ 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
}
// Get last node
@@
-435,6
+458,10
@@
int VFS_Open(char *Path, Uint Mode)
// Get absolute path
absPath = VFS_GetAbsPath(Path);
// Get absolute path
absPath = VFS_GetAbsPath(Path);
+ if(absPath == NULL) {
+ Log_Warning("VFS", "VFS_Open: Path expansion failed '%s'", Path);
+ return -1;
+ }
LOG("absPath = \"%s\"", absPath);
// Parse path and get mount point
node = VFS_ParsePath(absPath, NULL);
LOG("absPath = \"%s\"", absPath);
// Parse path and get mount point
node = VFS_ParsePath(absPath, NULL);
@@
-652,6
+679,14
@@
void VFS_Close(int FD)
return;
}
return;
}
+ #if VALIDATE_VFS_FUNCTIPONS
+ if(h->Node->Close && !MM_GetPhysAddr(h->Node->Close)) {
+ Log_Warning("VFS", "Node %p's ->Close method is invalid (%p)",
+ h->Node, h->Node->Close);
+ return ;
+ }
+ #endif
+
if(h->Node->Close)
h->Node->Close( h->Node );
if(h->Node->Close)
h->Node->Close( h->Node );
UCC
git Repository :: git.ucc.asn.au