summaryrefslogtreecommitdiff
path: root/src/net
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2018-08-20 15:59:17 +0200
committerMax Kellermann <max@musicpd.org>2018-08-20 15:59:17 +0200
commit11396d4fba1346ccbd534b13b1a4aa8500a9a60c (patch)
tree955527bfc80feb935ec5521cc449f7c006f72c80 /src/net
parent4c6ae4e9e8c30e5eb970ef4f599fc2c72df1fd9f (diff)
net/SocketAddress: add method GetLocalRaw()
Diffstat (limited to 'src/net')
-rw-r--r--src/net/SocketAddress.cxx27
-rw-r--r--src/net/SocketAddress.hxx13
2 files changed, 40 insertions, 0 deletions
diff --git a/src/net/SocketAddress.cxx b/src/net/SocketAddress.cxx
index 8b28832f8..70175a29f 100644
--- a/src/net/SocketAddress.cxx
+++ b/src/net/SocketAddress.cxx
@@ -29,9 +29,14 @@
#include "config.h"
#include "SocketAddress.hxx"
+#include "util/StringView.hxx"
#include <string.h>
+#ifdef HAVE_UN
+#include <sys/un.h>
+#endif
+
#ifdef HAVE_TCP
#ifdef _WIN32
#include <ws2tcpip.h>
@@ -46,6 +51,28 @@ SocketAddress::operator==(SocketAddress other) const noexcept
return size == other.size && memcmp(address, other.address, size) == 0;
}
+#ifdef HAVE_UN
+
+StringView
+SocketAddress::GetLocalRaw() const noexcept
+{
+ if (IsNull() || GetFamily() != AF_LOCAL)
+ /* not applicable */
+ return nullptr;
+
+ const auto sun = (const struct sockaddr_un *)GetAddress();
+ const auto start = (const char *)sun;
+ const auto path = sun->sun_path;
+ const size_t header_size = path - start;
+ if (size < header_size)
+ /* malformed address */
+ return nullptr;
+
+ return {path, size - header_size};
+}
+
+#endif
+
#ifdef HAVE_TCP
bool
diff --git a/src/net/SocketAddress.hxx b/src/net/SocketAddress.hxx
index 6a75352ac..b83cbf5b0 100644
--- a/src/net/SocketAddress.hxx
+++ b/src/net/SocketAddress.hxx
@@ -41,6 +41,8 @@
#include <sys/socket.h>
#endif
+struct StringView;
+
/**
* An OO wrapper for struct sockaddr.
*/
@@ -94,6 +96,17 @@ public:
return GetFamily() != AF_UNSPEC;
}
+#ifdef HAVE_UN
+ /**
+ * Extract the local socket path (which may begin with a null
+ * byte, denoting an "abstract" socket). The return value's
+ * "size" attribute includes the null terminator. Returns
+ * nullptr if not applicable.
+ */
+ gcc_pure
+ StringView GetLocalRaw() const noexcept;
+#endif
+
#ifdef HAVE_TCP
/**
* Is this the IPv6 wildcard address (in6addr_any)?