Cleanup
[tpg/acess2.git] / Kernel / vfs / open.c
index 0013dee..6f03417 100644 (file)
@@ -31,8 +31,9 @@ char *VFS_GetAbsPath(char *Path)
        char    *ret;
         int    pathLen = strlen(Path);
         int    read, write;
-        int    pos, slashNum=1, baseLen;
-       Uint    slashOffsets[MAX_PATH_SLASHES] = {1};
+        int    pos, endLen;
+        int    slashNum = 0;
+       Uint    slashOffsets[MAX_PATH_SLASHES];
        char    *cwd = CFGPTR(CFG_VFS_CWD);
         int    cwdLen;
        
@@ -52,17 +53,24 @@ char *VFS_GetAbsPath(char *Path)
        
        // 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);
-               baseLen = 1;
        } else {
-               cwdLen = strlen(cwd);
+               if(cwd == NULL) {
+                       cwd = "/";
+                       cwdLen = 1;
+               }
+               else {
+                       cwdLen = strlen(cwd);
+               }
+               endLen = cwdLen + pathLen + 2;
                // Prepend the current directory
-               ret = malloc(cwdLen+pathLen+2);
+               ret = malloc(endLen);
                strcpy(ret, cwd);
                ret[cwdLen] = '/';
                strcpy(&ret[cwdLen+1], Path);
@@ -70,28 +78,28 @@ char *VFS_GetAbsPath(char *Path)
        
        // Remove . and ..
        read = write = 1;       // Cwd has already been parsed
-       for(; read < baseLen+pathLen; read = pos+1)
+       for(; read < endLen; read = pos+1)
        {
                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+pathLen;
+               if(pos == -1)   pos = endLen;
                else    pos += read;    // Else, Adjust to absolute
                
-               //Log("pos-read = %i", pos-read);
-               
                // Check Length
                if(pos - read <= 2)
                {
-                       //Log("&ret[read] = '%s'", &ret[read]);
                        // Current Dir "."
                        if(strncmp(&ret[read], ".", pos-read) == 0)     continue;
                        // Parent ".."
                        if(strncmp(&ret[read], "..", pos-read) == 0)
                        {
                                // If there is no higher, silently ignore
-                               if(slashNum < 2)        continue;
+                               if(slashNum < 1) {
+                                       write = 1;
+                                       continue;
+                               }
                                // Reverse write pointer
-                               write = slashOffsets[ --slashNum - 1 ];
+                               write = slashOffsets[ --slashNum ];
                                continue;
                        }
                }
@@ -99,10 +107,10 @@ char *VFS_GetAbsPath(char *Path)
                
                // Only copy if the positions differ
                if(read != write) {
-                       Log("write = %i, read = %i", write, read);
+                       //Log("write = %i, read = %i, pos-read+1 = %i", write, read, pos-read+1);
                        memcpy( &ret[write], &ret[read], pos-read+1 );
+                       //Log("ret = '%s'", ret);
                }
-               write += (pos-read)+1;
                
                if(slashNum < MAX_PATH_SLASHES)
                        slashOffsets[ slashNum++ ] = write;
@@ -112,11 +120,15 @@ char *VFS_GetAbsPath(char *Path)
                        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);
-       Log("VFS_GetAbsPath: RETURN '%s'", ret);
+       //Log("VFS_GetAbsPath: RETURN '%s'", ret);
        return ret;
 }
 
@@ -529,7 +541,8 @@ int VFS_ChDir(char *New)
        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;
        

UCC git Repository :: git.ucc.asn.au