]> git.tdb.fi Git - libs/net.git/blob - source/net/inet6.cpp
77d757082379f70e713d7587bbf0d61df675ff75
[libs/net.git] / source / net / inet6.cpp
1 #include "platform_api.h"
2 #include <msp/strings/format.h>
3 #include "inet6.h"
4 #include "sockaddr_private.h"
5
6 using namespace std;
7
8 namespace Msp {
9 namespace Net {
10
11 Inet6Addr::Inet6Addr():
12         port(0)
13 {
14         fill(addr, addr+16, 0);
15 }
16
17 Inet6Addr::Inet6Addr(const SysAddr &sa)
18 {
19         const sockaddr_in6 &sai6 = reinterpret_cast<const sockaddr_in6 &>(sa.addr);
20         std::copy(sai6.sin6_addr.s6_addr, sai6.sin6_addr.s6_addr+16, addr);
21         port = htons(sai6.sin6_port);
22 }
23
24 SockAddr::SysAddr Inet6Addr::to_sys() const
25 {
26         SysAddr sa;
27         sa.size = sizeof(sockaddr_in6);
28         sockaddr_in6 &sai6 = reinterpret_cast<sockaddr_in6 &>(sa.addr);
29         sai6.sin6_family = AF_INET6;
30         std::copy(addr, addr+16, sai6.sin6_addr.s6_addr);
31         sai6.sin6_port = htons(port);
32         sai6.sin6_flowinfo = 0;
33         sai6.sin6_scope_id = 0;
34
35         return sa;
36 }
37
38 string Inet6Addr::str() const
39 {
40         string result = "[";
41         for(unsigned i=0; i<16; i+=2)
42         {
43                 unsigned short part = (addr[i]<<8) | addr[i+1];
44                 if(i>0)
45                         result += ':';
46                 result += format("%x", part);
47         }
48         result += ']';
49         if(port)
50                 result += format(":%d", port);
51
52         return result;
53 }
54
55 } // namespace Net
56 } // namespace Msp