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
Changed back to lottery scheduler, disabled debug
[tpg/acess2.git]
/
Kernel
/
vfs
/
open.c
diff --git
a/Kernel/vfs/open.c
b/Kernel/vfs/open.c
index
d5e940e
..
40c1d39
100644
(file)
--- a/
Kernel/vfs/open.c
+++ b/
Kernel/vfs/open.c
@@
-4,6
+4,7
@@
*/
#define DEBUG 0
#include <acess.h>
*/
#define DEBUG 0
#include <acess.h>
+#include <mm_virt.h>
#include "vfs.h"
#include "vfs_int.h"
#include "vfs_ext.h"
#include "vfs.h"
#include "vfs_int.h"
#include "vfs_ext.h"
@@
-23,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);
@@
-166,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
@@
-190,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 );
@@
-201,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;
@@
-259,13
+260,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) ) {
@@
-287,27
+290,25
@@
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, '%s')", curNode,
pathEle
);
// Get Child Node
// Get Child Node
- tmpNode = curNode->FindDir(curNode,
&Path[ofs]
);
+ tmpNode = curNode->FindDir(curNode,
pathEle
);
LOG("tmpNode = %p", tmpNode);
if(curNode->Close) curNode->Close(curNode);
curNode = tmpNode;
// Error Check
if(!curNode) {
LOG("tmpNode = %p", tmpNode);
if(curNode->Close) curNode->Close(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;
}
@@
-318,11
+319,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;
}
@@
-331,21
+340,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;
@@
-364,11
+376,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;
@@
-376,9
+389,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
@@
-651,6
+678,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