Socket.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include <Kernel/Socket.h>
  2. #include <Kernel/LocalSocket.h>
  3. #include <Kernel/UnixTypes.h>
  4. #include <Kernel/Process.h>
  5. #include <LibC/errno_numbers.h>
  6. RetainPtr<Socket> Socket::create(int domain, int type, int protocol, int& error)
  7. {
  8. (void)protocol;
  9. switch (domain) {
  10. case AF_LOCAL:
  11. return LocalSocket::create(type & SOCK_TYPE_MASK);
  12. default:
  13. error = EAFNOSUPPORT;
  14. return nullptr;
  15. }
  16. }
  17. Socket::Socket(int domain, int type, int protocol)
  18. : m_domain(domain)
  19. , m_type(type)
  20. , m_protocol(protocol)
  21. {
  22. m_origin_pid = current->pid();
  23. }
  24. Socket::~Socket()
  25. {
  26. }
  27. bool Socket::listen(int backlog, int& error)
  28. {
  29. LOCKER(m_lock);
  30. if (m_type != SOCK_STREAM) {
  31. error = -EOPNOTSUPP;
  32. return false;
  33. }
  34. m_backlog = backlog;
  35. kprintf("Socket{%p} listening with backlog=%d\n", this, m_backlog);
  36. return true;
  37. }
  38. RetainPtr<Socket> Socket::accept()
  39. {
  40. LOCKER(m_lock);
  41. if (m_pending.is_empty())
  42. return nullptr;
  43. auto client = m_pending.take_first();
  44. ASSERT(!client->is_connected());
  45. client->m_connected = true;
  46. m_clients.append(client.copy_ref());
  47. return client;
  48. }
  49. bool Socket::queue_connection_from(Socket& peer, int& error)
  50. {
  51. LOCKER(m_lock);
  52. if (m_pending.size() >= m_backlog) {
  53. error = -ECONNREFUSED;
  54. return false;
  55. }
  56. m_pending.append(peer);
  57. return true;
  58. }