FileHandle.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "FileHandle.h"
  2. #include "FileSystem.h"
  3. #include "CharacterDevice.h"
  4. FileHandle::FileHandle(RetainPtr<VirtualFileSystem::Node>&& vnode)
  5. : m_vnode(std::move(vnode))
  6. {
  7. }
  8. FileHandle::~FileHandle()
  9. {
  10. }
  11. bool additionWouldOverflow(FileOffset a, FileOffset b)
  12. {
  13. ASSERT(a > 0);
  14. uint64_t ua = a;
  15. return (ua + b) > maxFileOffset;
  16. }
  17. FileOffset FileHandle::lseek(FileOffset offset, SeekType seekType)
  18. {
  19. if (!m_vnode)
  20. return -EBADF;
  21. // FIXME: The file type should be cached on the vnode.
  22. // It's silly that we have to do a full metadata lookup here.
  23. auto metadata = m_vnode->inode.metadata();
  24. if (metadata.isSocket() || metadata.isFIFO())
  25. return -ESPIPE;
  26. FileOffset newOffset;
  27. switch (seekType) {
  28. case SeekType::Absolute:
  29. newOffset = offset;
  30. break;
  31. case SeekType::RelativeToCurrent:
  32. newOffset = m_currentOffset + offset;
  33. if (additionWouldOverflow(m_currentOffset, offset))
  34. return -EOVERFLOW;
  35. if (newOffset < 0)
  36. return -EINVAL;
  37. break;
  38. case SeekType::RelativeToEnd:
  39. // FIXME: Implement!
  40. notImplemented();
  41. break;
  42. default:
  43. return -EINVAL;
  44. }
  45. m_currentOffset = newOffset;
  46. return m_currentOffset;
  47. }
  48. ssize_t FileHandle::read(byte* buffer, size_t count)
  49. {
  50. if (m_vnode->isCharacterDevice()) {
  51. // FIXME: What should happen to m_currentOffset?
  52. return m_vnode->characterDevice()->read(buffer, count);
  53. }
  54. ssize_t nread = m_vnode->fileSystem()->readInodeBytes(m_vnode->inode, m_currentOffset, count, buffer);
  55. m_currentOffset += nread;
  56. return nread;
  57. }
  58. ByteBuffer FileHandle::readEntireFile()
  59. {
  60. if (m_vnode->isCharacterDevice()) {
  61. auto buffer = ByteBuffer::createUninitialized(1024);
  62. ssize_t nread = m_vnode->characterDevice()->read(buffer.pointer(), buffer.size());
  63. buffer.trim(nread);
  64. return buffer;
  65. }
  66. return m_vnode->fileSystem()->readInode(m_vnode->inode);
  67. }