From be2b585ca6a49d2ea138b9aa31596048f8c08c2b Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 26 Jul 2019 22:39:16 +0200 Subject: [PATCH] LibCore: Add CSocket::bind() (virtual) and CSocket::listen(). These will be useful for implementing server sockets. --- Libraries/LibCore/CLocalSocket.cpp | 9 +++++++++ Libraries/LibCore/CLocalSocket.h | 2 ++ Libraries/LibCore/CSocket.cpp | 12 +++++++++--- Libraries/LibCore/CSocket.h | 4 ++++ Libraries/LibCore/CSocketAddress.h | 12 ++++++++++++ Libraries/LibCore/CTCPSocket.cpp | 5 +++++ Libraries/LibCore/CTCPSocket.h | 2 +- 7 files changed, 42 insertions(+), 4 deletions(-) diff --git a/Libraries/LibCore/CLocalSocket.cpp b/Libraries/LibCore/CLocalSocket.cpp index 00d96c4c13..f4b05fa9bb 100644 --- a/Libraries/LibCore/CLocalSocket.cpp +++ b/Libraries/LibCore/CLocalSocket.cpp @@ -1,5 +1,6 @@ #include #include +#include CLocalSocket::CLocalSocket(CObject* parent) : CSocket(CSocket::Type::Local, parent) @@ -17,3 +18,11 @@ CLocalSocket::CLocalSocket(CObject* parent) CLocalSocket::~CLocalSocket() { } + +bool CLocalSocket::bind(const CSocketAddress& address) +{ + auto un = address.to_sockaddr_un(); + int rc = ::bind(fd(), (const sockaddr*)&un, sizeof(un)); + set_error(errno); + return rc == 0; +} diff --git a/Libraries/LibCore/CLocalSocket.h b/Libraries/LibCore/CLocalSocket.h index 57078b7126..c515bb83db 100644 --- a/Libraries/LibCore/CLocalSocket.h +++ b/Libraries/LibCore/CLocalSocket.h @@ -6,4 +6,6 @@ class CLocalSocket final : public CSocket { public: explicit CLocalSocket(CObject* parent = nullptr); virtual ~CLocalSocket() override; + + virtual bool bind(const CSocketAddress&) override; }; diff --git a/Libraries/LibCore/CSocket.cpp b/Libraries/LibCore/CSocket.cpp index 87419587e0..c49a6e2698 100644 --- a/Libraries/LibCore/CSocket.cpp +++ b/Libraries/LibCore/CSocket.cpp @@ -2,14 +2,13 @@ #include #include #include +#include #include #include #include #include -#include -#include #include -#include +#include CSocket::CSocket(Type type, CObject* parent) : CIODevice(parent) @@ -131,3 +130,10 @@ bool CSocket::send(const ByteBuffer& data) ASSERT(nsent == data.size()); return true; } + +bool CSocket::listen() +{ + int rc = ::listen(fd(), 5); + set_error(errno); + return rc == 0; +} diff --git a/Libraries/LibCore/CSocket.h b/Libraries/LibCore/CSocket.h index 29659b458f..20d059166b 100644 --- a/Libraries/LibCore/CSocket.h +++ b/Libraries/LibCore/CSocket.h @@ -22,6 +22,10 @@ public: bool connect(const CSocketAddress&, int port); bool connect(const CSocketAddress&); + virtual bool bind(const CSocketAddress&) = 0; + + bool listen(); + ByteBuffer receive(int max_size); bool send(const ByteBuffer&); diff --git a/Libraries/LibCore/CSocketAddress.h b/Libraries/LibCore/CSocketAddress.h index 8a9e4d84a9..9a558a9008 100644 --- a/Libraries/LibCore/CSocketAddress.h +++ b/Libraries/LibCore/CSocketAddress.h @@ -1,6 +1,8 @@ #pragma once #include +#include +#include class CSocketAddress { public: @@ -41,6 +43,16 @@ public: } } + sockaddr_un to_sockaddr_un() const + { + ASSERT(type() == Type::Local); + sockaddr_un address; + address.sun_family = AF_LOCAL; + RELEASE_ASSERT(m_local_address.length() < (int)sizeof(address.sun_path)); + strcpy(address.sun_path, m_local_address.characters()); + return address; + } + private: Type m_type { Type::Invalid }; IPv4Address m_ipv4_address; diff --git a/Libraries/LibCore/CTCPSocket.cpp b/Libraries/LibCore/CTCPSocket.cpp index 5f3702a482..d7194124af 100644 --- a/Libraries/LibCore/CTCPSocket.cpp +++ b/Libraries/LibCore/CTCPSocket.cpp @@ -17,3 +17,8 @@ CTCPSocket::CTCPSocket(CObject* parent) CTCPSocket::~CTCPSocket() { } + +bool CTCPSocket::bind(const CSocketAddress&) +{ + ASSERT_NOT_REACHED(); +} diff --git a/Libraries/LibCore/CTCPSocket.h b/Libraries/LibCore/CTCPSocket.h index 8eb330c492..71d0f8ea9a 100644 --- a/Libraries/LibCore/CTCPSocket.h +++ b/Libraries/LibCore/CTCPSocket.h @@ -6,5 +6,5 @@ public: explicit CTCPSocket(CObject* parent = nullptr); virtual ~CTCPSocket() override; -private: + virtual bool bind(const CSocketAddress&) override; };