Index: src/util/network.c =================================================================== --- src/util/network.c (revision 29604) +++ src/util/network.c (working copy) @@ -393,7 +393,21 @@ int flags) { int ret; + socklen_t bind_address_len = address_len; +#ifdef LINUX + if (address->sa_family == AF_UNIX) + { + const struct sockaddr_un *address_un = (const struct sockaddr_un *)address; + if (address_un->sun_path[0] == '\0') + bind_address_len = \ + sizeof (struct sockaddr_un) \ + - sizeof (address_un->sun_path) \ + + strnlen (address_un->sun_path + 1, sizeof (address_un->sun_path) - 1) \ + + 1; + } +#endif + #ifdef IPV6_V6ONLY #ifdef IPPROTO_IPV6 { @@ -427,7 +441,7 @@ } #endif #endif - ret = bind (desc->fd, address, address_len); + ret = bind (desc->fd, address, bind_address_len); #ifdef MINGW if (SOCKET_ERROR == ret) SetErrnoFromWinsockError (WSAGetLastError ()); @@ -544,6 +558,18 @@ { int ret; +#ifdef LINUX + if (address->sa_family == AF_UNIX) + { + const struct sockaddr_un *address_un = (const struct sockaddr_un *)address; + if(address_un->sun_path[0] == '\0') + address_len = \ + sizeof (struct sockaddr_un) \ + - sizeof (address_un->sun_path) \ + + strnlen (address_un->sun_path + 1, sizeof (address_un->sun_path) - 1) \ + + 1; + } +#endif ret = connect (desc->fd, address, address_len); #ifdef MINGW @@ -768,6 +794,18 @@ #ifdef MSG_NOSIGNAL flags |= MSG_NOSIGNAL; #endif +#ifdef LINUX + if (dest_addr->sa_family == AF_UNIX) + { + const struct sockaddr_un *dest_addr_un = (const struct sockaddr_un *)dest_addr; + if (dest_addr_un->sun_path[0] == '\0') + dest_len = \ + sizeof (struct sockaddr) \ + - sizeof (dest_addr_un->sun_path) \ + + strnlen (dest_addr_un->sun_path + 1, sizeof (dest_addr_un->sun_path) - 1) \ + + 1; + } +#endif ret = sendto (desc->fd, message, length, flags, dest_addr, dest_len); #ifdef MINGW if (SOCKET_ERROR == ret)