Mercurial > dovecot > core-2.2
changeset 11926:10c4c9d5fb5b
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.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 04 Aug 2010 15:06:05 +0100 |
parents | 9cf0d33f3fe9 |
children | 353d73775b69 |
files | src/lib/network.c src/lib/network.h |
diffstat | 2 files changed, 24 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- 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; }
--- 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);