if(FD >= MAX_KERNEL_FILES) return NULL;
h = &gaKernelHandles[ FD ];
} else {
- if(FD >= *Threads_GetMaxFD()) return NULL;
+ if(FD >= *Threads_GetMaxFD(NULL)) return NULL;
h = &gaUserHandles[ FD ];
}
h = &gaKernelHandles[FD];
}
else {
- if( FD >= *Threads_GetMaxFD()) return -1;
+ if( FD >= *Threads_GetMaxFD(NULL)) return -1;
h = &gaUserHandles[FD];
}
h->Node = Node;
// Check for a user open
if(bIsUser)
{
- int max_handles = *Threads_GetMaxFD();
+ int max_handles = *Threads_GetMaxFD(NULL);
// Allocate Buffer
if( MM_GetPhysAddr( gaUserHandles ) == 0 )
{
- Uint addr, size;
- size = max_handles * sizeof(tVFS_Handle);
- for(addr = 0; addr < size; addr += 0x1000)
+ tPage *pageptr = (void*)gaUserHandles;
+ size_t size = max_handles * sizeof(tVFS_Handle);
+ for( size_t ofs = 0; ofs < size; ofs ++)
{
- if( !MM_Allocate( (tVAddr)gaUserHandles + addr ) )
+ if( !MM_Allocate( pageptr ) )
{
Warning("OOM - VFS_AllocHandle");
Threads_Exit(0, 0xFF); // Terminate user
}
+ pageptr ++;
}
memset( gaUserHandles, 0, size );
}
// Allocate space if not already
if( MM_GetPhysAddr( gaKernelHandles ) == 0 )
{
- Uint addr, size;
- size = MAX_KERNEL_FILES * sizeof(tVFS_Handle);
- for(addr = 0; addr < size; addr += 0x1000)
+ tPage *pageptr = (void*)gaKernelHandles;
+ size_t size = MAX_KERNEL_FILES * sizeof(tVFS_Handle);
+ for(size_t ofs = 0; ofs < size; ofs += size)
{
- if( !MM_Allocate( (tVAddr)gaKernelHandles + addr ) )
+ if( !MM_Allocate( pageptr ) )
{
Panic("OOM - VFS_AllocHandle");
- Threads_Exit(0, 0xFF); // Terminate application (get some space back)
}
+ pageptr ++;
}
memset( gaKernelHandles, 0, size );
}
void VFS_ReferenceUserHandles(void)
{
- int i;
- int max_handles = *Threads_GetMaxFD();
+ const int max_handles = *Threads_GetMaxFD(NULL);
// Check if this process has any handles
if( MM_GetPhysAddr( gaUserHandles ) == 0 )
return ;
- for( i = 0; i < max_handles; i ++ )
+ for( int i = 0; i < max_handles; i ++ )
{
tVFS_Handle *h;
h = &gaUserHandles[i];
}
}
-void VFS_CloseAllUserHandles(void)
+void VFS_CloseAllUserHandles(struct sProcess *Process)
{
- int i;
- int max_handles = *Threads_GetMaxFD();
+ const int max_handles = *Threads_GetMaxFD(Process);
+ ENTER("pProcess", Process);
+ if( max_handles >= PAGE_SIZE / sizeof(tVFS_Handle) )
+ TODO("More than a page of handles");
+
+ tVFS_Handle *handles = MM_MapTempFromProc(Process, gaUserHandles);
+ LOG("handles=%p", handles);
// Check if this process has any handles
- if( MM_GetPhysAddr( gaUserHandles ) == 0 )
+ if( !handles ) {
+ LEAVE('-');
return ;
+ }
- for( i = 0; i < max_handles; i ++ )
+ for( int i = 0; i < max_handles; i ++ )
{
- tVFS_Handle *h;
- h = &gaUserHandles[i];
+ tVFS_Handle *h = &handles[i];
+ LOG("handles[%i].Node = %p", i, h->Node);
if( !h->Node )
continue ;
_CloseNode(h->Node);
+ h->Node = NULL;
}
+
+ MM_FreeTemp(handles);
+ LEAVE('-');
}
/**
void *VFS_SaveHandles(int NumFDs, int *FDs)
{
tVFS_Handle *ret;
- int max_handles = *Threads_GetMaxFD();
+ const int max_handles = *Threads_GetMaxFD(NULL);
// Check if this process has any handles
if( MM_GetPhysAddr( gaUserHandles ) == 0 )
void VFS_RestoreHandles(int NumFDs, void *Handles)
{
tVFS_Handle *handles = Handles;
- int max_handles = *Threads_GetMaxFD();
+ const int max_handles = *Threads_GetMaxFD(NULL);
// NULL = nothing to do
if( !Handles )
- return ;
+ return ;
+
+ if( NumFDs > max_handles ) {
+ Log_Notice("VFS", "RestoreHandles: Capping from %i FDs to %i", NumFDs, max_handles);
+ NumFDs = max_handles;
+ }
// Allocate user handle area (and dereference existing handles)
for( int i = 0; i < NumFDs; i ++ )
if( !MM_GetPhysAddr(h) )
{
- if( !MM_Allocate( (tVAddr)h & ~(PAGE_SIZE-1) ) )
+ void *pg = (void*)( (tVAddr)h & ~(PAGE_SIZE-1) );
+ if( !MM_Allocate( pg ) )
{
// OOM?
+ return ;
}
+ memset(pg, 0, PAGE_SIZE);
}
// Safe to dereference, as Threads_CloneTCB references handles
#if 1