diff options
Diffstat (limited to 'libssh/socket.c')
-rw-r--r-- | libssh/socket.c | 99 |
1 files changed, 3 insertions, 96 deletions
diff --git a/libssh/socket.c b/libssh/socket.c index 5bd00133..16da8cca 100644 --- a/libssh/socket.c +++ b/libssh/socket.c @@ -36,22 +36,6 @@ #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 SSH Sockets * \addtogroup ssh_socket * @{ @@ -472,86 +456,10 @@ int ssh_socket_wait_for_data(struct socket *s, SSH_SESSION *session, u32 len) { return SSH_OK; } -#ifdef USE_SELECT -/* ssh_socket_poll, select() version */ - -/* \internal - * \brief polls the socket for data - * \param session ssh session - * \param writeable value pointed to set to 1 if it is possible to write - * \param except value pointed to set to 1 if there is an exception - * \return 1 if it is possible to read, 0 otherwise, -1 on error - */ -int ssh_socket_poll(struct socket *s, int *writeable, int *except) { - SSH_SESSION *session = s->session; - struct timeval sometime; - fd_set rdes; // read set - fd_set wdes; // writing set - fd_set edes; // exception set - int fdmax =- 1; - - enter_function(); - - FD_ZERO(&rdes); - FD_ZERO(&wdes); - FD_ZERO(&edes); - - if (!ssh_socket_is_open(s)) { - *except = 1; - *writeable = 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) { - ssh_socket_fd_set(s, &wdes, &fdmax); - } - ssh_socket_fd_set(s, &edes, &fdmax); - - /* Set to return immediately (no blocking) */ - sometime.tv_sec = 0; - sometime.tv_usec = 0; - - /* Make the call, and listen for errors */ - if (select(fdmax, &rdes, &wdes, &edes, &sometime) < 0) { - ssh_set_error(session, SSH_FATAL, "select(): %s", strerror(errno)); - leave_function(); - return -1; - } - - if (!s->data_to_read) { - s->data_to_read = ssh_socket_fd_isset(s, &rdes); - } - if (!s->data_to_write) { - s->data_to_write = ssh_socket_fd_isset(s, &wdes); - } - if (!s->data_except) { - s->data_except = ssh_socket_fd_isset(s, &edes); - } - *except = s->data_except; - *writeable = s->data_to_write; - - leave_function(); - return (s->data_to_read || (buffer_get_rest_len(s->in_buffer) > 0)); -} -#endif - -#ifdef USE_POLL -/* ssh_socket_poll, poll() version */ +/* ssh_socket_poll */ int ssh_socket_poll(struct socket *s, int *writeable, int *except) { SSH_SESSION *session = s->session; - struct pollfd fd[1]; + pollfd_t fd[1]; int rc = -1; enter_function(); @@ -573,7 +481,7 @@ int ssh_socket_poll(struct socket *s, int *writeable, int *except) { } /* Make the call, and listen for errors */ - rc = poll(fd, 1, 0); + rc = ssh_poll(fd, 1, 0); if (rc < 0) { ssh_set_error(session, SSH_FATAL, "poll(): %s", strerror(errno)); leave_function(); @@ -596,7 +504,6 @@ int ssh_socket_poll(struct socket *s, int *writeable, int *except) { leave_function(); return (s->data_to_read || (buffer_get_rest_len(s->in_buffer) > 0)); } -#endif /** \internal * \brief nonblocking flush of the output buffer |