Various Changes
[tpg/acess2.git] / Kernel / vfs / open.c
index a374614..a1245f3 100644 (file)
@@ -30,12 +30,14 @@ 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};
+       char    *pathComps[MAX_PATH_SLASHES];
+       char    *tmpStr;
+       int             iPos = 0;
+       int             iPos2 = 0;
        char    *cwd = CFGPTR(CFG_VFS_CWD);
         int    cwdLen;
        
+       
        ENTER("sPath", Path);
        
        // Memory File
@@ -58,64 +60,91 @@ char *VFS_GetAbsPath(char *Path)
                        return NULL;
                }
                strcpy(ret, Path);
-               baseLen = 1;
        } else {
-               cwdLen = strlen(cwd);
+               if(cwd == NULL) {
+                       cwd = "/";
+                       cwdLen = 1;
+               }
+               else {
+                       cwdLen = strlen(cwd);
+               }
                // Prepend the current directory
-               ret = malloc(cwdLen+pathLen+2);
+               ret = malloc( cwdLen + 1 + pathLen + 1 );
                strcpy(ret, cwd);
                ret[cwdLen] = '/';
                strcpy(&ret[cwdLen+1], Path);
+               //Log("ret = '%s'\n", ret);
        }
        
-       // Remove . and ..
-       read = write = 1;       // Cwd has already been parsed
-       for(; read < baseLen+pathLen; read = pos+1)
+       // Parse Path
+       pathComps[iPos++] = tmpStr = ret+1;
+       while(*tmpStr)
        {
-               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;
-               else    pos += read;    // Else, Adjust to absolute
-               
-               //Log("pos-read = %i", pos-read);
-               
-               // Check Length
-               if(pos - read <= 2)
+               if(*tmpStr++ == '/')
                {
-                       //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;
-                               // Reverse write pointer
-                               write = slashOffsets[ --slashNum - 1 ];
-                               continue;
+                       pathComps[iPos++] = tmpStr;
+                       if(iPos == MAX_PATH_SLASHES) {
+                               LOG("Path '%s' has too many elements", Path);
+                               free(ret);
+                               LEAVE('n');
+                               return NULL;
                        }
                }
-               
-               
-               // Only copy if the positions differ
-               if(read != write) {
-                       Log("write = %i, read = %i", write, read);
-                       memcpy( &ret[write], &ret[read], pos-read );
+       }
+       pathComps[iPos] = NULL;
+       
+       // Cleanup
+       iPos2 = iPos = 0;
+       while(pathComps[iPos])
+       {
+               tmpStr = pathComps[iPos];
+               // Always Increment iPos
+               iPos++;
+               // ..
+               if(tmpStr[0] == '.' && tmpStr[1] == '.' && (tmpStr[2] == '/' || tmpStr[2] == '\0') )
+               {
+                       if(iPos2 != 0)
+                               iPos2 --;
+                       continue;
                }
-               write = pos+1;
-               if(slashNum < MAX_PATH_SLASHES)
-                       slashOffsets[ slashNum++ ] = pos;
-               else {
-                       LOG("Path '%s' has too many elements", Path);
-                       free(ret);
-                       LEAVE('n');
-                       return NULL;
+               // .
+               if(tmpStr[0] == '.' && (tmpStr[1] == '/' || tmpStr[1] == '\0') )
+               {
+                       continue;
                }
+               // Empty
+               if(tmpStr[0] == '/' || tmpStr[0] == '\0')
+               {
+                       continue;
+               }
+               
+               // Set New Position
+               pathComps[iPos2] = tmpStr;
+               iPos2++;
        }
+       pathComps[iPos2] = NULL;
+       
+       // Build New Path
+       iPos2 = 1;      iPos = 0;
+       ret[0] = '/';
+       while(pathComps[iPos])
+       {
+               tmpStr = pathComps[iPos];
+               while(*tmpStr && *tmpStr != '/')
+               {
+                       ret[iPos2++] = *tmpStr;
+                       tmpStr++;
+               }
+               ret[iPos2++] = '/';
+               iPos++;
+       }
+       if(iPos2 > 1)
+               ret[iPos2-1] = 0;
+       else
+               ret[iPos2] = 0;
        
-       // `ret` should now be the absolute path
        LEAVE('s', ret);
-       Log("VFS_GetAbsPath: RETURN '%s'", ret);
+       //Log("VFS_GetAbsPath: RETURN '%s'", ret);
        return ret;
 }
 
@@ -156,7 +185,10 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
        }
        
        // Check if there is anything mounted
-       if(!gMounts)    return NULL;
+       if(!gMounts) {
+               Warning("WTF! There's nothing mounted?");
+               return NULL;
+       }
        
        // Find Mountpoint
        for(mnt = gMounts;
@@ -189,7 +221,7 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
        
        // Sanity Check
        /*if(!longestMount) {
-               Log("VFS_GetTruePath - ERROR: No Root Node\n");
+               Log("VFS_ParsePath - ERROR: No Root Node\n");
                return NULL;
        }*/
        
@@ -225,6 +257,7 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
                                free(*TruePath);
                                *TruePath = NULL;
                        }
+                       //Log("Permissions fail on '%s'", Path);
                        LEAVE('n');
                        return NULL;
                }
@@ -237,6 +270,7 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
                                *TruePath = NULL;
                        }
                        Path[nextSlash] = '/';
+                       //Log("FindDir fail on '%s'", Path);
                        LEAVE('n');
                        return NULL;
                }
@@ -255,6 +289,7 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
                                free(*TruePath);
                                *TruePath = NULL;
                        }
+                       //Log("Child fail on '%s' ('%s)", Path, &Path[ofs]);
                        Path[nextSlash] = '/';
                        LEAVE('n');
                        return NULL;
@@ -275,6 +310,7 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
                        
                        // Error Check
                        if(!curNode) {
+                               Log("Symlink fail '%s'", tmp);
                                free(tmp);      // Free temp string
                                LEAVE('n');
                                return NULL;
@@ -329,6 +365,7 @@ tVFS_Node *VFS_ParsePath(char *Path, char **TruePath)
        // Check if file was found
        if(!tmpNode) {
                LOG("Node '%s' not found in dir '%s'", &Path[ofs], Path);
+               Log("Child fail '%s' ('%s')", Path, &Path[ofs]);
                if(TruePath)    free(*TruePath);
                if(curNode->Close)      curNode->Close(curNode);
                LEAVE('n');
@@ -403,6 +440,7 @@ int VFS_Open(char *Path, Uint Mode)
        }
        
        if(!node) {
+               LOG("Cannot find node");
                LEAVE('i', -1);
                return -1;
        }
@@ -417,6 +455,7 @@ int VFS_Open(char *Path, Uint Mode)
        // Permissions Check
        if( !VFS_CheckACL(node, i) ) {
                node->Close( node );
+               Log("VFS_Open: Permissions Failed");
                LEAVE('i', -1);
                return -1;
        }
@@ -467,6 +506,7 @@ int VFS_Open(char *Path, Uint Mode)
                }
        }
        
+       Log("VFS_Open: Out of handles");
        LEAVE('i', -1);
        return -1;
 }
@@ -528,7 +568,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