X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fdrv%2Fvterm.c;h=01612dc7fe910122a28f773bdd15cd76d21041e3;hb=015f48988e0ff398409d71dfc692005ab439490a;hp=cf12ff96c832c68c613b15cc09af65475bc6afcd;hpb=1f61f9f0aff88b8dc62271ced741f6d211ae8ecc;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/drv/vterm.c b/KernelLand/Kernel/drv/vterm.c index cf12ff96..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); @@ -285,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; @@ -354,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 ); @@ -370,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) @@ -392,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) @@ -433,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;