6 #if defined ZMQ_HAVE_IPC
20 #ifdef ZMQ_HAVE_WINDOWS
21 #ifdef ZMQ_IOTHREAD_POLLER_USE_SELECT
22 #error On Windows, IPC does not work with POLLER=select, use POLLER=epoll instead, or disable IPC transport
28 #define rmdir rmdir_utf8
29 #define unlink unlink_utf8
33 #include <sys/socket.h>
38 #ifdef ZMQ_HAVE_LOCAL_PEERCRED
39 #include <sys/types.h>
40 #include <sys/ucred.h>
42 #ifdef ZMQ_HAVE_SO_PEERCRED
43 #include <sys/types.h>
46 #if defined ZMQ_HAVE_OPENBSD
47 #define ucred sockpeercred
51 zmq::ipc_listener_t::ipc_listener_t (io_thread_t *io_thread_,
52 socket_base_t *socket_,
54 stream_listener_base_t (io_thread_, socket_,
options_), _has_file (
false)
58 void zmq::ipc_listener_t::in_event ()
60 const fd_t fd = accept ();
65 _socket->event_accept_failed (
78 return zmq::get_socket_name<ipc_address_t> (fd_, socket_end_);
81 int zmq::ipc_listener_t::set_local_address (
const char *addr_)
87 if (
options.use_fd == -1 && addr[0] ==
'*') {
88 if (create_ipc_wildcard_address (_tmp_socket_dirname, addr) < 0) {
99 ::unlink (addr.c_str ());
105 int rc =
address.resolve (addr.c_str ());
107 if (!_tmp_socket_dirname.empty ()) {
109 const int tmp_errno =
errno;
110 ::rmdir (_tmp_socket_dirname.c_str ());
111 _tmp_socket_dirname.clear ();
125 if (!_tmp_socket_dirname.empty ()) {
127 const int tmp_errno =
errno;
128 ::rmdir (_tmp_socket_dirname.c_str ());
129 _tmp_socket_dirname.clear ();
136 rc = bind (_s,
const_cast<sockaddr *
> (
address.addr ()),
142 rc = listen (_s,
options.backlog);
161 int zmq::ipc_listener_t::close ()
164 const fd_t fd_for_event = _s;
165 #ifdef ZMQ_HAVE_WINDOWS
167 wsa_assert (rc != SOCKET_ERROR);
169 int rc = ::close (_s);
175 if (_has_file &&
options.use_fd == -1) {
176 if (!_tmp_socket_dirname.empty ()) {
181 rc = ::unlink (_filename.c_str ());
184 rc = ::rmdir (_tmp_socket_dirname.c_str ());
185 _tmp_socket_dirname.clear ();
190 _socket->event_close_failed (
201 #if defined ZMQ_HAVE_SO_PEERCRED
205 if (
options.ipc_uid_accept_filters.empty ()
206 &&
options.ipc_pid_accept_filters.empty ()
207 &&
options.ipc_gid_accept_filters.empty ())
211 socklen_t
size =
sizeof (cred);
213 if (getsockopt (sock_, SOL_SOCKET, SO_PEERCRED, &cred, &
size))
215 if (
options.ipc_uid_accept_filters.find (cred.uid)
216 !=
options.ipc_uid_accept_filters.end ()
217 ||
options.ipc_gid_accept_filters.find (cred.gid)
218 !=
options.ipc_gid_accept_filters.end ()
219 ||
options.ipc_pid_accept_filters.find (cred.pid)
220 !=
options.ipc_pid_accept_filters.end ())
223 const struct passwd *pw;
224 const struct group *gr;
226 if (!(pw = getpwuid (cred.uid)))
228 for (options_t::ipc_gid_accept_filters_t::const_iterator
229 it =
options.ipc_gid_accept_filters.begin (),
232 if (!(gr = getgrgid (*
it)))
234 for (
char **mem = gr->gr_mem; *mem; mem++) {
235 if (!strcmp (*mem, pw->pw_name))
242 #elif defined ZMQ_HAVE_LOCAL_PEERCRED
246 if (
options.ipc_uid_accept_filters.empty ()
247 &&
options.ipc_gid_accept_filters.empty ())
251 socklen_t
size =
sizeof (cred);
253 if (getsockopt (sock_, 0, LOCAL_PEERCRED, &cred, &
size))
255 if (cred.cr_version != XUCRED_VERSION)
257 if (
options.ipc_uid_accept_filters.find (cred.cr_uid)
258 !=
options.ipc_uid_accept_filters.end ())
260 for (
int i = 0;
i < cred.cr_ngroups;
i++) {
261 if (
options.ipc_gid_accept_filters.find (cred.cr_groups[
i])
262 !=
options.ipc_gid_accept_filters.end ())
277 #if defined ZMQ_HAVE_SOCK_CLOEXEC && defined HAVE_ACCEPT4
280 struct sockaddr_storage ss;
281 memset (&ss, 0,
sizeof (ss));
282 #if defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_VXWORKS
283 int ss_len =
sizeof (ss);
285 socklen_t ss_len =
sizeof (ss);
289 ::accept (_s,
reinterpret_cast<struct sockaddr *
> (&ss), &ss_len);
292 #if defined ZMQ_HAVE_WINDOWS
293 const int last_error = WSAGetLastError ();
294 wsa_assert (last_error == WSAEWOULDBLOCK || last_error == WSAECONNRESET
295 || last_error == WSAEMFILE || last_error == WSAENOBUFS);
307 #if defined ZMQ_HAVE_SO_PEERCRED || defined ZMQ_HAVE_LOCAL_PEERCRED
309 int rc = ::close (
sock);
316 #ifdef ZMQ_HAVE_WINDOWS
318 wsa_assert (rc != SOCKET_ERROR);
320 int rc = ::close (
sock);