--- libaitio/src/Attic/tools.c 2012/09/19 15:19:53 1.18 +++ libaitio/src/Attic/tools.c 2012/11/19 21:12:03 1.19 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: tools.c,v 1.18 2012/09/19 15:19:53 misho Exp $ +* $Id: tools.c,v 1.19 2012/11/19 21:12:03 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -638,6 +638,41 @@ io_gethostbyname(const char *psHost, u_short port, io_ } return NULL; +} + +/* + * io_addrcmp() - Compare network addresses + * + * @a = 1st address + * @b = 2nd address + * @p = compare and ports, if family is AF_INET or AF_INET6 + * return: 0 is equal or !=0 is different + */ +int +io_addrcmp(io_sockaddr_t * __restrict a, io_sockaddr_t * __restrict b, int p) +{ + if (a && b && a->sa.sa_family == b->sa.sa_family) + switch (a->sa.sa_family) { + case AF_LOCAL: + return strcmp(a->sun.sun_path, b->sun.sun_path); + case AF_INET: + if (p && (a->sin.sin_port - b->sin.sin_port)) + return (int) !!(a->sin.sin_port - b->sin.sin_port); + else + return memcmp(&a->sin.sin_addr, &b->sin.sin_addr, + sizeof a->sin.sin_addr); + case AF_INET6: + if (p && (a->sin6.sin6_port - b->sin6.sin6_port)) + return (int) !!(a->sin6.sin6_port - b->sin6.sin6_port); + else + return memcmp(&a->sin6.sin6_addr, &b->sin6.sin6_addr, + sizeof a->sin6.sin6_addr); + case AF_LINK: + return memcmp(&a->sdl.sdl_data, &b->sdl.sdl_data, + sizeof a->sdl.sdl_data); + } + + return (int) !!(a - b); } /*