diff options
-rw-r--r-- | include/libssh/priv.h | 2 | ||||
-rw-r--r-- | src/connect.c | 171 |
2 files changed, 0 insertions, 173 deletions
diff --git a/include/libssh/priv.h b/include/libssh/priv.h index 2a1ddb44..ce74465a 100644 --- a/include/libssh/priv.h +++ b/include/libssh/priv.h @@ -272,8 +272,6 @@ int ssh_auth_reply_success(ssh_session session, int partial); int ssh_send_banner(ssh_session session, int is_server); /* connect.c */ -socket_t ssh_connect_host(ssh_session session, const char *host,const char - *bind_addr, int port, long timeout, long usec); socket_t ssh_connect_host_nonblocking(ssh_session session, const char *host, const char *bind_addr, int port); diff --git a/src/connect.c b/src/connect.c index 477b29e6..549fd127 100644 --- a/src/connect.c +++ b/src/connect.c @@ -139,84 +139,6 @@ static int getai(const char *host, int port, struct addrinfo **ai) { return getaddrinfo(host, service, &hints, ai); } -static int ssh_connect_ai_timeout(ssh_session session, const char *host, - int port, struct addrinfo *ai, long timeout, long usec, socket_t s) { - int timeout_ms; - ssh_pollfd_t fds; - int rc = 0; - int ret; - socklen_t len = sizeof(rc); - - /* I know we're losing some precision. But it's not like poll-like family - * type of mechanisms are precise up to the microsecond. - */ - timeout_ms=timeout * 1000 + usec / 1000; - - rc = ssh_socket_set_nonblocking(s); - if (rc < 0) { - ssh_set_error(session, SSH_FATAL, - "Failed to set socket non-blocking for %s:%d", host, port); - ssh_connect_socket_close(s); - return -1; - } - - SSH_LOG(SSH_LOG_RARE, "Trying to connect to host: %s:%d with " - "timeout %d ms", host, port, timeout_ms); - - /* The return value is checked later */ - connect(s, ai->ai_addr, ai->ai_addrlen); - freeaddrinfo(ai); - - fds.fd=s; - fds.revents=0; - fds.events=POLLOUT; -#ifdef _WIN32 - fds.events |= POLLWRNORM; -#endif - rc = ssh_poll(&fds,1,timeout_ms); - - if (rc == 0) { - /* timeout */ - ssh_set_error(session, SSH_FATAL, - "Timeout while connecting to %s:%d", host, port); - ssh_connect_socket_close(s); - - return -1; - } - - if (rc < 0) { - ssh_set_error(session, SSH_FATAL, - "poll error: %s", strerror(errno)); - ssh_connect_socket_close(s); - - return -1; - } - rc = -1; - - /* Get connect(2) return code. Zero means no error */ - ret = getsockopt(s, SOL_SOCKET, SO_ERROR,(char *) &rc, &len); - if (ret < 0 || rc != 0) { - ssh_set_error(session, SSH_FATAL, - "Connect to %s:%d failed: %s", host, port, strerror(rc)); - ssh_connect_socket_close(s); - - return -1; - } - - /* s is connected ? */ - SSH_LOG(SSH_LOG_PACKET, "Socket connected with timeout"); - ret = ssh_socket_set_blocking(s); - if (ret < 0) { - ssh_set_error(session, SSH_FATAL, - "Failed to set socket as blocking connecting to %s:%d failed: %s", - host, port, strerror(errno)); - ssh_connect_socket_close(s); - return -1; - } - - return s; -} - static int set_tcp_nodelay(socket_t socket) { int opt = 1; @@ -231,99 +153,6 @@ static int set_tcp_nodelay(socket_t socket) /** * @internal * - * @brief Connect to an IPv4 or IPv6 host specified by its IP address or - * hostname. - * - * @returns A file descriptor, < 0 on error. - */ -socket_t ssh_connect_host(ssh_session session, const char *host, - const char *bind_addr, int port, long timeout, long usec) { - socket_t s = -1; - int rc; - struct addrinfo *ai; - struct addrinfo *itr; - - rc = getai(host, port, &ai); - if (rc != 0) { - ssh_set_error(session, SSH_FATAL, - "Failed to resolve hostname %s (%s)", host, gai_strerror(rc)); - - return -1; - } - - for (itr = ai; itr != NULL; itr = itr->ai_next){ - /* create socket */ - s = socket(itr->ai_family, itr->ai_socktype, itr->ai_protocol); - if (s < 0) { - ssh_set_error(session, SSH_FATAL, - "Socket create failed: %s", strerror(errno)); - continue; - } - - if (bind_addr) { - struct addrinfo *bind_ai; - struct addrinfo *bind_itr; - - SSH_LOG(SSH_LOG_PACKET, "Resolving %s", bind_addr); - - rc = getai(bind_addr, 0, &bind_ai); - if (rc != 0) { - ssh_set_error(session, SSH_FATAL, - "Failed to resolve bind address %s (%s)", - bind_addr, - gai_strerror(rc)); - freeaddrinfo(ai); - close(s); - - return -1; - } - - for (bind_itr = bind_ai; bind_itr != NULL; bind_itr = bind_itr->ai_next) { - if (bind(s, bind_itr->ai_addr, bind_itr->ai_addrlen) < 0) { - ssh_set_error(session, SSH_FATAL, - "Binding local address: %s", strerror(errno)); - continue; - } else { - break; - } - } - freeaddrinfo(bind_ai); - - /* Cannot bind to any local addresses */ - if (bind_itr == NULL) { - ssh_connect_socket_close(s); - s = -1; - continue; - } - } - - if (timeout || usec) { - socket_t ret = ssh_connect_ai_timeout(session, host, port, itr, - timeout, usec, s); - - freeaddrinfo(ai); - return ret; - } - - if (connect(s, itr->ai_addr, itr->ai_addrlen) < 0) { - ssh_set_error(session, SSH_FATAL, "Connect failed: %s", strerror(errno)); - ssh_connect_socket_close(s); - s = -1; - continue; - } else { - /* We are connected */ - break; - } - } - - freeaddrinfo(ai); - - return s; -} - -/** - * @internal - * * @brief Launches a nonblocking connect to an IPv4 or IPv6 host * specified by its IP address or hostname. * |