mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-11 18:50:28 +09:00
Fix regression in pre-connected socket setting.
* src/socket.c (ssh_socket_pollcallback): Factor some code out to ... (ssh_socket_set_connecting): New. * include/libssh/socket.h (ssh_socket_set_connecting): Add prototype. * src/client.c (ssh_connect): Use new function for a socket set by SSH_OPTIONS_FD. Signed-off-by: Werner Koch <wk@gnupg.org> Signed-off-by: Andreas Schneider <asn@cryptomilk.org>
This commit is contained in:
committed by
Andreas Schneider
parent
ae83f77511
commit
0e833d75e6
@@ -62,6 +62,7 @@ int ssh_socket_pollcallback(struct ssh_poll_handle_struct *p, socket_t fd, int r
|
|||||||
struct ssh_poll_handle_struct * ssh_socket_get_poll_handle_in(ssh_socket s);
|
struct ssh_poll_handle_struct * ssh_socket_get_poll_handle_in(ssh_socket s);
|
||||||
struct ssh_poll_handle_struct * ssh_socket_get_poll_handle_out(ssh_socket s);
|
struct ssh_poll_handle_struct * ssh_socket_get_poll_handle_out(ssh_socket s);
|
||||||
|
|
||||||
|
void ssh_socket_set_connecting(ssh_socket s, socket_t fd);
|
||||||
int ssh_socket_connect(ssh_socket s, const char *host, int port, const char *bind_addr);
|
int ssh_socket_connect(ssh_socket s, const char *host, int port, const char *bind_addr);
|
||||||
|
|
||||||
#endif /* SOCKET_H_ */
|
#endif /* SOCKET_H_ */
|
||||||
|
|||||||
@@ -665,7 +665,7 @@ int ssh_connect(ssh_session session) {
|
|||||||
session->socket_callbacks.exception=ssh_socket_exception_callback;
|
session->socket_callbacks.exception=ssh_socket_exception_callback;
|
||||||
session->socket_callbacks.userdata=session;
|
session->socket_callbacks.userdata=session;
|
||||||
if (session->fd != SSH_INVALID_SOCKET) {
|
if (session->fd != SSH_INVALID_SOCKET) {
|
||||||
ssh_socket_set_fd(session->socket, session->fd);
|
ssh_socket_set_connecting(session->socket, session->fd);
|
||||||
ret=SSH_OK;
|
ret=SSH_OK;
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
} else if (session->ProxyCommand != NULL){
|
} else if (session->ProxyCommand != NULL){
|
||||||
|
|||||||
27
src/socket.c
27
src/socket.c
@@ -701,6 +701,25 @@ int ssh_socket_get_status(ssh_socket s) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
* @brief Set a socket into the connecting state
|
||||||
|
* @param s socket handle
|
||||||
|
* @param fd file descriptor
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ssh_socket_set_connecting(ssh_socket s, int fd){
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
* @brief Launches a socket connection
|
* @brief Launches a socket connection
|
||||||
@@ -729,13 +748,7 @@ int ssh_socket_connect(ssh_socket s, const char *host, int port, const char *bin
|
|||||||
ssh_log(session,SSH_LOG_PROTOCOL,"Nonblocking connection socket: %d",fd);
|
ssh_log(session,SSH_LOG_PROTOCOL,"Nonblocking connection socket: %d",fd);
|
||||||
if(fd == SSH_INVALID_SOCKET)
|
if(fd == SSH_INVALID_SOCKET)
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
ssh_socket_set_fd(s,fd);
|
ssh_socket_set_connecting(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
|
|
||||||
leave_function();
|
leave_function();
|
||||||
return SSH_OK;
|
return SSH_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user