Mercurial > dovecot > core-2.2
changeset 781:9cb7022749e7 HEAD
net_receive, net_transmit: Return -2 for regular disconnection errors. Don't
log those errors. Some other cleanups.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 12 Dec 2002 20:57:47 +0200 |
parents | 1cc947617c8b |
children | 6699647fd049 |
files | src/imap/rawlog.c src/lib/istream-file.c src/lib/network.c src/lib/network.h src/lib/randgen.c |
diffstat | 5 files changed, 40 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/src/imap/rawlog.c Thu Dec 12 20:33:32 2002 +0200 +++ b/src/imap/rawlog.c Thu Dec 12 20:57:47 2002 +0200 @@ -42,10 +42,13 @@ } net_set_nonblock(in, TRUE); - r_ret = read(in, buf, sizeof(buf)); - if (r_ret <= 0) { - if (r_ret < 0) - i_error("imap_in: read() failed: %m"); + do { + r_ret = net_receive(in, buf, sizeof(buf)); + } while (r_ret == 0); + + if (r_ret < 0) { + if (r_ret == -1) + i_error("imap_in: net_receive() failed: %m"); /* disconnected */ io_loop_stop(ioloop); @@ -58,10 +61,10 @@ net_set_nonblock(out, FALSE); do { - s_ret = write(out, buf, r_ret); - if (s_ret <= 0) { - if (r_ret < 0) - i_error("imap_in: write() failed: %m"); + s_ret = net_transmit(out, buf, r_ret); + if (s_ret < 0) { + if (s_ret == -1) + i_error("imap_in: net_transmit() failed: %m"); /* disconnected */ io_loop_stop(ioloop);
--- a/src/lib/istream-file.c Thu Dec 12 20:33:32 2002 +0200 +++ b/src/lib/istream-file.c Thu Dec 12 20:57:47 2002 +0200 @@ -199,6 +199,12 @@ } if (ret < 0) { + if (errno == ECONNRESET || errno == ETIMEDOUT) { + /* treat as disconnection */ + stream->istream.stream_errno = 0; + return -1; + } + if (errno == EINTR || errno == EAGAIN) ret = 0; else {
--- a/src/lib/network.c Thu Dec 12 20:33:32 2002 +0200 +++ b/src/lib/network.c Thu Dec 12 20:57:47 2002 +0200 @@ -378,11 +378,21 @@ i_assert(len <= SSIZE_T_MAX); ret = recv(fd, buf, len, 0); - if (ret == 0) - return -1; /* disconnected */ + if (ret == 0) { + /* disconnected */ + errno = 0; + return -2; + } - if (ret < 0 && (errno == EINTR || errno == EAGAIN)) - return 0; + if (ret < 0) { + if (errno == EINTR || errno == EAGAIN) + return 0; + + if (errno == ECONNRESET || errno == ETIMEDOUT) { + /* treat as disconnection */ + return -2; + } + } return ret; } @@ -397,8 +407,11 @@ i_assert(len <= SSIZE_T_MAX); ret = send(fd, data, len, 0); - if (ret == -1 && (errno == EINTR || errno == EPIPE || errno == EAGAIN)) - return 0; + if (ret == -1 && (errno == EINTR || errno == EAGAIN)) + return 0; + + if (errno == EPIPE) + return -2; return ret; }
--- a/src/lib/network.h Thu Dec 12 20:33:32 2002 +0200 +++ b/src/lib/network.h Thu Dec 12 20:57:47 2002 +0200 @@ -71,9 +71,10 @@ -2 for fatal failure */ int net_accept(int fd, IPADDR *addr, unsigned int *port); -/* Read data from socket, return number of bytes read, -1 = error */ +/* Read data from socket, return number of bytes read, + -1 = error, -2 = disconnected */ ssize_t net_receive(int fd, void *buf, size_t len); -/* Transmit data, return number of bytes sent, -1 = error */ +/* Transmit data, return number of bytes sent, -1 = error, -2 = disconnected */ ssize_t net_transmit(int fd, const void *data, size_t len); /* Get IP addresses for host. ips contains ips_count of IPs, they don't need
--- a/src/lib/randgen.c Thu Dec 12 20:33:32 2002 +0200 +++ b/src/lib/randgen.c Thu Dec 12 20:57:47 2002 +0200 @@ -43,7 +43,7 @@ for (pos = 0; pos < size; pos += ret) { ret = read(urandom_fd, (char *) buf + pos, size - pos); - if (ret < 0) + if (ret < 0 && errno != EINTR) i_fatal("Error reading from /dev/urandom: %m"); } }