]> git.tdb.fi Git - libs/net.git/blob - source/inet6.cpp
Header changes
[libs/net.git] / source / inet6.cpp
1 #include <msp/core/except.h>
2 #include <msp/strings/format.h>
3 #include "inet6.h"
4
5 using namespace std;
6
7 namespace Msp {
8 namespace Net {
9
10 Inet6Addr::Inet6Addr():
11         addr(in6addr_any),
12         port(0)
13 { }
14
15 Inet6Addr::Inet6Addr(const sockaddr_in6 &sai6):
16         addr(sai6.sin6_addr),
17         port(sai6.sin6_port)
18 { }
19
20 Inet6Addr::Inet6Addr(unsigned char a[16], in_port_t p):
21         port(p)
22 {
23         std::copy(a, a+16, addr.s6_addr);
24 }
25
26 string Inet6Addr::str() const
27 {
28         string result = "[";
29         for(unsigned i=0; i<16; i+=2)
30         {
31                 unsigned short part = (addr.s6_addr[i]<<8) | addr.s6_addr[i+1];
32                 if(i>0)
33                         result += ':';
34                 result += format("%x", part);
35         }
36         result += ']';
37         if(port)
38                 result += format(":%d", ntohs(port));
39
40         return result;
41 }
42
43 unsigned Inet6Addr::fill_sockaddr(sockaddr &) const
44 {
45         throw Exception("Inet6Addr doesn't fit in struct sockaddr");
46 }
47
48 unsigned Inet6Addr::fill_sockaddr(sockaddr_storage &sa) const
49 {
50         sockaddr_in6 &sai6 = reinterpret_cast<sockaddr_in6 &>(sa);
51         sai6.sin6_family = AF_INET6;
52         sai6.sin6_port = port;
53         sai6.sin6_addr = addr;
54         sai6.sin6_flowinfo = 0;
55         sai6.sin6_scope_id = 0;
56
57         return sizeof(sockaddr_in6);
58 }
59
60 } // namespace Net
61 } // namespace Msp