X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fvfs%2Fdir.c;h=cd45121307728c0565248cf5b2b3b9ab4e9654d0;hb=097d17ad093701091b0925aa7b13378cb9aed9df;hp=fcf361ec23c1a1aa08690a40a581aa5941155f21;hpb=4842e2d6740bcb81da4e94019285bfd2c45425b8;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/vfs/dir.c b/KernelLand/Kernel/vfs/dir.c index fcf361ec..cd451213 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 @@ -41,7 +42,7 @@ int VFS_MkNod(const char *Path, Uint Flags) int pos = 0, oldpos = 0; int next = 0; tVFS_Node *parent; - int ret; + tVFS_Node *ret; ENTER("sPath xFlags", Path, Flags); @@ -68,46 +69,47 @@ 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; + 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 ret = parent->Type->MkNod(parent, name, Flags); + _CloseNode(ret); // Free allocated string free(absPath); // Free Parent + ASSERT(mountpt->OpenHandleCount>0); mountpt->OpenHandleCount --; _CloseNode(parent); - - // Error Check - if(ret != 0) { - LEAVE('i', -1); - return -1; - } - - LEAVE('i', 0); - return 0; + + // Return whatever the driver said + LEAVE('i', ret==NULL); + return ret==NULL; + +_error: + _CloseNode(parent); + ASSERT(mountpt->OpenHandleCount>0); + mountpt->OpenHandleCount --; + free(absPath); + LEAVE('i', -1); + return -1; } /** @@ -127,6 +129,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; } @@ -137,12 +140,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); @@ -159,7 +169,7 @@ int VFS_Symlink(const char *Name, const char *Link) int VFS_ReadDir(int FD, char *Dest) { tVFS_Handle *h = VFS_GetHandle(FD); - char *tmp; + int rv; //ENTER("ph pDest", h, Dest); @@ -168,29 +178,24 @@ int VFS_ReadDir(int FD, char *Dest) return 0; } - if(h->Node->Size != -1 && h->Position >= h->Node->Size) { + if(h->Node->Size != (Uint64)-1 && h->Position >= h->Node->Size) { //LEAVE('i', 0); return 0; } do { - tmp = h->Node->Type->ReadDir(h->Node, h->Position); - if((Uint)tmp < (Uint)VFS_MAXSKIP) - h->Position += (Uint)tmp; + rv = h->Node->Type->ReadDir(h->Node, h->Position, Dest); + if(rv > 0) + h->Position += rv; else h->Position ++; - } while(tmp != NULL && (Uint)tmp < (Uint)VFS_MAXSKIP); + } while(rv > 0); - //LOG("tmp = '%s'", tmp); - - if(!tmp) { + if(rv < 0) { //LEAVE('i', 0); return 0; } - strcpy(Dest, tmp); - free(tmp); - //LEAVE('i', 1); return 1; }