diff options
author | Jeffrey Stedfast <fejj@ximian.com> | 2002-03-08 00:24:19 +0800 |
---|---|---|
committer | Jeffrey Stedfast <fejj@src.gnome.org> | 2002-03-08 00:24:19 +0800 |
commit | 06ddc94963ff2c93605c00dd9304610295ee3e54 (patch) | |
tree | 465335c8f2e14ae3ff18c9df5c0b5ec6176a301d /camel/camel-tcp-stream-openssl.c | |
parent | 69a4ca1fb2dea2171b87d57271c050c33c9553fa (diff) | |
download | gsoc2013-evolution-06ddc94963ff2c93605c00dd9304610295ee3e54.tar.gz gsoc2013-evolution-06ddc94963ff2c93605c00dd9304610295ee3e54.tar.zst gsoc2013-evolution-06ddc94963ff2c93605c00dd9304610295ee3e54.zip |
Add a timeout on the select. (stream_write): Same.
2002-03-07 Jeffrey Stedfast <fejj@ximian.com>
* camel-tcp-stream-openssl.c (stream_read): Add a timeout on the
select.
(stream_write): Same.
svn path=/trunk/; revision=15963
Diffstat (limited to 'camel/camel-tcp-stream-openssl.c')
-rw-r--r-- | camel/camel-tcp-stream-openssl.c | 26 |
1 files changed, 18 insertions, 8 deletions
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; |