#include <folly/SocketAddress.h>
+#include <folly/Exception.h>
#include <folly/Hash.h>
#include <boost/functional/hash.hpp>
#include <errno.h>
#include <sstream>
#include <string>
+#include <system_error>
namespace {
}
}
-void SocketAddress::setFromPeerAddress(SocketDesc socket) {
+void SocketAddress::setFromPeerAddress(int socket) {
setFromSocket(socket, getpeername);
}
-void SocketAddress::setFromLocalAddress(SocketDesc socket) {
+void SocketAddress::setFromLocalAddress(int socket) {
setFromSocket(socket, getsockname);
}
"with length too long for a sockaddr_un");
}
- prepFamilyChange(AF_UNIX);
+ if (!external_) {
+ storage_.un.init();
+ }
+ external_ = true;
memcpy(storage_.un.addr, address, addrlen);
updateUnixAddressLength(addrlen);
}
std::string SocketAddress::getFullyQualified() const {
- auto family = getFamily();
- if (family != AF_INET && family != AF_INET6) {
+ if (!isFamilyInet()) {
throw std::invalid_argument("Can't get address str for non ip address");
}
return storage_.addr.toFullyQualified();
}
std::string SocketAddress::getAddressStr() const {
- char buf[INET6_ADDRSTRLEN];
- getAddressStr(buf, sizeof(buf));
- return buf;
+ if (!isFamilyInet()) {
+ throw std::invalid_argument("Can't get address str for non ip address");
+ }
+ return storage_.addr.str();
}
-void SocketAddress::getAddressStr(char* buf, size_t buflen) const {
+bool SocketAddress::isFamilyInet() const {
auto family = getFamily();
- if (family != AF_INET && family != AF_INET6) {
- throw std::invalid_argument("Can't get address str for non ip address");
- }
- std::string ret = storage_.addr.str();
- size_t len = std::min(buflen, ret.size());
+ return family == AF_INET || family == AF_INET6;
+}
+
+void SocketAddress::getAddressStr(char* buf, size_t buflen) const {
+ auto ret = getAddressStr();
+ size_t len = std::min(buflen - 1, ret.size());
memcpy(buf, ret.data(), len);
buf[len] = '\0';
}
if (other.getFamily() != getFamily()) {
return false;
}
- int mask_length = 128;
+ uint8_t mask_length = 128;
switch (getFamily()) {
case AF_INET:
mask_length = 32;
setFromSockaddr(info->ai_addr, info->ai_addrlen);
}
-void SocketAddress::setFromSocket(SocketDesc socket, GetPeerNameFunc fn) {
+void SocketAddress::setFromSocket(
+ int socket,
+ int (*fn)(int, struct sockaddr*, socklen_t*)) {
// Try to put the address into a local storage buffer.
sockaddr_storage tmp_sock;
socklen_t addrLen = sizeof(tmp_sock);