src/Network/Address.cc
author terom
Wed, 17 Dec 2008 00:40:22 +0000
changeset 381 9b35bc329d23
parent 380 d193dd1d8a7e
permissions -rw-r--r--
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))
{

}