]> git.tdb.fi Git - libs/net.git/blob - source/net/unix/unix.cpp
Move most platform-specific code into overlay directories
[libs/net.git] / source / net / unix / unix.cpp
1 #include <stdexcept>
2 #include <sys/un.h>
3 #include "platform_api.h"
4 #include "sockaddr_private.h"
5 #include "unix.h"
6
7 using namespace std;
8
9 namespace Msp {
10 namespace Net {
11
12 UnixAddr::UnixAddr(const SysAddr &sa):
13         abstract(false)
14 {
15         const sockaddr_un &sau = reinterpret_cast<const sockaddr_un &>(sa.addr);
16         if(static_cast<size_t>(sa.size)>sizeof(sa_family_t))
17         {
18                 abstract = (sau.sun_path[0]==0);
19                 path.assign(sau.sun_path+abstract, sa.size-sizeof(sa_family_t)-abstract);
20         }
21 }
22
23 UnixAddr::UnixAddr(const string &p, bool a):
24         path(p),
25         abstract(a)
26 {
27         if(sizeof(sa_family_t)+path.size()+1>sizeof(sockaddr_storage))
28                 throw invalid_argument("UnixAddr");
29 }
30
31 SockAddr::SysAddr UnixAddr::to_sys() const
32 {
33         SysAddr sa;
34         sa.size = sizeof(sa_family_t);
35         if(!path.empty())
36                 sa.size += path.size()+1;
37
38         sockaddr_un &sau = reinterpret_cast<sockaddr_un &>(sa.addr);
39         sau.sun_family = AF_UNIX;
40         if(!path.empty())
41         {
42                 if(abstract)
43                         sau.sun_path[0] = 0;
44                 std::copy(path.begin(), path.end(), sau.sun_path+abstract);
45                 if(!abstract)
46                         sau.sun_path[path.size()] = 0;
47         }
48
49         return sa;
50 }
51
52 } // namespace Net
53 } // namespace Msp