bsd.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <memory>
  6. #include <string_view>
  7. #include <vector>
  8. #include "common/common_types.h"
  9. #include "core/hle/kernel/hle_ipc.h"
  10. #include "core/hle/service/service.h"
  11. #include "core/hle/service/sockets/sockets.h"
  12. namespace Core {
  13. class System;
  14. }
  15. namespace Network {
  16. class Socket;
  17. }
  18. namespace Service::Sockets {
  19. class BSD final : public ServiceFramework<BSD> {
  20. public:
  21. explicit BSD(Core::System& system_, const char* name);
  22. ~BSD() override;
  23. private:
  24. /// Maximum number of file descriptors
  25. static constexpr size_t MAX_FD = 128;
  26. struct FileDescriptor {
  27. std::unique_ptr<Network::Socket> socket;
  28. s32 flags = 0;
  29. bool is_connection_based = false;
  30. };
  31. struct PollWork {
  32. void Execute(BSD* bsd);
  33. void Response(Kernel::HLERequestContext& ctx);
  34. s32 nfds;
  35. s32 timeout;
  36. std::vector<u8> read_buffer;
  37. std::vector<u8> write_buffer;
  38. s32 ret{};
  39. Errno bsd_errno{};
  40. };
  41. struct AcceptWork {
  42. void Execute(BSD* bsd);
  43. void Response(Kernel::HLERequestContext& ctx);
  44. s32 fd;
  45. std::vector<u8> write_buffer;
  46. s32 ret{};
  47. Errno bsd_errno{};
  48. };
  49. struct ConnectWork {
  50. void Execute(BSD* bsd);
  51. void Response(Kernel::HLERequestContext& ctx);
  52. s32 fd;
  53. std::vector<u8> addr;
  54. Errno bsd_errno{};
  55. };
  56. struct RecvWork {
  57. void Execute(BSD* bsd);
  58. void Response(Kernel::HLERequestContext& ctx);
  59. s32 fd;
  60. u32 flags;
  61. std::vector<u8> message;
  62. s32 ret{};
  63. Errno bsd_errno{};
  64. };
  65. struct RecvFromWork {
  66. void Execute(BSD* bsd);
  67. void Response(Kernel::HLERequestContext& ctx);
  68. s32 fd;
  69. u32 flags;
  70. std::vector<u8> message;
  71. std::vector<u8> addr;
  72. s32 ret{};
  73. Errno bsd_errno{};
  74. };
  75. struct SendWork {
  76. void Execute(BSD* bsd);
  77. void Response(Kernel::HLERequestContext& ctx);
  78. s32 fd;
  79. u32 flags;
  80. std::vector<u8> message;
  81. s32 ret{};
  82. Errno bsd_errno{};
  83. };
  84. struct SendToWork {
  85. void Execute(BSD* bsd);
  86. void Response(Kernel::HLERequestContext& ctx);
  87. s32 fd;
  88. u32 flags;
  89. std::vector<u8> message;
  90. std::vector<u8> addr;
  91. s32 ret{};
  92. Errno bsd_errno{};
  93. };
  94. void RegisterClient(Kernel::HLERequestContext& ctx);
  95. void StartMonitoring(Kernel::HLERequestContext& ctx);
  96. void Socket(Kernel::HLERequestContext& ctx);
  97. void Select(Kernel::HLERequestContext& ctx);
  98. void Poll(Kernel::HLERequestContext& ctx);
  99. void Accept(Kernel::HLERequestContext& ctx);
  100. void Bind(Kernel::HLERequestContext& ctx);
  101. void Connect(Kernel::HLERequestContext& ctx);
  102. void GetPeerName(Kernel::HLERequestContext& ctx);
  103. void GetSockName(Kernel::HLERequestContext& ctx);
  104. void GetSockOpt(Kernel::HLERequestContext& ctx);
  105. void Listen(Kernel::HLERequestContext& ctx);
  106. void Fcntl(Kernel::HLERequestContext& ctx);
  107. void SetSockOpt(Kernel::HLERequestContext& ctx);
  108. void Shutdown(Kernel::HLERequestContext& ctx);
  109. void Recv(Kernel::HLERequestContext& ctx);
  110. void RecvFrom(Kernel::HLERequestContext& ctx);
  111. void Send(Kernel::HLERequestContext& ctx);
  112. void SendTo(Kernel::HLERequestContext& ctx);
  113. void Write(Kernel::HLERequestContext& ctx);
  114. void Close(Kernel::HLERequestContext& ctx);
  115. void EventFd(Kernel::HLERequestContext& ctx);
  116. template <typename Work>
  117. void ExecuteWork(Kernel::HLERequestContext& ctx, Work work);
  118. std::pair<s32, Errno> SocketImpl(Domain domain, Type type, Protocol protocol);
  119. std::pair<s32, Errno> PollImpl(std::vector<u8>& write_buffer, std::vector<u8> read_buffer,
  120. s32 nfds, s32 timeout);
  121. std::pair<s32, Errno> AcceptImpl(s32 fd, std::vector<u8>& write_buffer);
  122. Errno BindImpl(s32 fd, const std::vector<u8>& addr);
  123. Errno ConnectImpl(s32 fd, const std::vector<u8>& addr);
  124. Errno GetPeerNameImpl(s32 fd, std::vector<u8>& write_buffer);
  125. Errno GetSockNameImpl(s32 fd, std::vector<u8>& write_buffer);
  126. Errno ListenImpl(s32 fd, s32 backlog);
  127. std::pair<s32, Errno> FcntlImpl(s32 fd, FcntlCmd cmd, s32 arg);
  128. Errno SetSockOptImpl(s32 fd, u32 level, OptName optname, size_t optlen, const void* optval);
  129. Errno ShutdownImpl(s32 fd, s32 how);
  130. std::pair<s32, Errno> RecvImpl(s32 fd, u32 flags, std::vector<u8>& message);
  131. std::pair<s32, Errno> RecvFromImpl(s32 fd, u32 flags, std::vector<u8>& message,
  132. std::vector<u8>& addr);
  133. std::pair<s32, Errno> SendImpl(s32 fd, u32 flags, const std::vector<u8>& message);
  134. std::pair<s32, Errno> SendToImpl(s32 fd, u32 flags, const std::vector<u8>& message,
  135. const std::vector<u8>& addr);
  136. Errno CloseImpl(s32 fd);
  137. s32 FindFreeFileDescriptorHandle() noexcept;
  138. bool IsFileDescriptorValid(s32 fd) const noexcept;
  139. void BuildErrnoResponse(Kernel::HLERequestContext& ctx, Errno bsd_errno) const noexcept;
  140. std::array<std::optional<FileDescriptor>, MAX_FD> file_descriptors;
  141. };
  142. class BSDCFG final : public ServiceFramework<BSDCFG> {
  143. public:
  144. explicit BSDCFG(Core::System& system_);
  145. ~BSDCFG() override;
  146. };
  147. } // namespace Service::Sockets