1
1

poll(2) support for channel_poll. Not yet for channel_select.

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@183 7dcaeef0-15fb-0310-b436-a5af3365683c
Этот коммит содержится в:
Aris Adamantiadis 2008-10-28 23:52:02 +00:00
родитель 1025372289
Коммит 4a3554b2fa

Просмотреть файл

@ -32,6 +32,22 @@
#endif
#include "libssh/priv.h"
#if !defined(HAVE_SELECT) && !defined(HAVE_POLL)
#error Your system must have either select() or poll()
#endif
#if !defined(HAVE_POLL) && !defined(_WIN32)
#warning your system does not have poll. Select has known limitations
#define SELECT_LIMIT_CHECK
#endif
#ifdef HAVE_POLL
#define USE_POLL
#include <poll.h>
#else
#define USE_SELECT
#endif
/** \defgroup ssh_socket Sockets
* \addtogroup ssh_socket
* @{
@ -337,6 +353,9 @@ int ssh_socket_wait_for_data(struct socket *s, SSH_SESSION *session,int len){
return SSH_OK;
}
#ifdef USE_SELECT
/* ssh_socket_poll, select() version */
/* \internal
* \brief polls the socket for data
* \param session ssh session
@ -351,6 +370,8 @@ int ssh_socket_poll(struct socket *s, int *write, int *except){
fd_set wdes; // writing set
fd_set edes; // exception set
int fdmax=-1;
enter_function();
FD_ZERO(&rdes);
FD_ZERO(&wdes);
FD_ZERO(&edes);
@ -360,6 +381,14 @@ int ssh_socket_poll(struct socket *s, int *write, int *except){
*write=0;
return 0;
}
#ifdef SELECT_LIMIT_CHECK
// some systems don't handle the fds > FD_SETSIZE
if(s->fd > FD_SETSIZE){
ssh_set_error(session, SSH_REQUEST_DENIED, "File descriptor out of range for select : %d",s->fd);
leave_function();
return -1;
}
#endif
if(!s->data_to_read)
ssh_socket_fd_set(s,&rdes,&fdmax);
if(!s->data_to_write)
@ -384,8 +413,50 @@ int ssh_socket_poll(struct socket *s, int *write, int *except){
s->data_except=ssh_socket_fd_isset(s,&edes);
*except=s->data_except;
*write=s->data_to_write;
leave_function();
return s->data_to_read;
}
#endif
#ifdef USE_POLL
/* ssh_socket_poll, poll() version */
int ssh_socket_poll(struct socket *s, int *write, int *except){
SSH_SESSION *session=s->session;
struct pollfd fd[1];
int err;
enter_function();
if(!ssh_socket_is_open(s)){
*except=1;
*write=0;
return 0;
}
fd->fd=s->fd;
fd->events=0;
if(!s->data_to_read)
fd->events |= POLLIN;
if(!s->data_to_write)
fd->events |= POLLOUT;
/* Make the call, and listen for errors */
err=poll(fd,1,0);
if(err<0){
ssh_set_error(session,SSH_FATAL, "select: %s", strerror(errno));
leave_function();
return -1;
}
if(!s->data_to_read)
s->data_to_read=fd->revents & POLLIN;
if(!s->data_to_write)
s->data_to_write=fd->revents & POLLOUT;
if(!s->data_except)
s->data_except=fd->revents & POLLERR;
*except=s->data_except;
*write=s->data_to_write;
leave_function();
return s->data_to_read;
}
#endif
/** \internal
* \brief nonblocking flush of the output buffer