From 43d881ba28ac0b71ad583aebc7b82db646990b56 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 4 May 2009 10:17:10 +0000 Subject: [PATCH] Improve channel_poll() and add a SSH_EOF return value. git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@702 7dcaeef0-15fb-0310-b436-a5af3365683c --- include/libssh/libssh.h | 7 ++--- libssh/channels.c | 58 +++++++++++++++++++++++------------------ 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/include/libssh/libssh.h b/include/libssh/libssh.h index 4567e049..5d683322 100644 --- a/include/libssh/libssh.h +++ b/include/libssh/libssh.h @@ -147,10 +147,11 @@ typedef int socket_t; #define SSH_FATAL 2 #define SSH_EINTR 3 -/* error return codes */ +/* Error return codes */ #define SSH_OK 0 /* No error */ -#define SSH_ERROR -1 /* error of some kind */ -#define SSH_AGAIN -2 /* the nonblocking call must be repeated */ +#define SSH_ERROR -1 /* Error of some kind */ +#define SSH_AGAIN -2 /* The nonblocking call must be repeated */ +#define SSH_EOF -127 /* We have already a eof */ const char *ssh_get_error(void *error); int ssh_get_error_code(void *error); diff --git a/libssh/channels.c b/libssh/channels.c index 686e1002..13ddc25b 100644 --- a/libssh/channels.c +++ b/libssh/channels.c @@ -1582,36 +1582,44 @@ int channel_read_nonblocking(CHANNEL *channel, void *dest, u32 count, return rc; } -/** \brief polls the channel for data to read - * \param channel channel - * \param is_stderr boolean to select the stderr stream - * \return number of bytes available for reading\n - * 0 if nothing is available\n - * SSH_ERROR on error - * \warning When the channel is in EOF state, the function returns 1 - * \see channel_is_eof() +/** + * @brief Polls a channel for data to read. + * + * @param channel The channel to poll. + * + * @param is_stderr A boolean to select the stderr stream. + * + * @return The number of bytes available for reading, 0 if nothing is available + * or SSH_ERROR on error. + * + * @warning When the channel is in EOF state, the function returns SSH_EOF. + * + * @see channel_is_eof() */ int channel_poll(CHANNEL *channel, int is_stderr){ - BUFFER *buffer; - SSH_SESSION *session=channel->session; - int r=0; - enter_function(); - if(is_stderr) - buffer=channel->stderr_buffer; - else - buffer=channel->stdout_buffer; + SSH_SESSION *session = channel->session; + BUFFER *stdbuf = channel->stdout_buffer; + int rc; - while(buffer_get_rest_len(buffer)==0 && !channel->remote_eof){ - r=ssh_handle_packets(channel->session); - if(r<=0) - break; - } - if(channel->remote_eof){ - leave_function(); - return 1; + enter_function(); + + if (is_stderr) { + stdbuf = channel->stderr_buffer; + } + + while (buffer_get_rest_len(stdbuf) == 0 && channel->remote_eof == 0) { + if (ssh_handle_packets(channel->session) < 0) { + break; } + } + + if (channel->remote_eof) { leave_function(); - return buffer_get_rest_len(buffer); + return SSH_EOF; + } + + leave_function(); + return buffer_get_rest_len(stdbuf); } /** \brief recover the session in which belong a channel