diff options
-rw-r--r-- | camel/ChangeLog | 6 | ||||
-rw-r--r-- | camel/camel-tcp-stream-openssl.c | 26 |
2 files changed, 24 insertions, 8 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index 4f91d680ac..b11dd5310b 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,9 @@ +2002-03-07 Jeffrey Stedfast <fejj@ximian.com> + + * camel-tcp-stream-openssl.c (stream_read): Add a timeout on the + select. + (stream_write): Same. + 2002-03-06 Jeffrey Stedfast <fejj@ximian.com> * providers/smtp/camel-smtp-transport.c (connect_to_server): Fix diff --git a/camel/camel-tcp-stream-openssl.c b/camel/camel-tcp-stream-openssl.c index 69c2ca139c..2c3709fbd8 100644 --- a/camel/camel-tcp-stream-openssl.c +++ b/camel/camel-tcp-stream-openssl.c @@ -45,6 +45,10 @@ #include <pthread.h> #endif +#define d(x) + +#define TIMEOUT_USEC (10000) + static CamelTcpStreamClass *parent_class = NULL; /* Returns the class for a CamelTcpStreamOpenSSL */ @@ -210,20 +214,20 @@ ssl_errno (SSL *ssl, int ret) return 0; case SSL_ERROR_ZERO_RETURN: /* this one does not map well at all */ - printf ("ssl_errno: SSL_ERROR_ZERO_RETURN\n"); + d(printf ("ssl_errno: SSL_ERROR_ZERO_RETURN\n")); return EINVAL; case SSL_ERROR_WANT_READ: /* non-fatal; retry */ case SSL_ERROR_WANT_WRITE: /* non-fatal; retry */ - printf ("ssl_errno: SSL_ERROR_WANT_[READ,WRITE]\n"); + d(printf ("ssl_errno: SSL_ERROR_WANT_[READ,WRITE]\n")); return EAGAIN; case SSL_ERROR_SYSCALL: - printf ("ssl_errno: SSL_ERROR_SYSCALL\n"); + d(printf ("ssl_errno: SSL_ERROR_SYSCALL\n")); return EINTR; case SSL_ERROR_SSL: - printf ("ssl_errno: SSL_ERROR_SSL <-- very useful error...riiiiight\n"); + d(printf ("ssl_errno: SSL_ERROR_SSL <-- very useful error...riiiiight\n")); return EINTR; default: - printf ("ssl_errno: default error\n"); + d(printf ("ssl_errno: default error\n")); return EINTR; } } @@ -286,6 +290,7 @@ stream_read (CamelStream *stream, char *buffer, size_t n) } while (nread < 0 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); } else { int error, flags, fdmax; + struct timeval timeout; fd_set rdset; flags = fcntl (openssl->priv->sockfd, F_GETFL); @@ -298,7 +303,9 @@ stream_read (CamelStream *stream, char *buffer, size_t n) FD_SET (openssl->priv->sockfd, &rdset); FD_SET (cancel_fd, &rdset); - select (fdmax, &rdset, 0, 0, NULL); + timeout.tv_sec = 0; + timeout.tv_usec = TIMEOUT_USEC; + select (fdmax, &rdset, 0, 0, &timeout); if (FD_ISSET (cancel_fd, &rdset)) { fcntl (openssl->priv->sockfd, F_SETFL, flags); errno = EINTR; @@ -354,8 +361,9 @@ stream_write (CamelStream *stream, const char *buffer, size_t n) written += w; } while (w != -1 && written < n); } else { - fd_set rdset, wrset; int error, flags, fdmax; + struct timeval timeout; + fd_set rdset, wrset; flags = fcntl (openssl->priv->sockfd, F_GETFL); fcntl (openssl->priv->sockfd, F_SETFL, flags | O_NONBLOCK); @@ -367,7 +375,9 @@ stream_write (CamelStream *stream, const char *buffer, size_t n) FD_SET (openssl->priv->sockfd, &wrset); FD_SET (cancel_fd, &rdset); - select (fdmax, &rdset, &wrset, 0, NULL); + timeout.tv_sec = 0; + timeout.tv_usec = TIMEOUT_USEC; + select (fdmax, &rdset, &wrset, 0, &timeout); if (FD_ISSET (cancel_fd, &rdset)) { fcntl (openssl->priv->sockfd, F_SETFL, flags); errno = EINTR; |