FileDescriptor.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. #include <Kernel/Socket.h>
  10. class TTY;
  11. class MasterPTY;
  12. class Process;
  13. class Region;
  14. class CharacterDevice;
  15. class FileDescriptor : public Retainable<FileDescriptor> {
  16. public:
  17. static RetainPtr<FileDescriptor> create(RetainPtr<Socket>&&, SocketRole = SocketRole::None);
  18. static RetainPtr<FileDescriptor> create(RetainPtr<Inode>&&);
  19. static RetainPtr<FileDescriptor> create(RetainPtr<Device>&&);
  20. static RetainPtr<FileDescriptor> create_pipe_writer(FIFO&);
  21. static RetainPtr<FileDescriptor> create_pipe_reader(FIFO&);
  22. ~FileDescriptor();
  23. RetainPtr<FileDescriptor> clone();
  24. int close();
  25. off_t seek(off_t, int whence);
  26. ssize_t read(Process&, byte*, size_t);
  27. ssize_t write(Process&, const byte* data, size_t);
  28. int fstat(stat*);
  29. bool can_read(Process&);
  30. bool can_write(Process&);
  31. ssize_t get_dir_entries(byte* buffer, size_t);
  32. ByteBuffer read_entire_file(Process&);
  33. String absolute_path();
  34. bool is_directory() const;
  35. bool is_device() const { return m_device.ptr(); }
  36. Device* device() { return m_device.ptr(); }
  37. const Device* device() const { return m_device.ptr(); }
  38. bool is_block_device() const;
  39. bool is_character_device() const;
  40. CharacterDevice* character_device();
  41. const CharacterDevice* character_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. bool supports_mmap() const;
  52. Region* mmap(Process&, LinearAddress, size_t offset, size_t, int prot);
  53. bool is_blocking() const { return m_is_blocking; }
  54. void set_blocking(bool b) { m_is_blocking = b; }
  55. dword file_flags() const { return m_file_flags; }
  56. void set_file_flags(dword flags) { m_file_flags = flags; }
  57. bool is_socket() const { return m_socket; }
  58. Socket* socket() { return m_socket.ptr(); }
  59. const Socket* socket() const { return m_socket.ptr(); }
  60. bool is_fifo() const { return m_fifo; }
  61. FIFO::Direction fifo_direction() { return m_fifo_direction; }
  62. ByteBuffer& generator_cache() { return m_generator_cache; }
  63. void set_original_inode(Badge<VFS>, RetainPtr<Inode>&& inode) { m_inode = move(inode); }
  64. void set_socket_role(SocketRole);
  65. private:
  66. friend class VFS;
  67. FileDescriptor(RetainPtr<Socket>&&, SocketRole);
  68. explicit FileDescriptor(RetainPtr<Inode>&&);
  69. explicit FileDescriptor(RetainPtr<Device>&&);
  70. FileDescriptor(FIFO&, FIFO::Direction);
  71. RetainPtr<Inode> m_inode;
  72. RetainPtr<Device> m_device;
  73. off_t m_current_offset { 0 };
  74. ByteBuffer m_generator_cache;
  75. bool m_is_blocking { true };
  76. dword m_file_flags { 0 };
  77. RetainPtr<Socket> m_socket;
  78. SocketRole m_socket_role { SocketRole::None };
  79. RetainPtr<FIFO> m_fifo;
  80. FIFO::Direction m_fifo_direction { FIFO::Neither };
  81. bool m_closed { false };
  82. };