aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-file-utils.c
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2004-05-06 11:58:05 +0800
committerMichael Zucci <zucchi@src.gnome.org>2004-05-06 11:58:05 +0800
commit1ebfd7383e214985d005c4cbe73dc662e73d824f (patch)
treea8fddc1905681985bad5de54873cc0cb2f4b8b94 /camel/camel-file-utils.c
parent322d11cb69b1b5711b84bc44ced15b49bcb0ff52 (diff)
downloadgsoc2013-evolution-1ebfd7383e214985d005c4cbe73dc662e73d824f.tar.gz
gsoc2013-evolution-1ebfd7383e214985d005c4cbe73dc662e73d824f.tar.zst
gsoc2013-evolution-1ebfd7383e214985d005c4cbe73dc662e73d824f.zip
set nodelay and keepalive on the socket.
2004-05-06 Not Zed <NotZed@Ximian.com> * providers/imap/camel-imap-store.c (connect_to_server): set nodelay and keepalive on the socket. * camel-file-utils.c (camel_read): put a timeout on the select. Logic shuffle to match the ssl stuff. (camel_write): Similar. * camel-tcp-stream-ssl.c (stream_connect): remove timeout, use CONNECT_TIMEOUT directly. (stream_read): put a timeout on the poll. IO_TIMEOUT. And a little logic shuffle. (stream_write): similar. (CONNECT_TIMEOUT): make this 4 minutes === tcp-raw timeout. svn path=/trunk/; revision=25812
Diffstat (limited to 'camel/camel-file-utils.c')
-rw-r--r--camel/camel-file-utils.c63
1 files changed, 34 insertions, 29 deletions
diff --git a/camel/camel-file-utils.c b/camel/camel-file-utils.c
index 0d51795e32..f04cfa8278 100644
--- a/camel/camel-file-utils.c
+++ b/camel/camel-file-utils.c
@@ -43,6 +43,7 @@
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#endif
+#define IO_TIMEOUT (60*4)
/**
* camel_file_util_encode_uint32:
@@ -404,27 +405,32 @@ camel_read (int fd, char *buf, size_t n)
fcntl (fd, F_SETFL, flags | O_NONBLOCK);
do {
+ struct timeval tv;
+ int res;
+
FD_ZERO (&rdset);
FD_SET (fd, &rdset);
FD_SET (cancel_fd, &rdset);
fdmax = MAX (fd, cancel_fd) + 1;
-
+ tv.tv_sec = IO_TIMEOUT;
+ tv.tv_usec = 0;
nread = -1;
- if (select (fdmax, &rdset, 0, 0, NULL) != -1) {
- if (FD_ISSET (cancel_fd, &rdset)) {
- fcntl (fd, F_SETFL, flags);
- errno = EINTR;
- return -1;
- }
-
+
+ res = select(fdmax, &rdset, 0, 0, &tv);
+ if (res == -1)
+ ;
+ else if (res == 0)
+ errno = ETIMEDOUT;
+ else if (FD_ISSET (cancel_fd, &rdset)) {
+ errno = EINTR;
+ goto failed;
+ } else {
do {
nread = read (fd, buf, n);
} while (nread == -1 && errno == EINTR);
- } else if (errno == EINTR) {
- errno = EAGAIN;
}
- } while (nread == -1 && (errno == EAGAIN || errno == EWOULDBLOCK));
-
+ } while (nread == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK));
+ failed:
errnosav = errno;
fcntl (fd, F_SETFL, flags);
errno = errnosav;
@@ -475,36 +481,35 @@ camel_write (int fd, const char *buf, size_t n)
fdmax = MAX (fd, cancel_fd) + 1;
do {
+ struct timeval tv;
+ int res;
+
FD_ZERO (&rdset);
FD_ZERO (&wrset);
FD_SET (fd, &wrset);
FD_SET (cancel_fd, &rdset);
-
+ tv.tv_sec = IO_TIMEOUT;
+ tv.tv_usec = 0;
w = -1;
- if (select (fdmax, &rdset, &wrset, 0, NULL) != -1) {
- if (FD_ISSET (cancel_fd, &rdset)) {
- fcntl (fd, F_SETFL, flags);
- errno = EINTR;
- return -1;
- }
-
+
+ res = select (fdmax, &rdset, &wrset, 0, &tv);
+ if (res == -1) {
+ if (errno == EINTR)
+ w = 0;
+ } else if (res == 0)
+ errno = ETIMEDOUT;
+ else if (FD_ISSET (cancel_fd, &rdset))
+ errno = EINTR;
+ else {
do {
w = write (fd, buf + written, n - written);
} while (w == -1 && errno == EINTR);
if (w == -1) {
- if (errno == EAGAIN || errno == EWOULDBLOCK) {
+ if (errno == EAGAIN || errno == EWOULDBLOCK)
w = 0;
- } else {
- errnosav = errno;
- fcntl (fd, F_SETFL, flags);
- errno = errnosav;
- return -1;
- }
} else
written += w;
- } else if (errno == EINTR) {
- w = 0;
}
} while (w != -1 && written < n);