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
Cleanup
[tpg/acess2.git]
/
Kernel
/
vfs
/
open.c
diff --git
a/Kernel/vfs/open.c
b/Kernel/vfs/open.c
index
b9ebd55
..
6f03417
100644
(file)
--- a/
Kernel/vfs/open.c
+++ b/
Kernel/vfs/open.c
@@
-31,7
+31,8
@@
char *VFS_GetAbsPath(char *Path)
char *ret;
int pathLen = strlen(Path);
int read, write;
char *ret;
int pathLen = strlen(Path);
int read, write;
- int pos, slashNum=0, baseLen;
+ int pos, endLen;
+ int slashNum = 0;
Uint slashOffsets[MAX_PATH_SLASHES];
char *cwd = CFGPTR(CFG_VFS_CWD);
int cwdLen;
Uint slashOffsets[MAX_PATH_SLASHES];
char *cwd = CFGPTR(CFG_VFS_CWD);
int cwdLen;
@@
-52,43
+53,38
@@
char *VFS_GetAbsPath(char *Path)
// Check if the path is already absolute
if(Path[0] == '/') {
// Check if the path is already absolute
if(Path[0] == '/') {
+ endLen = pathLen + 1;
ret = malloc(pathLen + 1);
if(!ret) {
Warning("VFS_GetAbsPath - malloc() returned NULL");
return NULL;
}
strcpy(ret, Path);
ret = malloc(pathLen + 1);
if(!ret) {
Warning("VFS_GetAbsPath - malloc() returned NULL");
return NULL;
}
strcpy(ret, Path);
- baseLen = 1;
} else {
} else {
- cwdLen = strlen(cwd);
+ if(cwd == NULL) {
+ cwd = "/";
+ cwdLen = 1;
+ }
+ else {
+ cwdLen = strlen(cwd);
+ }
+ endLen = cwdLen + pathLen + 2;
// Prepend the current directory
// Prepend the current directory
- ret = malloc(
cwdLen+pathLen+2
);
+ ret = malloc(
endLen
);
strcpy(ret, cwd);
ret[cwdLen] = '/';
strcpy(&ret[cwdLen+1], Path);
strcpy(ret, cwd);
ret[cwdLen] = '/';
strcpy(&ret[cwdLen+1], Path);
-
- // Pre-fill the slash positions
- read = 1; slashNum = 0;
- while( (pos = strpos( &ret[read], '/' )) != -1 && slashNum < MAX_PATH_SLASHES )
- {
- read += pos+1;
- slashOffsets[slashNum++] = pos;
- }
-
- baseLen = cwdLen+1;
}
// Remove . and ..
}
// Remove . and ..
- read = write =
baseLen;
// Cwd has already been parsed
- for(; read <
baseLen+path
Len; read = pos+1)
+ read = write =
1;
// Cwd has already been parsed
+ for(; read <
end
Len; read = pos+1)
{
pos = strpos( &ret[read], '/' );
// If we are in the last section, force a break at the end of the itteration
{
pos = strpos( &ret[read], '/' );
// If we are in the last section, force a break at the end of the itteration
- if(pos == -1) pos =
baseLen+path
Len;
+ if(pos == -1) pos =
end
Len;
else pos += read; // Else, Adjust to absolute
else pos += read; // Else, Adjust to absolute
- Log("pos-read = %i", pos-read);
-
// Check Length
if(pos - read <= 2)
{
// Check Length
if(pos - read <= 2)
{
@@
-98,9
+94,12
@@
char *VFS_GetAbsPath(char *Path)
if(strncmp(&ret[read], "..", pos-read) == 0)
{
// If there is no higher, silently ignore
if(strncmp(&ret[read], "..", pos-read) == 0)
{
// If there is no higher, silently ignore
- if(!slashNum) continue;
+ if(slashNum < 1) {
+ write = 1;
+ continue;
+ }
// Reverse write pointer
// Reverse write pointer
- write = slashOffsets[
slashNum--
];
+ write = slashOffsets[
--slashNum
];
continue;
}
}
continue;
}
}
@@
-108,22
+107,28
@@
char *VFS_GetAbsPath(char *Path)
// Only copy if the positions differ
if(read != write) {
// Only copy if the positions differ
if(read != write) {
+ //Log("write = %i, read = %i, pos-read+1 = %i", write, read, pos-read+1);
memcpy( &ret[write], &ret[read], pos-read+1 );
memcpy( &ret[write], &ret[read], pos-read+1 );
+ //Log("ret = '%s'", ret);
}
}
- write = pos+1;
+
if(slashNum < MAX_PATH_SLASHES)
if(slashNum < MAX_PATH_SLASHES)
- slashOffsets[ slashNum++ ] =
pos
;
+ slashOffsets[ slashNum++ ] =
write
;
else {
LOG("Path '%s' has too many elements", Path);
free(ret);
LEAVE('n');
return NULL;
}
else {
LOG("Path '%s' has too many elements", Path);
free(ret);
LEAVE('n');
return NULL;
}
+
+ // Increment write pointer
+ write += (pos-read)+1;
}
}
+ ret[write] = '\0'; // Cap string (to deal with . or .. being the last terms)
// `ret` should now be the absolute path
LEAVE('s', ret);
// `ret` should now be the absolute path
LEAVE('s', ret);
- Log("VFS_GetAbsPath: RETURN '%s'", ret);
+
//
Log("VFS_GetAbsPath: RETURN '%s'", ret);
return ret;
}
return ret;
}
@@
-536,7
+541,8
@@
int VFS_ChDir(char *New)
VFS_Close(fd);
// Free old working directory
VFS_Close(fd);
// Free old working directory
- if( CFGPTR(CFG_VFS_CWD) ) free( CFGPTR(CFG_VFS_CWD) );
+ if( CFGPTR(CFG_VFS_CWD) )
+ free( CFGPTR(CFG_VFS_CWD) );
// Set new
CFGPTR(CFG_VFS_CWD) = buf;
// Set new
CFGPTR(CFG_VFS_CWD) = buf;
UCC
git Repository :: git.ucc.asn.au