diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2011-01-12 23:04:43 +0100 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2011-01-12 23:04:43 +0100 |
commit | 5b6f048197a56d0b45ad642431f2b5ee718c53e9 (patch) | |
tree | 877882858e7d6301dc7e660eef9e2dbbdddc8bed /src/client.c | |
parent | a17472ff2b723059841d194c19ad65b0d76b7860 (diff) | |
download | libssh-5b6f048197a56d0b45ad642431f2b5ee718c53e9.tar.gz libssh-5b6f048197a56d0b45ad642431f2b5ee718c53e9.tar.xz libssh-5b6f048197a56d0b45ad642431f2b5ee718c53e9.zip |
Use termination functions for event polling
Diffstat (limited to 'src/client.c')
-rw-r--r-- | src/client.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/src/client.c b/src/client.c index c77e5828..a737ba80 100644 --- a/src/client.c +++ b/src/client.c @@ -588,6 +588,21 @@ static void ssh_client_connection_callback(ssh_session session){ leave_function(); } +/** @internal + * @brief describe under which conditions the ssh_connect function may stop + */ +static int ssh_connect_termination(void *user){ + ssh_session session = (ssh_session)user; + switch(session->session_state){ + case SSH_SESSION_STATE_ERROR: + case SSH_SESSION_STATE_AUTHENTICATING: + case SSH_SESSION_STATE_DISCONNECTED: + return 1; + default: + return 0; + } +} + /** * @brief Connect to the ssh server. * @@ -670,20 +685,14 @@ int ssh_connect(ssh_session session) { ssh_log(session,SSH_LOG_PROTOCOL,"Socket connecting, now waiting for the callbacks to work"); pending: session->pending_call_state=SSH_PENDING_CALL_CONNECT; - while(session->session_state != SSH_SESSION_STATE_ERROR && - session->session_state != SSH_SESSION_STATE_AUTHENTICATING && - session->session_state != SSH_SESSION_STATE_DISCONNECTED){ - /* loop until SSH_SESSION_STATE_BANNER_RECEIVED or - * SSH_SESSION_STATE_ERROR */ - if(ssh_is_blocking(session)) - ssh_handle_packets(session,-1); - else - ssh_handle_packets(session,0); - ssh_log(session,SSH_LOG_PACKET,"ssh_connect: Actual state : %d",session->session_state); - if(!ssh_is_blocking(session)){ - leave_function(); - return SSH_AGAIN; - } + if(ssh_is_blocking(session)) + ssh_handle_packets_termination(session,-1,ssh_connect_termination,session); + else + ssh_handle_packets_termination(session,0,ssh_connect_termination, session); + ssh_log(session,SSH_LOG_PACKET,"ssh_connect: Actual state : %d",session->session_state); + if(!ssh_is_blocking(session) && !ssh_connect_termination(session)){ + leave_function(); + return SSH_AGAIN; } leave_function(); session->pending_call_state=SSH_PENDING_CALL_NONE; |