X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=inline;f=KernelLand%2FKernel%2Fdrv%2Fvterm.c;h=01612dc7fe910122a28f773bdd15cd76d21041e3;hb=015f48988e0ff398409d71dfc692005ab439490a;hp=fc6dea26487e2d95e897f05225349f15193581f2;hpb=d0b4559f2936f6d9f06be0f7c3c51527a480ec0d;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/drv/vterm.c b/KernelLand/Kernel/drv/vterm.c index fc6dea26..01612dc7 100644 --- a/KernelLand/Kernel/drv/vterm.c +++ b/KernelLand/Kernel/drv/vterm.c @@ -35,10 +35,10 @@ extern void Debug_SetKTerminal(const char *File); // === PROTOTYPES === int VT_Install(char **Arguments); int VT_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX]); -tVFS_Node *VT_FindDir(tVFS_Node *Node, const char *Name); +tVFS_Node *VT_FindDir(tVFS_Node *Node, const char *Name, Uint Flags); int VT_Root_IOCtl(tVFS_Node *Node, int Id, void *Data); -size_t VT_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer); -size_t VT_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer); +size_t VT_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags); +size_t VT_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags); int VT_Terminal_IOCtl(tVFS_Node *Node, int Id, void *Data); void VT_Terminal_Reference(tVFS_Node *Node); void VT_Terminal_Close(tVFS_Node *Node); @@ -114,11 +114,11 @@ int VT_Install(char **Arguments) if( strcmp(opt, "Video") == 0 ) { if( !gsVT_OutputDevice ) - gsVT_OutputDevice = strdup(val); + gsVT_OutputDevice = val; } else if( strcmp(opt, "Input") == 0 ) { if( !gsVT_InputDevice ) - gsVT_InputDevice = strdup(val); + gsVT_InputDevice = val; } else if( strcmp(opt, "Width") == 0 ) { giVT_RealWidth = atoi( val ); @@ -129,6 +129,9 @@ int VT_Install(char **Arguments) else if( strcmp(opt, "Scrollback") == 0 ) { giVT_Scrollback = atoi( val ); } + else { + Log_Notice("VTerm", "Unknown option '%s'", opt); + } } } @@ -282,7 +285,7 @@ int VT_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX]) * \param Node Root node * \param Name Name (number) of the terminal */ -tVFS_Node *VT_FindDir(tVFS_Node *Node, const char *Name) +tVFS_Node *VT_FindDir(tVFS_Node *Node, const char *Name, Uint Flags) { int num; @@ -351,12 +354,13 @@ int VT_Root_IOCtl(tVFS_Node *Node, int Id, void *Data) /** * \brief Read from a virtual terminal */ -size_t VT_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer) +size_t VT_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags) { - int pos, avail; + int pos, avail, rv; tVTerm *term = &gVT_Terminals[ Node->Inode ]; Uint32 *codepoint_buf = Buffer; Uint32 *codepoint_in; + tTime timeout_zero = 0; Mutex_Acquire( &term->ReadingLock ); @@ -367,7 +371,12 @@ size_t VT_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer) case TERM_MODE_TEXT: VT_int_UpdateCursor(term, 1); - VFS_SelectNode(Node, VFS_SELECT_READ, NULL, "VT_Read (UTF-8)"); + rv = VFS_SelectNode(Node, VFS_SELECT_READ, + (Flags & VFS_IOFLAG_NOBLOCK ? &timeout_zero : NULL), "VT_Read (UTF-8)"); + if(!rv) { + errno = (Flags & VFS_IOFLAG_NOBLOCK) ? EWOULDBLOCK : EINTR; + return -1; + } avail = term->InputWrite - term->InputRead; if(avail < 0) @@ -389,7 +398,12 @@ size_t VT_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer) //case TERM_MODE_FB: // Other - UCS-4 default: - VFS_SelectNode(Node, VFS_SELECT_READ, NULL, "VT_Read (UCS-4)"); + rv = VFS_SelectNode(Node, VFS_SELECT_READ, + (Flags & VFS_IOFLAG_NOBLOCK ? &timeout_zero : NULL), "VT_Read (UCS-4)"); + if(!rv) { + errno = (Flags & VFS_IOFLAG_NOBLOCK) ? EWOULDBLOCK : EINTR; + return -1; + } avail = term->InputWrite - term->InputRead; if(avail < 0) @@ -430,7 +444,7 @@ size_t VT_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer) /** * \brief Write to a virtual terminal */ -size_t VT_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer) +size_t VT_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags) { tVTerm *term = &gVT_Terminals[ Node->Inode ]; int size; @@ -448,8 +462,8 @@ size_t VT_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer // - Sanity Checking size = term->Width*term->Height*4; if( Offset > size ) { - Log_Notice("VTerm", "VT_Write: Offset (0x%llx) > FBSize (0x%x)", - Offset, size); + Log_Notice("VTerm", "VT_Write: %i Offset (0x%llx) > FBSize (0x%x)", + (int)Node->Inode, Offset, size); return 0; } if( Offset + Length > size ) { @@ -513,7 +527,7 @@ size_t VT_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer break; } - return 0; + return Length; } /** @@ -734,11 +748,10 @@ void VT_SetTerminal(int ID) gpVT_CurTerm->Buffer = malloc( gpVT_CurTerm->Width*gpVT_CurTerm->Height*4 ); if( gpVT_CurTerm->Width < giVT_RealWidth ) { - int line; Uint ofs = 0; Uint32 *dest = gpVT_CurTerm->Buffer; // Slower scanline copy - for( line = 0; line < gpVT_CurTerm->Height; line ++ ) + for( int line = 0; line < gpVT_CurTerm->Height; line ++ ) { VFS_ReadAt(giVT_OutputDevHandle, ofs, gpVT_CurTerm->Width*4, dest); ofs += giVT_RealWidth * 4; @@ -752,6 +765,7 @@ void VT_SetTerminal(int ID) gpVT_CurTerm->Buffer ); } + LOG("Cached screen contents"); } // Update current terminal ID