X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fvfs%2Fhandle.c;h=6173c29ade9a15b5cf50449c8347c04eba9ad247;hb=c34752b7ccc945a70a2d9b1e505aa4a4de43163b;hp=cb4fae1200f936cac5eb0210546c63c7c8175211;hpb=b0da731b2d89b9dd58de2c98eaf6218a41a21920;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/vfs/handle.c b/KernelLand/Kernel/vfs/handle.c index cb4fae12..6173c29a 100644 --- a/KernelLand/Kernel/vfs/handle.c +++ b/KernelLand/Kernel/vfs/handle.c @@ -16,30 +16,12 @@ #define MAX_KERNEL_FILES 128 // === PROTOTYPES === -#if 0 -tVFS_Handle *VFS_GetHandle(int FD); -#endif -inline void _ReferenceNode(tVFS_Node *Node); - int VFS_AllocHandle(int FD, tVFS_Node *Node, int Mode); // === GLOBALS === tVFS_Handle *gaUserHandles = (void*)MM_PPD_HANDLES; tVFS_Handle *gaKernelHandles = (void*)MM_KERNEL_VFS; // === CODE === -inline void _ReferenceNode(tVFS_Node *Node) -{ - if( !MM_GetPhysAddr(Node->Type) ) { - Log_Error("VFS", "Node %p's type is invalid (%p bad pointer) - %P corrupted", - Node, Node->Type, MM_GetPhysAddr(&Node->Type)); - return ; - } - if( Node->Type && Node->Type->Reference ) - Node->Type->Reference( Node ); - else - Node->ReferenceCount ++; -} - /** * \fn tVFS_Handle *VFS_GetHandle(int FD) * \brief Gets a pointer to the handle information structure @@ -66,10 +48,27 @@ tVFS_Handle *VFS_GetHandle(int FD) return h; } -int VFS_AllocHandle(int bIsUser, tVFS_Node *Node, int Mode) +int VFS_SetHandle(int FD, tVFS_Node *Node, int Mode) { - int i; + tVFS_Handle *h; + if(FD < 0) return -1; + if( FD & VFS_KERNEL_FLAG ) { + FD &= (VFS_KERNEL_FLAG -1); + if( FD >= MAX_KERNEL_FILES ) return -1; + h = &gaKernelHandles[FD]; + } + else { + if( FD >= *Threads_GetMaxFD()) return -1; + h = &gaUserHandles[FD]; + } + h->Node = Node; + h->Mode = Mode; + return FD; +} + +int VFS_AllocHandle(int bIsUser, tVFS_Node *Node, int Mode) +{ // Check for a user open if(bIsUser) { @@ -90,7 +89,7 @@ int VFS_AllocHandle(int bIsUser, tVFS_Node *Node, int Mode) memset( gaUserHandles, 0, size ); } // Get a handle - for( i = 0; i < max_handles; i ++ ) + for( int i = 0; i < max_handles; i ++ ) { if(gaUserHandles[i].Node) continue; gaUserHandles[i].Node = Node; @@ -117,7 +116,7 @@ int VFS_AllocHandle(int bIsUser, tVFS_Node *Node, int Mode) memset( gaKernelHandles, 0, size ); } // Get a handle - for(i=0;i