X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fvfs%2Fdir.c;h=911eff6f7d8bf3f0d958b6ed048a1c984d580d44;hb=6274aaa8894e14462a36c69090e2f9235f130e31;hp=fab9d563c37e49279eaa63b42db32edd6b1445ed;hpb=e4342ad9de52043cb8f820643794dc44076f9bd9;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/vfs/dir.c b/KernelLand/Kernel/vfs/dir.c index fab9d563..911eff6f 100644 --- a/KernelLand/Kernel/vfs/dir.c +++ b/KernelLand/Kernel/vfs/dir.c @@ -2,6 +2,7 @@ * Acess2 VFS * - Directory Management Functions */ +#define SANITY 1 #define DEBUG 0 #include #include @@ -68,26 +69,22 @@ int VFS_MkNod(const char *Path, Uint Flags) LOG("parent = %p", parent); if(!parent) { - LEAVE('i', -1); - return -1; // Error Check + errno = ENOENT; + goto _error; } // Permissions Check - if( !VFS_CheckACL(parent, VFS_PERM_EXECUTE|VFS_PERM_WRITE) ) { - _CloseNode(parent); - mountpt->OpenHandleCount --; - free(absPath); - LEAVE('i', -1); - return -1; + if( !VFS_CheckACL(parent, VFS_PERM_EXEC|VFS_PERM_WRITE) ) { + errno = EACCES; + goto _error; } LOG("parent = %p", parent); if(!parent->Type || !parent->Type->MkNod) { Log_Warning("VFS", "VFS_MkNod - Directory has no MkNod method"); - mountpt->OpenHandleCount --; - LEAVE('i', -1); - return -1; + errno = ENOTDIR; + goto _error; } // Create node @@ -98,12 +95,23 @@ int VFS_MkNod(const char *Path, Uint Flags) free(absPath); // Free Parent + ASSERT(mountpt->OpenHandleCount>0); mountpt->OpenHandleCount --; _CloseNode(parent); // Return whatever the driver said LEAVE('i', ret==NULL); return ret==NULL; + +_error: + if( parent ) { + _CloseNode(parent); + ASSERT(mountpt->OpenHandleCount>0); + mountpt->OpenHandleCount --; + } + free(absPath); + LEAVE('i', -1); + return -1; } /** @@ -123,6 +131,7 @@ int VFS_Symlink(const char *Name, const char *Link) realLink = VFS_GetAbsPath( Link ); if(!realLink) { Log_Warning("VFS", "Path '%s' is badly formed", Link); + errno = EINVAL; LEAVE('i', -1); return -1; } @@ -133,12 +142,19 @@ int VFS_Symlink(const char *Name, const char *Link) if( VFS_MkNod(Name, VFS_FFLAG_SYMLINK) != 0 ) { Log_Warning("VFS", "Unable to create link node '%s'", Name); free(realLink); + // errno is set by VFS_MkNod LEAVE('i', -2); return -2; // Make link node } // Write link address fp = VFS_Open(Name, VFS_OPENFLAG_WRITE|VFS_OPENFLAG_NOLINK); + if( fp == -1 ) { + Log_Warning("VFS", "Unable to open newly created symlink '%s'", Name); + free(realLink); + LEAVE('i', -3); + return -3; + } VFS_Write(fp, strlen(realLink), realLink); VFS_Close(fp); @@ -164,10 +180,12 @@ int VFS_ReadDir(int FD, char *Dest) return 0; } + #if 0 if(h->Node->Size != (Uint64)-1 && h->Position >= h->Node->Size) { //LEAVE('i', 0); return 0; } + #endif do { rv = h->Node->Type->ReadDir(h->Node, h->Position, Dest);