author | terom |
Wed, 17 Dec 2008 00:40:22 +0000 | |
changeset 381 | 9b35bc329d23 |
permissions | -rw-r--r-- |
381
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
1 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
2 |
#include "SockAddr.hh" |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
3 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
4 |
#include <cstdlib> |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
5 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
6 |
NetworkAddress::NetworkAddress (void) : |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
7 |
NetworkEndpoint(), address_length(0) |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
8 |
{ |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
9 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
10 |
} |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
11 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
12 |
NetworkAddress::NetworkAddress (const sockaddr *addr, socklen_t len) : |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
13 |
NetworkEndpoint(), address_length(0) |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
14 |
{ |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
15 |
// proxy to set_sockaddr |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
16 |
set_sockaddr(addr, len); |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
17 |
} |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
18 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
19 |
void NetworkAddress::set_sockaddr (const sockaddr *addr, socklen_t len) { |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
20 |
// invalid length? |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
21 |
if (len <= 0 || len > sizeof(address)) |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
22 |
throw NetworkAddressError(*this, "set_sockaddr", "invalid sockaddr length"); |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
23 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
24 |
// copy over to address |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
25 |
memcpy(&address, addr, len); |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
26 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
27 |
// set address_length |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
28 |
address_length = len; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
29 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
30 |
// update |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
31 |
update(); |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
32 |
} |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
33 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
34 |
void NetworkAddress::update (void) { |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
35 |
char host_buf[NI_MAXHOST], serv_buf[NI_MAXSERV]; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
36 |
int err; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
37 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
38 |
// do getnameinfo() |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
39 |
if ((err = getnameinfo((sockaddr *) &address, address_length, host_buf, NI_MAXHOST, serv_buf, NI_MAXSERV, NI_NUMERICHOST | NI_NUMERICSERV))) |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
40 |
throw NetworkAddressError(*this, "getnameinfo", gai_strerror(err)); |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
41 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
42 |
// update hostname + service |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
43 |
hostname = host_buf; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
44 |
service = serv_buf; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
45 |
} |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
46 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
47 |
addrinfo* NetworkAddress::get_addrinfo (int family, int socktype, int protocol, int flags) const { |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
48 |
(void) flags; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
49 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
50 |
// get my family from address |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
51 |
int my_family = address.ss_family; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
52 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
53 |
// right family? |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
54 |
if (family && family != my_family) |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
55 |
throw NetworkAddressError(*this, "fake_getaddrinfo", "ai_family mismatch"); |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
56 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
57 |
// alllocate new addrinfo |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
58 |
addrinfo *r = new addrinfo; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
59 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
60 |
// set it up |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
61 |
r->ai_flags = 0; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
62 |
r->ai_family = my_family; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
63 |
r->ai_socktype = socktype; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
64 |
r->ai_protocol = protocol; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
65 |
r->ai_addrlen = get_socklen(); |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
66 |
r->ai_addr = const_cast<sockaddr *>(get_sockaddr()); |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
67 |
r->ai_canonname = const_cast<char *>(get_hostname().c_str()); |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
68 |
r->ai_next = NULL; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
69 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
70 |
// return it |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
71 |
return r; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
72 |
} |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
73 |
|
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
74 |
void NetworkAddress::free_addrinfo (addrinfo *info) const { |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
75 |
delete info; |
9b35bc329d23
separate sockaddr stuff out of NetworkAddress... now called NetworkEndpoint
terom
parents:
diff
changeset
|
76 |
} |