/*
- * AcessMicro VFS
- * - File IO Passthru's
+ * Acess2 Kernel
+ * - By John Hodge (thePowersGang)
+ *
+ * vfs/io.c
+ * - VFS IO Handling (Read/Write)
+ *
+ * TODO: VFS-level caching to support non-blocking IO?
*/
#define DEBUG 0
#include <acess.h>
tVFS_Handle *h;
size_t ret;
- ENTER("iFD XLength pBuffer", FD, Length, Buffer);
+ ENTER("xFD xLength pBuffer", FD, Length, Buffer);
h = VFS_GetHandle(FD);
if(!h) {
}
if( !MM_GetPhysAddr(h->Node->Type->Read) ) {
- Log_Error("VFS", "Node type %p(%s) read method is junk %p", h->Node->Type, h->Node, h->Node->Type->TypeName,
+ Log_Error("VFS", "Node type %p(%s) read method is junk %p",
+ h->Node->Type, h->Node, h->Node->Type->TypeName,
h->Node->Type->Read);
LEAVE_RET('i', -1);
}
- ret = h->Node->Type->Read(h->Node, h->Position, Length, Buffer);
+ LOG("Position=%llx", h->Position);
+ Uint flags = 0;
+ flags |= (h->Mode & VFS_OPENFLAG_NONBLOCK) ? VFS_IOFLAG_NOBLOCK : 0;
+ ret = h->Node->Type->Read(h->Node, h->Position, Length, Buffer, flags);
if(ret == (size_t)-1) LEAVE_RET('i', -1);
h->Position += ret;
- LEAVE('X', ret);
+ LEAVE('x', ret);
return ret;
}
}
if( !MM_GetPhysAddr(h->Node->Type->Read) ) {
- Log_Error("VFS", "Node type %p(%s) read method is junk %p", h->Node->Type, h->Node, h->Node->Type->TypeName,
+ Log_Error("VFS", "Node type %p(%s) read method is junk %p",
+ h->Node->Type, h->Node->Type->TypeName,
h->Node->Type->Read);
LEAVE_RET('i', -1);
}
- ret = h->Node->Type->Read(h->Node, Offset, Length, Buffer);
+ Uint flags = 0;
+ flags |= (h->Mode & VFS_OPENFLAG_NONBLOCK) ? VFS_IOFLAG_NOBLOCK : 0;
+ ret = h->Node->Type->Read(h->Node, Offset, Length, Buffer, flags);
if(ret == (size_t)-1) return -1;
return ret;
}
h = VFS_GetHandle(FD);
if(!h) return -1;
- if( !(h->Mode & VFS_OPENFLAG_WRITE) ) return -1;
- if( h->Node->Flags & VFS_FFLAG_DIRECTORY ) return -1;
+ if( !(h->Mode & VFS_OPENFLAG_WRITE) ) {
+ LOG("FD%i not opened for writing", FD);
+ return -1;
+ }
+ if( h->Node->Flags & VFS_FFLAG_DIRECTORY ) {
+ LOG("FD%i is a director", FD);
+ return -1;
+ }
- if( !h->Node->Type || !h->Node->Type->Write ) return 0;
+ if( !h->Node->Type || !h->Node->Type->Write ) {
+ LOG("FD%i has no write method", FD);
+ return 0;
+ }
if( !MM_GetPhysAddr(h->Node->Type->Write) ) {
- Log_Error("VFS", "Node type %p(%s) write method is junk %p", h->Node->Type, h->Node, h->Node->Type->TypeName,
+ Log_Error("VFS", "Node type %p(%s) write method is junk %p",
+ h->Node->Type, h->Node->Type->TypeName,
h->Node->Type->Write);
return -1;
}
- ret = h->Node->Type->Write(h->Node, h->Position, Length, Buffer);
+ Uint flags = 0;
+ flags |= (h->Mode & VFS_OPENFLAG_NONBLOCK) ? VFS_IOFLAG_NOBLOCK : 0;
+ ret = h->Node->Type->Write(h->Node, h->Position, Length, Buffer, flags);
if(ret == (size_t)-1) return -1;
h->Position += ret;
if(!h->Node->Type || !h->Node->Type->Write) return 0;
if( !MM_GetPhysAddr(h->Node->Type->Write) ) {
- Log_Error("VFS", "Node type %p(%s) write method is junk %p", h->Node->Type, h->Node, h->Node->Type->TypeName,
+ Log_Error("VFS", "Node type %p(%s) write method is junk %p",
+ h->Node->Type, h->Node->Type->TypeName,
h->Node->Type->Write);
return -1;
}
- ret = h->Node->Type->Write(h->Node, Offset, Length, Buffer);
+ Uint flags = 0;
+ flags |= (h->Mode & VFS_OPENFLAG_NONBLOCK) ? VFS_IOFLAG_NOBLOCK : 0;
+ ret = h->Node->Type->Write(h->Node, Offset, Length, Buffer, flags);
if(ret == (size_t)-1) return -1;
return ret;
}
h = VFS_GetHandle(FD);
if(!h) return -1;
- //Log_Debug("VFS", "VFS_Seek: (fd=0x%x, Offset=0x%llx, Whence=%i)",
- // FD, Offset, Whence);
-
// Set relative to current position
if(Whence == 0) {
+ LOG("(FD%x)->Position += %lli", FD, Offset);
h->Position += Offset;
return 0;
}
if(Whence < 0) {
if( h->Node->Size == (Uint64)-1 ) return -1;
+ LOG("(FD%x)->Position = %llx - %llx", FD, h->Node->Size, Offset);
h->Position = h->Node->Size - Offset;
return 0;
}
// Set relative to start of file
+ LOG("(FD%x)->Position = %llx", FD, Offset);
h->Position = Offset;
return 0;
}