# HG changeset patch # User Timo Sirainen # Date 1280930765 -3600 # Node ID 10c4c9d5fb5b7a7a194bddf29634f2b93f6dcc4a # Parent 9cf0d33f3fe90d577824a41215a433d964f7688a 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. 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);