From c8144cc4b4777c2365339f77f88ad06c60046a34 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Tue, 8 Sep 2020 10:23:51 +0000 Subject: [PATCH] added qse_skadrealsize() && SocketAddress::getAddrRealSize() --- qse/include/qse/si/SocketAddress.hpp | 7 +++++++ qse/include/qse/si/nwad.h | 14 ++++++++++++- qse/lib/si/SocketAddress.cpp | 8 +++++++ qse/lib/si/nwad-skad.c | 31 ++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/qse/include/qse/si/SocketAddress.hpp b/qse/include/qse/si/SocketAddress.hpp index d9953d65..47d623b6 100644 --- a/qse/include/qse/si/SocketAddress.hpp +++ b/qse/include/qse/si/SocketAddress.hpp @@ -61,6 +61,8 @@ public: SocketAddress (const qse_skad_t* skad) QSE_CPP_NOEXCEPT; SocketAddress (const qse_nwad_t* nwad) QSE_CPP_NOEXCEPT; + bool operator== (const SocketAddress& addr) const QSE_CPP_NOEXCEPT; + int getFamily () const QSE_CPP_NOEXCEPT; qse_skad_t* getAddrPtr() QSE_CPP_NOEXCEPT @@ -78,6 +80,11 @@ public: return qse_skadsize(&this->skad); } + int getAddrRealSize () const QSE_CPP_NOEXCEPT + { + return qse_skadrealsize(&this->skad); + } + int getAddrCapa() const QSE_CPP_NOEXCEPT { return QSE_SIZEOF(this->skad); diff --git a/qse/include/qse/si/nwad.h b/qse/include/qse/si/nwad.h index 2e32d9f1..d08abb32 100644 --- a/qse/include/qse/si/nwad.h +++ b/qse/include/qse/si/nwad.h @@ -337,13 +337,25 @@ QSE_EXPORT int qse_skadfamily ( /** - * The qse_skadlength() function returns the socket address size + * The qse_skadsize() function returns the socket address size * of a given address \a skad. */ QSE_EXPORT int qse_skadsize ( const qse_skad_t* skad ); +/** + * The qse_skadrealsize() function returns the socket address size + * of a given address \a skad. It differs from qse_skadsize() in that + * it returns the size of the actual data instead of the whole address + * structure. For example, the null-terminated path in a local domain + * socket address may be shorter than the actual path buffer. + */ +QSE_EXPORT int qse_skadrealsize ( + const qse_skad_t* skad +); + + #if defined(__cplusplus) } #endif diff --git a/qse/lib/si/SocketAddress.cpp b/qse/lib/si/SocketAddress.cpp index 6219cfde..acb42df4 100644 --- a/qse/lib/si/SocketAddress.cpp +++ b/qse/lib/si/SocketAddress.cpp @@ -104,6 +104,14 @@ SocketAddress::SocketAddress (const qse_nwad_t* nwad) QSE_CPP_NOEXCEPT this->set (nwad); } +bool SocketAddress::operator== (const SocketAddress& addr) const QSE_CPP_NOEXCEPT +{ + if (this == &addr) return true; + if (FAMILY(&this->skad) != FAMILY(&addr.skad)) return false; + if (this->getAddrRealSize() != addr.getAddrRealSize()) return false; + return QSE_MEMCMP(this->getAddrPtr(), addr.getAddrPtr(), addr.getAddrRealSize()) == 0; +} + int SocketAddress::getFamily () const QSE_CPP_NOEXCEPT { return FAMILY(&this->skad); diff --git a/qse/lib/si/nwad-skad.c b/qse/lib/si/nwad-skad.c index a046da30..d505dfb8 100644 --- a/qse/lib/si/nwad-skad.c +++ b/qse/lib/si/nwad-skad.c @@ -287,3 +287,34 @@ int qse_skadsize (const qse_skad_t* skad) return 0; } + +int qse_skadrealsize (const qse_skad_t* skad) +{ + sockaddr_t* sa = (sockaddr_t*)skad; + QSE_ASSERT (QSE_SIZEOF(*skad) >= QSE_SIZEOF(*sa)); + + switch (FAMILY(skad)) + { + #if defined(AF_INET) + case AF_INET: return QSE_SIZEOF(sa->in4); + #endif + + #if defined(AF_INET6) + case AF_INET6: return QSE_SIZEOF(sa->in6); + #endif + + #if defined(AF_UNIX) + case AF_UNIX: + { + return QSE_OFFSETOF(struct sockaddr_un, sun_path) + qse_mbslen(sa->un.sun_path); + } + #endif + + #if defined(AF_PACKET) + case AF_PACKET: return QSE_SIZEOF(sa->ll); + #endif + + } + + return 0; +}