FileDescriptor.h 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #pragma once
  2. #include "VirtualFileSystem.h"
  3. #include "InodeMetadata.h"
  4. #include "FIFO.h"
  5. #include <AK/ByteBuffer.h>
  6. #include <AK/CircularQueue.h>
  7. #include <AK/Retainable.h>
  8. #include <AK/Badge.h>
  9. class TTY;
  10. class MasterPTY;
  11. class Process;
  12. class FileDescriptor : public Retainable<FileDescriptor> {
  13. public:
  14. static RetainPtr<FileDescriptor> create(RetainPtr<Inode>&&);
  15. static RetainPtr<FileDescriptor> create(RetainPtr<CharacterDevice>&&);
  16. static RetainPtr<FileDescriptor> create_pipe_writer(FIFO&);
  17. static RetainPtr<FileDescriptor> create_pipe_reader(FIFO&);
  18. ~FileDescriptor();
  19. RetainPtr<FileDescriptor> clone();
  20. int close();
  21. off_t seek(off_t, int whence);
  22. ssize_t read(Process&, byte*, size_t);
  23. ssize_t write(Process&, const byte* data, size_t);
  24. int fstat(stat*);
  25. bool can_read(Process&);
  26. bool can_write(Process&);
  27. ssize_t get_dir_entries(byte* buffer, size_t);
  28. ByteBuffer read_entire_file(Process&);
  29. String absolute_path();
  30. bool is_directory() const;
  31. bool is_character_device() const { return m_device.ptr(); }
  32. CharacterDevice* character_device() { return m_device.ptr(); }
  33. const CharacterDevice* character_device() const { return m_device.ptr(); }
  34. bool is_tty() const;
  35. const TTY* tty() const;
  36. TTY* tty();
  37. bool is_master_pty() const;
  38. const MasterPTY* master_pty() const;
  39. MasterPTY* master_pty();
  40. InodeMetadata metadata() const;
  41. Inode* inode() { return m_inode.ptr(); }
  42. const Inode* inode() const { return m_inode.ptr(); }
  43. bool supports_mmap() const { return m_inode && !m_device; }
  44. bool is_blocking() const { return m_is_blocking; }
  45. void set_blocking(bool b) { m_is_blocking = b; }
  46. dword file_flags() const { return m_file_flags; }
  47. void set_file_flags(dword flags) { m_file_flags = flags; }
  48. bool is_fifo() const { return m_fifo; }
  49. FIFO::Direction fifo_direction() { return m_fifo_direction; }
  50. ByteBuffer& generator_cache() { return m_generator_cache; }
  51. void set_original_inode(Badge<VFS>, RetainPtr<Inode>&& inode) { m_inode = move(inode); }
  52. private:
  53. friend class VFS;
  54. explicit FileDescriptor(RetainPtr<Inode>&&);
  55. explicit FileDescriptor(RetainPtr<CharacterDevice>&&);
  56. FileDescriptor(FIFO&, FIFO::Direction);
  57. RetainPtr<Inode> m_inode;
  58. RetainPtr<CharacterDevice> m_device;
  59. off_t m_current_offset { 0 };
  60. ByteBuffer m_generator_cache;
  61. bool m_is_blocking { true };
  62. dword m_file_flags { 0 };
  63. RetainPtr<FIFO> m_fifo;
  64. FIFO::Direction m_fifo_direction { FIFO::Neither };
  65. bool m_closed { false };
  66. };