]> git.tdb.fi Git - libs/net.git/blobdiff - source/net/unix/unix.cpp
Move most platform-specific code into overlay directories
[libs/net.git] / source / net / unix / unix.cpp
diff --git a/source/net/unix/unix.cpp b/source/net/unix/unix.cpp
new file mode 100644 (file)
index 0000000..6bb3436
--- /dev/null
@@ -0,0 +1,53 @@
+#include <stdexcept>
+#include <sys/un.h>
+#include "platform_api.h"
+#include "sockaddr_private.h"
+#include "unix.h"
+
+using namespace std;
+
+namespace Msp {
+namespace Net {
+
+UnixAddr::UnixAddr(const SysAddr &sa):
+       abstract(false)
+{
+       const sockaddr_un &sau = reinterpret_cast<const sockaddr_un &>(sa.addr);
+       if(static_cast<size_t>(sa.size)>sizeof(sa_family_t))
+       {
+               abstract = (sau.sun_path[0]==0);
+               path.assign(sau.sun_path+abstract, sa.size-sizeof(sa_family_t)-abstract);
+       }
+}
+
+UnixAddr::UnixAddr(const string &p, bool a):
+       path(p),
+       abstract(a)
+{
+       if(sizeof(sa_family_t)+path.size()+1>sizeof(sockaddr_storage))
+               throw invalid_argument("UnixAddr");
+}
+
+SockAddr::SysAddr UnixAddr::to_sys() const
+{
+       SysAddr sa;
+       sa.size = sizeof(sa_family_t);
+       if(!path.empty())
+               sa.size += path.size()+1;
+
+       sockaddr_un &sau = reinterpret_cast<sockaddr_un &>(sa.addr);
+       sau.sun_family = AF_UNIX;
+       if(!path.empty())
+       {
+               if(abstract)
+                       sau.sun_path[0] = 0;
+               std::copy(path.begin(), path.end(), sau.sun_path+abstract);
+               if(!abstract)
+                       sau.sun_path[path.size()] = 0;
+       }
+
+       return sa;
+}
+
+} // namespace Net
+} // namespace Msp