dovecot-2.0: net_accept(), net_getsock/peername(): Return UNIX s...

dovecot at dovecot.org dovecot at dovecot.org
Wed Aug 4 17:06:11 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/10c4c9d5fb5b
changeset: 11926:10c4c9d5fb5b
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Aug 04 15:06:05 2010 +0100
description:
net_accept(), net_getsock/peername(): Return UNIX sockets with family=port=0.
A lot of checks inside our code assumes that family is either AF_INET,
AF_INET6 or 0. struct ip_addr doesn't support anything else either, so having
AF_UNIX as family but without a way to get the socket name from the struct
isn't very helpful either.

diffstat:

 src/lib/network.c |  33 +++++++++++++++++++++------------
 src/lib/network.h |   6 +++---
 2 files changed, 24 insertions(+), 15 deletions(-)

diffs (81 lines):

diff -r 9cf0d33f3fe9 -r 10c4c9d5fb5b src/lib/network.c
--- a/src/lib/network.c	Wed Aug 04 13:49:54 2010 +0100
+++ b/src/lib/network.c	Wed Aug 04 15:06:05 2010 +0100
@@ -504,10 +504,13 @@
 		else
 			return -2;
 	}
-
-	if (addr != NULL) sin_get_ip(&so, addr);
-	if (port != NULL) *port = sin_get_port(&so);
-
+	if (so.sin.sin_family == AF_UNIX) {
+		if (addr != NULL) addr->family = 0;
+		if (port != NULL) *port = 0;
+	} else {
+		if (addr != NULL) sin_get_ip(&so, addr);
+		if (port != NULL) *port = sin_get_port(&so);
+	}
 	return ret;
 }
 
@@ -630,10 +633,13 @@
 	addrlen = sizeof(so);
 	if (getsockname(fd, &so.sa, &addrlen) == -1)
 		return -1;
-
-        if (addr != NULL) sin_get_ip(&so, addr);
-	if (port != NULL) *port = sin_get_port(&so);
-
+	if (so.sin.sin_family == AF_UNIX) {
+		if (addr != NULL) addr->family = 0;
+		if (port != NULL) *port = 0;
+	} else {
+		if (addr != NULL) sin_get_ip(&so, addr);
+		if (port != NULL) *port = sin_get_port(&so);
+	}
 	return 0;
 }
 
@@ -647,10 +653,13 @@
 	addrlen = sizeof(so);
 	if (getpeername(fd, &so.sa, &addrlen) == -1)
 		return -1;
-
-        if (addr != NULL) sin_get_ip(&so, addr);
-	if (port != NULL) *port = sin_get_port(&so);
-
+	if (so.sin.sin_family == AF_UNIX) {
+		if (addr != NULL) addr->family = 0;
+		if (port != NULL) *port = 0;
+	} else {
+		if (addr != NULL) sin_get_ip(&so, addr);
+		if (port != NULL) *port = sin_get_port(&so);
+	}
 	return 0;
 }
 
diff -r 9cf0d33f3fe9 -r 10c4c9d5fb5b src/lib/network.h
--- a/src/lib/network.h	Wed Aug 04 13:49:54 2010 +0100
+++ b/src/lib/network.h	Wed Aug 04 15:06:05 2010 +0100
@@ -84,7 +84,7 @@
    again. */
 int net_listen_unix_unlink_stale(const char *path, int backlog);
 /* Accept a connection on a socket. Returns -1 if the connection got closed,
-   -2 for other failures */
+   -2 for other failures. For UNIX sockets addr->family=port=0. */
 int net_accept(int fd, struct ip_addr *addr, unsigned int *port);
 
 /* Read data from socket, return number of bytes read,
@@ -103,9 +103,9 @@
    some error with name server) */
 int net_hosterror_notfound(int error) ATTR_CONST;
 
-/* Get socket local address/port */
+/* Get socket local address/port. For UNIX sockets addr->family=port=0. */
 int net_getsockname(int fd, struct ip_addr *addr, unsigned int *port);
-/* Get socket remote address/port */
+/* Get socket remote address/port. For UNIX sockets addr->family=port=0. */
 int net_getpeername(int fd, struct ip_addr *addr, unsigned int *port);
 /* Get UNIX socket name. */
 int net_getunixname(int fd, const char **name_r);


More information about the dovecot-cvs mailing list