terom@381: terom@381: #include "SockAddr.hh" terom@381: terom@381: #include terom@381: terom@381: NetworkAddress::NetworkAddress (void) : terom@381: NetworkEndpoint(), address_length(0) terom@381: { terom@381: terom@381: } terom@381: terom@381: NetworkAddress::NetworkAddress (const sockaddr *addr, socklen_t len) : terom@381: NetworkEndpoint(), address_length(0) terom@381: { terom@381: // proxy to set_sockaddr terom@381: set_sockaddr(addr, len); terom@381: } terom@381: terom@381: void NetworkAddress::set_sockaddr (const sockaddr *addr, socklen_t len) { terom@381: // invalid length? terom@381: if (len <= 0 || len > sizeof(address)) terom@381: throw NetworkAddressError(*this, "set_sockaddr", "invalid sockaddr length"); terom@381: terom@381: // copy over to address terom@381: memcpy(&address, addr, len); terom@381: terom@381: // set address_length terom@381: address_length = len; terom@381: terom@381: // update terom@381: update(); terom@381: } terom@381: terom@381: void NetworkAddress::update (void) { terom@381: char host_buf[NI_MAXHOST], serv_buf[NI_MAXSERV]; terom@381: int err; terom@381: terom@381: // do getnameinfo() terom@381: if ((err = getnameinfo((sockaddr *) &address, address_length, host_buf, NI_MAXHOST, serv_buf, NI_MAXSERV, NI_NUMERICHOST | NI_NUMERICSERV))) terom@381: throw NetworkAddressError(*this, "getnameinfo", gai_strerror(err)); terom@381: terom@381: // update hostname + service terom@381: hostname = host_buf; terom@381: service = serv_buf; terom@381: } terom@381: terom@381: addrinfo* NetworkAddress::get_addrinfo (int family, int socktype, int protocol, int flags) const { terom@381: (void) flags; terom@381: terom@381: // get my family from address terom@381: int my_family = address.ss_family; terom@381: terom@381: // right family? terom@381: if (family && family != my_family) terom@381: throw NetworkAddressError(*this, "fake_getaddrinfo", "ai_family mismatch"); terom@381: terom@381: // alllocate new addrinfo terom@381: addrinfo *r = new addrinfo; terom@381: terom@381: // set it up terom@381: r->ai_flags = 0; terom@381: r->ai_family = my_family; terom@381: r->ai_socktype = socktype; terom@381: r->ai_protocol = protocol; terom@381: r->ai_addrlen = get_socklen(); terom@381: r->ai_addr = const_cast(get_sockaddr()); terom@381: r->ai_canonname = const_cast(get_hostname().c_str()); terom@381: r->ai_next = NULL; terom@381: terom@381: // return it terom@381: return r; terom@381: } terom@381: terom@381: void NetworkAddress::free_addrinfo (addrinfo *info) const { terom@381: delete info; terom@381: }