Socket.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #pragma once
  2. #include <AK/HashTable.h>
  3. #include <AK/RetainPtr.h>
  4. #include <AK/Retainable.h>
  5. #include <AK/Vector.h>
  6. #include <Kernel/File.h>
  7. #include <Kernel/KResult.h>
  8. #include <Kernel/Lock.h>
  9. #include <Kernel/UnixTypes.h>
  10. enum class SocketRole : byte
  11. {
  12. None,
  13. Listener,
  14. Accepted,
  15. Connected,
  16. Connecting
  17. };
  18. enum class ShouldBlock
  19. {
  20. No = 0,
  21. Yes = 1
  22. };
  23. class FileDescriptor;
  24. class Socket : public File {
  25. public:
  26. static KResultOr<Retained<Socket>> create(int domain, int type, int protocol);
  27. virtual ~Socket() override;
  28. int domain() const { return m_domain; }
  29. int type() const { return m_type; }
  30. int protocol() const { return m_protocol; }
  31. bool can_accept() const { return !m_pending.is_empty(); }
  32. RetainPtr<Socket> accept();
  33. bool is_connected() const { return m_connected; }
  34. KResult listen(int backlog);
  35. virtual KResult bind(const sockaddr*, socklen_t) = 0;
  36. virtual KResult connect(FileDescriptor&, const sockaddr*, socklen_t, ShouldBlock) = 0;
  37. virtual bool get_local_address(sockaddr*, socklen_t*) = 0;
  38. virtual bool get_peer_address(sockaddr*, socklen_t*) = 0;
  39. virtual bool is_local() const { return false; }
  40. virtual bool is_ipv4() const { return false; }
  41. virtual void attach(FileDescriptor&) = 0;
  42. virtual void detach(FileDescriptor&) = 0;
  43. virtual ssize_t sendto(FileDescriptor&, const void*, size_t, int flags, const sockaddr*, socklen_t) = 0;
  44. virtual ssize_t recvfrom(FileDescriptor&, void*, size_t, int flags, sockaddr*, socklen_t*) = 0;
  45. KResult setsockopt(int level, int option, const void*, socklen_t);
  46. KResult getsockopt(int level, int option, void*, socklen_t*);
  47. pid_t origin_pid() const { return m_origin_pid; }
  48. timeval receive_deadline() const { return m_receive_deadline; }
  49. timeval send_deadline() const { return m_send_deadline; }
  50. void set_connected(bool connected) { m_connected = connected; }
  51. Lock& lock() { return m_lock; }
  52. virtual String absolute_path(const FileDescriptor&) const override;
  53. protected:
  54. Socket(int domain, int type, int protocol);
  55. KResult queue_connection_from(Socket&);
  56. void load_receive_deadline();
  57. void load_send_deadline();
  58. virtual const char* class_name() const override { return "Socket"; }
  59. private:
  60. virtual bool is_socket() const final { return true; }
  61. Lock m_lock { "Socket" };
  62. pid_t m_origin_pid { 0 };
  63. int m_domain { 0 };
  64. int m_type { 0 };
  65. int m_protocol { 0 };
  66. int m_backlog { 0 };
  67. bool m_connected { false };
  68. timeval m_receive_timeout { 0, 0 };
  69. timeval m_send_timeout { 0, 0 };
  70. timeval m_receive_deadline { 0, 0 };
  71. timeval m_send_deadline { 0, 0 };
  72. Vector<RetainPtr<Socket>> m_pending;
  73. };
  74. class SocketHandle {
  75. public:
  76. SocketHandle() {}
  77. SocketHandle(RetainPtr<Socket>&& socket)
  78. : m_socket(move(socket))
  79. {
  80. if (m_socket)
  81. m_socket->lock().lock();
  82. }
  83. SocketHandle(SocketHandle&& other)
  84. : m_socket(move(other.m_socket))
  85. {
  86. }
  87. ~SocketHandle()
  88. {
  89. if (m_socket)
  90. m_socket->lock().unlock();
  91. }
  92. SocketHandle(const SocketHandle&) = delete;
  93. SocketHandle& operator=(const SocketHandle&) = delete;
  94. operator bool() const { return m_socket; }
  95. Socket* operator->() { return &socket(); }
  96. const Socket* operator->() const { return &socket(); }
  97. Socket& socket() { return *m_socket; }
  98. const Socket& socket() const { return *m_socket; }
  99. private:
  100. RetainPtr<Socket> m_socket;
  101. };