33 #if !defined ZMQ_HAVE_WINDOWS && !defined ZMQ_HAVE_OPENVMS 49 #include <sys/socket.h> 54 #ifdef ZMQ_HAVE_LOCAL_PEERCRED 55 # include <sys/types.h> 56 # include <sys/ucred.h> 58 #ifdef ZMQ_HAVE_SO_PEERCRED 59 # include <sys/types.h> 62 # if defined ZMQ_HAVE_OPENBSD 63 # define ucred sockpeercred 82 while ( tmp_path.empty() && *tmp_env != 0 ) {
83 char *tmpdir = getenv(*tmp_env);
87 if ( tmpdir != 0 && ::stat(tmpdir, &statbuf) == 0 && S_ISDIR(statbuf.st_mode) ) {
88 tmp_path.assign(tmpdir);
89 if ( *(tmp_path.rbegin()) !=
'/' ) {
90 tmp_path.push_back(
'/');
99 tmp_path.append(
"tmpXXXXXX");
102 std::vector<char> buffer(tmp_path.length()+1);
103 strcpy(buffer.data(), tmp_path.c_str());
112 if ( mkdtemp(buffer.data()) == 0 ) {
116 path_.assign(buffer.data());
117 file_.assign (path_ +
"/socket");
122 int fd = mkstemp (buffer.data());
127 file_.assign (buffer.data());
135 own_t (io_thread_, options_),
195 struct sockaddr_storage ss;
197 int sl =
sizeof (ss);
199 socklen_t sl =
sizeof (ss);
201 int rc = getsockname (
s, (sockaddr *) &ss, &sl);
214 std::string addr (addr_);
229 ::unlink (addr.c_str());
235 int rc = address.
resolve (addr.c_str());
324 #if defined ZMQ_HAVE_SO_PEERCRED 326 bool zmq::ipc_listener_t::filter (
fd_t sock)
328 if (
options.ipc_uid_accept_filters.empty () &&
329 options.ipc_pid_accept_filters.empty () &&
330 options.ipc_gid_accept_filters.empty ())
334 socklen_t
size =
sizeof (cred);
336 if (getsockopt (sock, SOL_SOCKET, SO_PEERCRED, &cred, &size))
338 if (
options.ipc_uid_accept_filters.find (cred.uid) !=
options.ipc_uid_accept_filters.end () ||
339 options.ipc_gid_accept_filters.find (cred.gid) !=
options.ipc_gid_accept_filters.end () ||
340 options.ipc_pid_accept_filters.find (cred.pid) !=
options.ipc_pid_accept_filters.end ())
346 if (!(pw = getpwuid (cred.uid)))
348 for (options_t::ipc_gid_accept_filters_t::const_iterator it =
options.ipc_gid_accept_filters.begin ();
349 it !=
options.ipc_gid_accept_filters.end (); it++) {
350 if (!(gr = getgrgid (*it)))
352 for (
char **mem = gr->gr_mem; *mem; mem++) {
353 if (!strcmp (*mem, pw->pw_name))
360 #elif defined ZMQ_HAVE_LOCAL_PEERCRED 362 bool zmq::ipc_listener_t::filter (
fd_t sock)
364 if (
options.ipc_uid_accept_filters.empty () &&
365 options.ipc_gid_accept_filters.empty ())
369 socklen_t
size =
sizeof (cred);
371 if (getsockopt (sock, 0, LOCAL_PEERCRED, &cred, &size))
373 if (cred.cr_version != XUCRED_VERSION)
375 if (
options.ipc_uid_accept_filters.find (cred.cr_uid) !=
options.ipc_uid_accept_filters.end ())
377 for (
int i = 0; i < cred.cr_ngroups; i++) {
378 if (
options.ipc_gid_accept_filters.find (cred.cr_groups[i]) !=
options.ipc_gid_accept_filters.end ())
395 errno_assert (errno == EAGAIN || errno == EWOULDBLOCK ||
404 int rc = fcntl (sock, F_SETFD, FD_CLOEXEC);
409 #if defined ZMQ_HAVE_SO_PEERCRED || defined ZMQ_HAVE_LOCAL_PEERCRED 410 if (!filter (sock)) {
static session_base_t * create(zmq::io_thread_t *io_thread_, bool active_, zmq::socket_base_t *socket_, const options_t &options_, address_t *addr_)
void send_attach(zmq::session_base_t *destination_, zmq::i_engine *engine_, bool inc_seqnum_=true)
void process_term(int linger_)
void event_accept_failed(const std::string &addr_, int err_)
fd_t open_socket(int domain_, int type_, int protocol_)
int get_address(std::string &addr_)
ipc_listener_t(zmq::io_thread_t *io_thread_, zmq::socket_base_t *socket_, const options_t &options_)
zmq::socket_base_t * socket
const sockaddr * addr() const
static const char * tmp_env_vars[]
zmq::io_thread_t * choose_io_thread(uint64_t affinity_)
static int create_wildcard_address(std::string &path_, std::string &file_)
void event_listening(const std::string &addr_, int fd_)
int resolve(const char *path_)
ZMQ_EXPORT int zmq_errno(void)
socklen_t addrlen() const
void event_close_failed(const std::string &addr_, int fd_)
void set_pollin(handle_t handle_)
int set_address(const char *addr_)
int to_string(std::string &addr_)
void event_closed(const std::string &addr_, int fd_)
void launch_child(own_t *object_)
handle_t add_fd(fd_t fd_)
void process_term(int linger_)
void event_accepted(const std::string &addr_, int fd_)
std::string tmp_socket_dirname
void rm_fd(handle_t handle_)