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