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