// === 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);
* \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;
/**
* \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 );
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)
//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)
/**
* \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;
break;
}
- return 0;
+ return Length;
}
/**
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;
gpVT_CurTerm->Buffer
);
}
+ LOG("Cached screen contents");
}
// Update current terminal ID