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
Этот коммит содержится в:
родитель
3d9fbe8eea
Коммит
43d881ba28
@ -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);
|
||||
|
@ -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
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user