summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2011-08-09 22:59:17 +0200
committerAndreas Schneider <asn@cryptomilk.org>2011-08-09 22:59:17 +0200
commit2f878736427f5fd846f8ebb0c834e6a65bf8a638 (patch)
treeacb26e0e8d281ff5089209f3166cc3d2c3eb355f
parent6c45d6dc0196a2846313b588c0e05996813ab3f8 (diff)
downloadlibssh-2f878736427f5fd846f8ebb0c834e6a65bf8a638.tar.gz
libssh-2f878736427f5fd846f8ebb0c834e6a65bf8a638.tar.xz
libssh-2f878736427f5fd846f8ebb0c834e6a65bf8a638.zip
channels: Handle SSH_AGAIN in channel_open().
-rw-r--r--src/channels.c13
-rw-r--r--src/session.c8
2 files changed, 9 insertions, 12 deletions
diff --git a/src/channels.c b/src/channels.c
index fb57be0..6a616ad 100644
--- a/src/channels.c
+++ b/src/channels.c
@@ -296,11 +296,14 @@ static int channel_open(ssh_channel channel, const char *type_c, int window,
/* Todo: fix this into a correct loop */
/* wait until channel is opened by server */
while(channel->state == SSH_CHANNEL_STATE_NOT_OPEN){
- ssh_handle_packets(session, -2);
- if (session->session_state == SSH_SESSION_STATE_ERROR) {
- err = SSH_ERROR;
- break;
- }
+ err = ssh_handle_packets(session, -2);
+ if (err != SSH_OK) {
+ break;
+ }
+ if (session->session_state == SSH_SESSION_STATE_ERROR) {
+ err = SSH_ERROR;
+ break;
+ }
}
if(channel->state == SSH_CHANNEL_STATE_OPEN)
err=SSH_OK;
diff --git a/src/session.c b/src/session.c
index 5aa6cbb..589fa5b 100644
--- a/src/session.c
+++ b/src/session.c
@@ -464,18 +464,12 @@ int ssh_handle_packets(ssh_session session, int timeout) {
tm = ssh_make_milliseconds(session->timeout, session->timeout_usec);
}
rc = ssh_poll_ctx_dopoll(ctx, tm);
-
if (rc == SSH_ERROR) {
session->session_state = SSH_SESSION_STATE_ERROR;
}
leave_function();
-
- if (session->session_state == SSH_SESSION_STATE_ERROR) {
- return SSH_ERROR;
- }
-
- return SSH_OK;
+ return rc;
}
/**