}
std::string DomainSocket::GetSocketName() const {
- if (m_socket != kInvalidSocketValue) {
- struct sockaddr_un saddr_un;
- saddr_un.sun_family = AF_UNIX;
- socklen_t sock_addr_len = sizeof(struct sockaddr_un);
- if (::getpeername(m_socket, (struct sockaddr *)&saddr_un, &sock_addr_len) ==
- 0) {
- std::string name(saddr_un.sun_path + GetNameOffset(),
- sock_addr_len -
- offsetof(struct sockaddr_un, sun_path) -
+ if (m_socket == kInvalidSocketValue)
+ return "";
+
+ struct sockaddr_un saddr_un;
+ saddr_un.sun_family = AF_UNIX;
+ socklen_t sock_addr_len = sizeof(struct sockaddr_un);
+ if (::getpeername(m_socket, (struct sockaddr *)&saddr_un, &sock_addr_len) !=
+ 0)
+ return "";
+
+ if (sock_addr_len <= offsetof(struct sockaddr_un, sun_path))
+ return ""; // Unnamed domain socket
+
+ llvm::StringRef name(saddr_un.sun_path + GetNameOffset(),
+ sock_addr_len - offsetof(struct sockaddr_un, sun_path) -
GetNameOffset());
- if (name.back() == '\0') name.pop_back();
- return name;
- }
- }
- return "";
+ if (name.back() == '\0')
+ name = name.drop_back();
+
+ return name.str();
}
std::string DomainSocket::GetRemoteConnectionURI() const {
- if (m_socket != kInvalidSocketValue) {
- return std::string(llvm::formatv(
- "{0}://{1}",
- GetNameOffset() == 0 ? "unix-connect" : "unix-abstract-connect",
- GetSocketName()));
- }
- return "";
+ std::string name = GetSocketName();
+ if (name.empty())
+ return name;
+
+ return llvm::formatv(
+ "{0}://{1}",
+ GetNameOffset() == 0 ? "unix-connect" : "unix-abstract-connect", name);
}
EXPECT_TRUE(UriParser::Parse(uri, scheme, hostname, port, path));
EXPECT_EQ(scheme, "unix-connect");
EXPECT_EQ(path, domain_path);
+
+ EXPECT_EQ(socket_b_up->GetRemoteConnectionURI(), "");
}
#endif