summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2013-11-15 08:47:58 +0100
committerAndreas Schneider <asn@cryptomilk.org>2013-11-15 08:47:58 +0100
commitf240ecf3287ccb96fbef95c37b530c6e6f677950 (patch)
treee8a15eecd0d839e8327a91a0f97016e95879734f
parent1972a27fe00c500b97742f845f254a96d2e8f28f (diff)
downloadlibssh-f240ecf3287ccb96fbef95c37b530c6e6f677950.tar.gz
libssh-f240ecf3287ccb96fbef95c37b530c6e6f677950.tar.xz
libssh-f240ecf3287ccb96fbef95c37b530c6e6f677950.zip
socket: Fix connect if we pass in a fd.
BUG: https://red.libssh.org/issues/106 Thanks to Saju Panikulam.
-rw-r--r--src/socket.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/socket.c b/src/socket.c
index d7cf539..fcf5202 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -449,9 +449,19 @@ void ssh_socket_close(ssh_socket s){
* file descriptors
*/
void ssh_socket_set_fd(ssh_socket s, socket_t fd) {
- s->fd_in = s->fd_out = fd;
- if(s->poll_in)
- ssh_poll_set_fd(s->poll_in,fd);
+ s->fd_in = s->fd_out = fd;
+
+ if (s->poll_in) {
+ ssh_poll_set_fd(s->poll_in,fd);
+ } else {
+ s->state = SSH_SOCKET_CONNECTING;
+
+ /* POLLOUT is the event to wait for in a nonblocking connect */
+ ssh_poll_set_events(ssh_socket_get_poll_handle_in(s), POLLOUT);
+#ifdef _WIN32
+ ssh_poll_add_events(ssh_socket_get_poll_handle_in(s), POLLWRNORM);
+#endif
+ }
}
/**
@@ -770,12 +780,6 @@ int ssh_socket_connect(ssh_socket s, const char *host, int port, const char *bin
if(fd == SSH_INVALID_SOCKET)
return SSH_ERROR;
ssh_socket_set_fd(s,fd);
- s->state=SSH_SOCKET_CONNECTING;
- /* POLLOUT is the event to wait for in a nonblocking connect */
- ssh_poll_set_events(ssh_socket_get_poll_handle_in(s),POLLOUT);
-#ifdef _WIN32
- ssh_poll_add_events(ssh_socket_get_poll_handle_in(s),POLLWRNORM);
-#endif
return SSH_OK;
}