separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
#include "Address.hh"
#include <sstream>
NetworkEndpoint::NetworkEndpoint (void) :
hostname(), service()
{
}
NetworkEndpoint::NetworkEndpoint (std::string service) :
hostname(), service(service)
{
}
NetworkEndpoint::NetworkEndpoint (std::string hostname, std::string service) :
hostname(hostname), service(service)
{
}
addrinfo* NetworkEndpoint::get_addrinfo (int family, int socktype, int protocol, int flags) const {
addrinfo hints, *results;
int err;
// initialize flags
hints.ai_flags = flags;
hints.ai_family = family;
hints.ai_socktype = socktype;
hints.ai_protocol = protocol;
hints.ai_addrlen = 0;
hints.ai_canonname = NULL;
hints.ai_next = NULL;
// hostname + service may be NULL
const char *hostname = this->hostname.empty() ? NULL : this->hostname.c_str();
const char *service = this->service.empty() ? NULL : this->service.c_str();
// do getaddrinfo()
if ((err = getaddrinfo(hostname, service, &hints, &results)))
throw NetworkAddressError(*this, "getaddrinfo", gai_strerror(err));
// done
return results;
}
void NetworkEndpoint::free_addrinfo (addrinfo *info) const {
freeaddrinfo(info);
}
std::ostream& operator<< (std::ostream &s, const NetworkEndpoint &addr) {
s << "[" << addr.get_hostname() << ":" << addr.get_service() << "]";
return s;
}
std::string NetworkAddressError::build_str (const NetworkEndpoint &addr, const char *op, const char *msg) {
std::stringstream ss;
ss << op << ": " << addr << ": " << msg;
return ss.str();
}
NetworkAddressError::NetworkAddressError (const NetworkEndpoint &addr, const char *op, const char *msg) :
Error(build_str(addr, op, msg))
{
}