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");
 	}
 }