X-Git-Url: http://git.tdb.fi/?p=libs%2Fnet.git;a=blobdiff_plain;f=source%2Fnet%2Funix%2Funix.cpp;fp=source%2Fnet%2Funix%2Funix.cpp;h=6bb34361584e773b38fa8309cb84c2e3eca365bd;hp=0000000000000000000000000000000000000000;hb=88bbb4039aa274c7f41ebe3a18085b63427e5475;hpb=6f6845971a21c2d7e04b87925f5e657f0f20ca0d diff --git a/source/net/unix/unix.cpp b/source/net/unix/unix.cpp new file mode 100644 index 0000000..6bb3436 --- /dev/null +++ b/source/net/unix/unix.cpp @@ -0,0 +1,53 @@ +#include +#include +#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(sa.addr); + if(static_cast(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(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