FileDescriptor.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #pragma once
  2. #include <Kernel/FileSystem/VirtualFileSystem.h>
  3. #include <Kernel/FileSystem/InodeMetadata.h>
  4. #include <Kernel/FileSystem/Inode.h>
  5. #include <Kernel/FileSystem/FIFO.h>
  6. #include <Kernel/LinearAddress.h>
  7. #include <AK/ByteBuffer.h>
  8. #include <AK/CircularQueue.h>
  9. #include <AK/Retainable.h>
  10. #include <AK/Badge.h>
  11. #include <Kernel/Net/Socket.h>
  12. class File;
  13. class TTY;
  14. class MasterPTY;
  15. class Process;
  16. class Region;
  17. class CharacterDevice;
  18. class SharedMemory;
  19. class FileDescriptor : public Retainable<FileDescriptor> {
  20. public:
  21. static Retained<FileDescriptor> create(RetainPtr<Inode>&&);
  22. static Retained<FileDescriptor> create(RetainPtr<File>&&, SocketRole = SocketRole::None);
  23. ~FileDescriptor();
  24. Retained<FileDescriptor> clone();
  25. int close();
  26. off_t seek(off_t, int whence);
  27. ssize_t read(byte*, ssize_t);
  28. ssize_t write(const byte* data, ssize_t);
  29. KResult fstat(stat&);
  30. KResult fchmod(mode_t);
  31. bool can_read();
  32. bool can_write();
  33. ssize_t get_dir_entries(byte* buffer, ssize_t);
  34. ByteBuffer read_entire_file();
  35. KResultOr<String> absolute_path();
  36. bool is_directory() const;
  37. // FIXME: These should go away once everything is a File.
  38. bool is_file() const { return m_file.ptr(); }
  39. File* file() { return m_file.ptr(); }
  40. const File* file() const { return m_file.ptr(); }
  41. bool is_device() const;
  42. bool is_tty() const;
  43. const TTY* tty() const;
  44. TTY* tty();
  45. bool is_master_pty() const;
  46. const MasterPTY* master_pty() const;
  47. MasterPTY* master_pty();
  48. InodeMetadata metadata() const;
  49. Inode* inode() { return m_inode.ptr(); }
  50. const Inode* inode() const { return m_inode.ptr(); }
  51. KResultOr<Region*> mmap(Process&, LinearAddress, size_t offset, size_t, int prot);
  52. bool is_blocking() const { return m_is_blocking; }
  53. void set_blocking(bool b) { m_is_blocking = b; }
  54. bool should_append() const { return m_should_append; }
  55. void set_should_append(bool s) { m_should_append = s; }
  56. dword file_flags() const { return m_file_flags; }
  57. void set_file_flags(dword flags) { m_file_flags = flags; }
  58. bool is_socket() const;
  59. Socket* socket();
  60. const Socket* socket() const;
  61. bool is_fifo() const;
  62. FIFO* fifo();
  63. FIFO::Direction fifo_direction() { return m_fifo_direction; }
  64. void set_fifo_direction(Badge<FIFO>, FIFO::Direction direction) { m_fifo_direction = direction; }
  65. bool is_fsfile() const;
  66. bool is_shared_memory() const;
  67. SharedMemory* shared_memory();
  68. const SharedMemory* shared_memory() const;
  69. ByteBuffer& generator_cache() { return m_generator_cache; }
  70. void set_original_inode(Badge<VFS>, Retained<Inode>&& inode) { m_inode = move(inode); }
  71. SocketRole socket_role() const { return m_socket_role; }
  72. void set_socket_role(SocketRole);
  73. KResult truncate(off_t);
  74. private:
  75. friend class VFS;
  76. FileDescriptor(RetainPtr<File>&&, SocketRole);
  77. explicit FileDescriptor(RetainPtr<Inode>&&);
  78. FileDescriptor(FIFO&, FIFO::Direction);
  79. RetainPtr<Inode> m_inode;
  80. RetainPtr<File> m_file;
  81. off_t m_current_offset { 0 };
  82. ByteBuffer m_generator_cache;
  83. dword m_file_flags { 0 };
  84. bool m_is_blocking { true };
  85. bool m_should_append { false };
  86. SocketRole m_socket_role { SocketRole::None };
  87. FIFO::Direction m_fifo_direction { FIFO::Direction::Neither };
  88. };