--- /dev/null
+#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