7 #if defined ZMQ_HAVE_IPC
13 zmq::ipc_address_t::ipc_address_t ()
15 memset (&_address, 0,
sizeof _address);
18 zmq::ipc_address_t::ipc_address_t (
const sockaddr *sa_, socklen_t sa_len_) :
23 memset (&_address, 0,
sizeof _address);
24 if (sa_->sa_family == AF_UNIX)
25 memcpy (&_address, sa_, sa_len_);
28 zmq::ipc_address_t::~ipc_address_t ()
32 int zmq::ipc_address_t::resolve (
const char *path_)
34 const size_t path_len = strlen (path_);
35 if (path_len >=
sizeof _address.sun_path) {
39 if (path_[0] ==
'@' && !path_[1]) {
44 _address.sun_family = AF_UNIX;
45 memcpy (_address.sun_path, path_, path_len + 1);
48 *_address.sun_path =
'\0';
51 static_cast<socklen_t
> (offsetof (sockaddr_un, sun_path) + path_len);
55 int zmq::ipc_address_t::to_string (
std::string &addr_)
const
57 if (_address.sun_family != AF_UNIX) {
62 const char prefix[] =
"ipc://";
63 char buf[
sizeof prefix +
sizeof _address.sun_path];
67 const char *src_pos = _address.sun_path;
68 if (!_address.sun_path[0] && _address.sun_path[1]) {
75 const size_t src_len =
76 strnlen (src_pos, _addrlen - offsetof (sockaddr_un, sun_path)
77 - (src_pos - _address.sun_path));
78 memcpy (pos, src_pos, src_len);
79 addr_.assign (
buf, pos -
buf + src_len);
83 const sockaddr *zmq::ipc_address_t::addr ()
const
85 return reinterpret_cast<const sockaddr *
> (&_address);
88 socklen_t zmq::ipc_address_t::addrlen ()
const