X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fvfs%2Fio.c;h=67d384c1d42e90e51add86fb8000d6653062c7b5;hb=e42035c38b65d428672b128f9ae253f81b2ced96;hp=57d3f84a8c0698c27d5b56d57e2549b7538aee1c;hpb=8bc40333b1401d7616b225945fee53d972c2f418;p=tpg%2Facess2.git diff --git a/Kernel/vfs/io.c b/Kernel/vfs/io.c index 57d3f84a..67d384c1 100644 --- a/Kernel/vfs/io.c +++ b/Kernel/vfs/io.c @@ -2,7 +2,7 @@ * AcessMicro VFS * - File IO Passthru's */ -#include +#include #include "vfs.h" #include "vfs_int.h" @@ -79,10 +79,10 @@ Uint64 VFS_ReadAt(int FD, Uint64 Offset, Uint64 Length, void *Buffer) } /** - * \fn Uint64 VFS_Write(int FD, Uint64 Length, void *Buffer) + * \fn Uint64 VFS_Write(int FD, Uint64 Length, const void *Buffer) * \brief Read data from a node (file) */ -Uint64 VFS_Write(int FD, Uint64 Length, void *Buffer) +Uint64 VFS_Write(int FD, Uint64 Length, const void *Buffer) { tVFS_Handle *h; Uint64 ret; @@ -95,17 +95,18 @@ Uint64 VFS_Write(int FD, Uint64 Length, void *Buffer) if(!h->Node->Write) return 0; - ret = h->Node->Write(h->Node, h->Position, Length, Buffer); + // TODO: This is a hack, I need to change VFS_Node to have "const void*" + ret = h->Node->Write(h->Node, h->Position, Length, (void*)Buffer); if(ret == -1) return -1; h->Position += ret; return ret; } /** - * \fn Uint64 VFS_WriteAt(int FD, Uint64 Offset, Uint64 Length, void *Buffer) - * \brief Write data to a file at a given offset (atomic) + * \fn Uint64 VFS_WriteAt(int FD, Uint64 Offset, Uint64 Length, const void *Buffer) + * \brief Write data to a file at a given offset */ -Uint64 VFS_WriteAt(int FD, Uint64 Offset, Uint64 Length, void *Buffer) +Uint64 VFS_WriteAt(int FD, Uint64 Offset, Uint64 Length, const void *Buffer) { tVFS_Handle *h; Uint64 ret; @@ -117,7 +118,8 @@ Uint64 VFS_WriteAt(int FD, Uint64 Offset, Uint64 Length, void *Buffer) if( h->Node->Flags & VFS_FFLAG_DIRECTORY ) return -1; if(!h->Node->Write) return 0; - ret = h->Node->Write(h->Node, Offset, Length, Buffer); + // TODO: This is a hack, I need to change VFS_Node to have "const void*" + ret = h->Node->Write(h->Node, Offset, Length, (void*)Buffer); if(ret == -1) return -1; return ret; } @@ -137,32 +139,90 @@ Uint64 VFS_Tell(int FD) } /** - * \fn int VFS_Seek(int FD, Sint64 Distance, int Whence) + * \fn int VFS_Seek(int FD, Sint64 Offset, int Whence) * \brief Seek to a new location * \param FD File descriptor - * \param Distance Where to go + * \param Offset Where to go * \param Whence From where */ -int VFS_Seek(int FD, Sint64 Distance, int Whence) +int VFS_Seek(int FD, Sint64 Offset, int Whence) { tVFS_Handle *h; 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) { - h->Position += Distance; + h->Position += Offset; return 0; } // Set relative to end of file if(Whence < 0) { - h->Position = h->Node->Size - Distance; + h->Position = h->Node->Size - Offset; return 0; } // Set relative to start of file - h->Position = Distance; + h->Position = Offset; return 0; } + +/** + * \fn int VFS_IOCtl(int FD, int ID, void *Buffer) + * \brief Call an IO Control on a file + */ +int VFS_IOCtl(int FD, int ID, void *Buffer) +{ + tVFS_Handle *h; + + h = VFS_GetHandle(FD); + if(!h) return -1; + + if(!h->Node->IOCtl) return -1; + return h->Node->IOCtl(h->Node, ID, Buffer); +} + +/** + * \fn int VFS_FInfo(int FD, tFInfo *Dest, int MaxACLs) + * \brief Retrieve file information + * \return Number of ACLs stored + */ +int VFS_FInfo(int FD, tFInfo *Dest, int MaxACLs) +{ + tVFS_Handle *h; + int max; + + h = VFS_GetHandle(FD); + if(!h) return -1; + + Dest->uid = h->Node->UID; + Dest->gid = h->Node->GID; + Dest->size = h->Node->Size; + Dest->atime = h->Node->ATime; + Dest->ctime = h->Node->MTime; + Dest->mtime = h->Node->CTime; + Dest->numacls = h->Node->NumACLs; + + Dest->flags = 0; + if(h->Node->Flags & VFS_FFLAG_DIRECTORY) Dest->flags |= 0x10; + if(h->Node->Flags & VFS_FFLAG_SYMLINK) Dest->flags |= 0x20; + + max = (MaxACLs < h->Node->NumACLs) ? MaxACLs : h->Node->NumACLs; + memcpy(&Dest->acls, h->Node->ACLs, max*sizeof(tVFS_ACL)); + + return max; +} + +// === EXPORTS === +EXPORT(VFS_Read); +EXPORT(VFS_Write); +EXPORT(VFS_ReadAt); +EXPORT(VFS_WriteAt); +EXPORT(VFS_IOCtl); +EXPORT(VFS_Seek); +EXPORT(VFS_Tell);