// === 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;