diff options
Diffstat (limited to 'src/ipc_connecter.cpp')
-rw-r--r-- | src/ipc_connecter.cpp | 174 |
1 files changed, 17 insertions, 157 deletions
diff --git a/src/ipc_connecter.cpp b/src/ipc_connecter.cpp index 942cd49..4b8f3bf 100644 --- a/src/ipc_connecter.cpp +++ b/src/ipc_connecter.cpp @@ -18,32 +18,24 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "ipc_connecter.hpp" + +#if !defined ZMQ_HAVE_WINDOWS && !defined ZMQ_HAVE_OPENVMS + #include <new> #include <string> -#include "ipc_connecter.hpp" #include "tcp_engine.hpp" #include "io_thread.hpp" #include "platform.hpp" #include "random.hpp" -#include "ip.hpp" #include "err.hpp" +#include "ip.hpp" -#if defined ZMQ_HAVE_WINDOWS -#include "windows.hpp" -#else #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> -#include <arpa/inet.h> -#include <netinet/tcp.h> -#include <netinet/in.h> -#include <netdb.h> -#include <fcntl.h> -#ifdef ZMQ_HAVE_OPENVMS -#include <ioctl.h> -#endif -#endif +#include <sys/un.h> zmq::ipc_connecter_t::ipc_connecter_t (class io_thread_t *io_thread_, class session_t *session_, const options_t &options_, @@ -175,166 +167,33 @@ int zmq::ipc_connecter_t::get_new_reconnect_ivl () return this_interval; } -#ifdef ZMQ_HAVE_WINDOWS - -int zmq::ipc_connecter_t::set_address (const char *protocol_, const char *addr_) +int zmq::ipc_connecter_t::set_address (const char *addr_) { - errno = EPROTONOSUPPORT; - return -1; + return resolve_local_path (&addr, &addr_len, addr_); } int zmq::ipc_connecter_t::open () { zmq_assert (s == retired_fd); + struct sockaddr *sa = (struct sockaddr*) &addr; // Create the socket. - s = socket (addr.ss_family, SOCK_STREAM, IPPROTO_TCP); - if (s == INVALID_SOCKET) { - wsa_error_to_errno (); + zmq_assert (AF_UNIX == sa->sa_family); + s = socket (AF_UNIX, SOCK_STREAM, 0); + if (s == -1) return -1; - } - // Set to non-blocking mode. - unsigned long argp = 1; - int rc = ioctlsocket (s, FIONBIO, &argp); - wsa_assert (rc != SOCKET_ERROR); + // Set the non-blocking flag. + unblock_socket (s); // Connect to the remote peer. - rc = ::connect (s, (sockaddr*) &addr, addr_len); + int rc = ::connect (s, (struct sockaddr*) &addr, sizeof (sockaddr_un)); // Connect was successfull immediately. if (rc == 0) return 0; - // Asynchronous connect was launched. - if (rc == SOCKET_ERROR && (WSAGetLastError () == WSAEINPROGRESS || - WSAGetLastError () == WSAEWOULDBLOCK)) { - errno = EAGAIN; - return -1; - } - - wsa_error_to_errno (); - return -1; -} - -int zmq::ipc_connecter_t::close () -{ - zmq_assert (s != retired_fd); - int rc = closesocket (s); - wsa_assert (rc != SOCKET_ERROR); - s = retired_fd; - return 0; -} - -zmq::fd_t zmq::ipc_connecter_t::connect () -{ - // Nonblocking connect have finished. Check whether an error occured. - int err = 0; - socklen_t len = sizeof err; - int rc = getsockopt (s, SOL_SOCKET, SO_ERROR, (char*) &err, &len); - zmq_assert (rc == 0); - if (err != 0) { - - // Assert that the error was caused by the networking problems - // rather than 0MQ bug. - if (err == WSAECONNREFUSED || err == WSAETIMEDOUT || - err == WSAECONNABORTED || err == WSAEHOSTUNREACH || - err == WSAENETUNREACH || err == WSAENETDOWN) - return retired_fd; - - wsa_assert_no (err); - } - - // Return the newly connected socket. - fd_t result = s; - s = retired_fd; - return result; -} - -#else - -int zmq::ipc_connecter_t::set_address (const char *addr_) -{ - return resolve_local_path (&addr, &addr_len, addr_); -} - -int zmq::ipc_connecter_t::open () -{ - zmq_assert (s == retired_fd); - struct sockaddr *sa = (struct sockaddr*) &addr; - - if (AF_UNIX != sa->sa_family) { - - // Create the socket. - s = socket (sa->sa_family, SOCK_STREAM, IPPROTO_TCP); - if (s == -1) - return -1; - - // Set to non-blocking mode. -#ifdef ZMQ_HAVE_OPENVMS - int flags = 1; - int rc = ioctl (s, FIONBIO, &flags); - errno_assert (rc != -1); -#else - int flags = fcntl (s, F_GETFL, 0); - if (flags == -1) - flags = 0; - int rc = fcntl (s, F_SETFL, flags | O_NONBLOCK); - errno_assert (rc != -1); -#endif - - // Connect to the remote peer. - rc = ::connect (s, (struct sockaddr*) &addr, addr_len); - - // Connect was successfull immediately. - if (rc == 0) - return 0; - - // Asynchronous connect was launched. - if (rc == -1 && errno == EINPROGRESS) { - errno = EAGAIN; - return -1; - } - - // Error occured. - int err = errno; - close (); - errno = err; - return -1; - } - -#ifndef ZMQ_HAVE_OPENVMS - else { - - // Create the socket. - zmq_assert (AF_UNIX == sa->sa_family); - s = socket (AF_UNIX, SOCK_STREAM, 0); - if (s == -1) - return -1; - - // Set the non-blocking flag. - int flag = fcntl (s, F_GETFL, 0); - if (flag == -1) - flag = 0; - int rc = fcntl (s, F_SETFL, flag | O_NONBLOCK); - errno_assert (rc != -1); - - // Connect to the remote peer. - rc = ::connect (s, (struct sockaddr*) &addr, sizeof (sockaddr_un)); - - // Connect was successfull immediately. - if (rc == 0) - return 0; - - // Error occured. - int err = errno; - close (); - errno = err; - return -1; - } -#endif - - zmq_assert (false); + // Forward the error. return -1; } @@ -379,3 +238,4 @@ zmq::fd_t zmq::ipc_connecter_t::connect () } #endif + |