X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fvfs%2Fhandle.c;h=6173c29ade9a15b5cf50449c8347c04eba9ad247;hb=097d17ad093701091b0925aa7b13378cb9aed9df;hp=8cae80400a919ef365b2579e71050e37468854d2;hpb=e02f66c7125bf18f77c6c53587238cbd49da2c89;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/vfs/handle.c b/KernelLand/Kernel/vfs/handle.c index 8cae8040..6173c29a 100644 --- a/KernelLand/Kernel/vfs/handle.c +++ b/KernelLand/Kernel/vfs/handle.c @@ -2,6 +2,7 @@ * Acess2 VFS * - AllocHandle, GetHandle */ +#define SANITY 1 #define DEBUG 0 #include #include @@ -15,10 +16,6 @@ #define MAX_KERNEL_FILES 128 // === PROTOTYPES === -#if 0 -tVFS_Handle *VFS_GetHandle(int FD); -#endif - int VFS_AllocHandle(int FD, tVFS_Node *Node, int Mode); // === GLOBALS === tVFS_Handle *gaUserHandles = (void*)MM_PPD_HANDLES; @@ -51,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) { @@ -75,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; @@ -102,7 +116,7 @@ int VFS_AllocHandle(int bIsUser, tVFS_Node *Node, int Mode) memset( gaKernelHandles, 0, size ); } // Get a handle - for(i=0;iNode ) continue ; - if( h->Node->Type && h->Node->Type->Reference ) - h->Node->Type->Reference( h->Node ); + _ReferenceNode(h->Node); + h->Mount->OpenHandleCount ++; } } @@ -150,8 +164,7 @@ void VFS_CloseAllUserHandles(void) h = &gaUserHandles[i]; if( !h->Node ) continue ; - if( h->Node->Type && h->Node->Type->Close ) - h->Node->Type->Close( h->Node ); + _CloseNode(h->Node); } } @@ -182,7 +195,14 @@ void *VFS_SaveHandles(int NumFDs, int *FDs) tVFS_Handle *h; if( FDs == NULL ) h = &gaUserHandles[i]; - else { + else if( FDs[i] == -1 ) + { + Log_Warning("VFS", "VFS_SaveHandles - Slot %i error FD (-1), ignorning", i); + memset(&ret[i], 0, sizeof(tVFS_Handle)); + continue ; + } + else + { h = VFS_GetHandle(FDs[i] & (VFS_KERNEL_FLAG - 1)); if(!h) { Log_Warning("VFS", "VFS_SaveHandles - Invalid FD %i", @@ -196,8 +216,7 @@ void *VFS_SaveHandles(int NumFDs, int *FDs) // Reference node if( !h->Node ) continue ; - if( h->Node->Type && h->Node->Type->Reference ) - h->Node->Type->Reference( h->Node ); + _ReferenceNode(h->Node); h->Mount->OpenHandleCount ++; } @@ -243,8 +262,7 @@ void VFS_RestoreHandles(int NumFDs, void *Handles) if( !h->Node ) continue ; - if( h->Node->Type && h->Node->Type->Reference ) - h->Node->Type->Reference( h->Node ); + _ReferenceNode(h->Node); h->Mount->OpenHandleCount ++; } } @@ -265,8 +283,10 @@ void VFS_FreeSavedHandles(int NumFDs, void *Handles) if( !h->Node ) continue ; - if( h->Node->Type && h->Node->Type->Close ) - h->Node->Type->Close( h->Node ); + _CloseNode(h->Node); + + ASSERT(h->Mount->OpenHandleCount > 0); + LOG("dec. mntpt '%s' to %i", h->Mount->MountPoint, h->Mount->OpenHandleCount-1); h->Mount->OpenHandleCount --; } free( Handles );