in src/afs.cc [790:863]
bool fill_client_address(Port* port, const char* clientAddress)
{
// clientAddress: "ipv4:127.0.0.1:40468"
// family: "ipv4"
// host: "127.0.0.1"
// port: "40468"
std::stringstream clientAddressStream{std::string(clientAddress)};
std::string clientFamily("");
std::string clientHost("");
std::string clientPort("");
std::getline(clientAddressStream, clientFamily, ':');
std::getline(clientAddressStream, clientHost, ':');
std::getline(clientAddressStream, clientPort);
if (!(clientFamily == "ipv4" || clientFamily == "ipv6"))
{
set_shared_string(
session_->errorMessage,
std::string("client family must be ipv4 or ipv6: ") + clientFamily);
return false;
}
auto clientPortStart = clientPort.c_str();
char* clientPortEnd = nullptr;
auto clientPortNumber = std::strtoul(clientPortStart, &clientPortEnd, 10);
if (clientPortEnd[0] != '\0')
{
set_shared_string(session_->errorMessage,
std::string("client port is invalid: ") + clientPort);
return false;
}
if (clientPortNumber == 0)
{
set_shared_string(session_->errorMessage,
std::string("client port must not 0"));
return false;
}
if (clientPortNumber > 65535)
{
set_shared_string(session_->errorMessage,
std::string("client port is too large: ") +
std::to_string(clientPortNumber));
return false;
}
if (clientFamily == "ipv4")
{
auto raddr = reinterpret_cast<sockaddr_in*>(&(port->raddr.addr));
port->raddr.salen = sizeof(sockaddr_in);
raddr->sin_family = AF_INET;
raddr->sin_port = htons(clientPortNumber);
if (inet_pton(AF_INET, clientHost.c_str(), &(raddr->sin_addr)) == 0)
{
set_shared_string(
session_->errorMessage,
std::string("client IPv4 address is invalid: ") + clientHost);
return false;
}
}
else if (clientFamily == "ipv6")
{
auto raddr = reinterpret_cast<sockaddr_in6*>(&(port->raddr.addr));
port->raddr.salen = sizeof(sockaddr_in6);
raddr->sin6_family = AF_INET6;
raddr->sin6_port = htons(clientPortNumber);
raddr->sin6_flowinfo = 0;
if (inet_pton(AF_INET6, clientHost.c_str(), &(raddr->sin6_addr)) == 0)
{
set_shared_string(
session_->errorMessage,
std::string("client IPv6 address is invalid: ") + clientHost);
return false;
}
raddr->sin6_scope_id = 0;
}
return true;
}