1#ifndef _SOCK_ADDR_EQ_H_INCLUDED_ 2#define _SOCK_ADDR_EQ_H_INCLUDED_ 3 4/*++ 5/* NAME 6/* sock_addr 3h 7/* SUMMARY 8/* socket address utilities 9/* SYNOPSIS 10/* #include <sock_addr.h> 11/* DESCRIPTION 12/* .nf 13 14 /* 15 * System library. 16 */ 17#include <sys/socket.h> 18#include <netinet/in.h> 19#include <string.h> 20 21 /* 22 * External interface. 23 */ 24#define SOCK_ADDR_PTR(ptr) ((struct sockaddr *)(ptr)) 25#define SOCK_ADDR_FAMILY(ptr) SOCK_ADDR_PTR(ptr)->sa_family 26#ifdef HAS_SA_LEN 27#define SOCK_ADDR_LEN(ptr) SOCK_ADDR_PTR(ptr)->sa_len 28#endif 29 30#define SOCK_ADDR_IN_PTR(sa) ((struct sockaddr_in *)(sa)) 31#define SOCK_ADDR_IN_FAMILY(sa) SOCK_ADDR_IN_PTR(sa)->sin_family 32#define SOCK_ADDR_IN_PORT(sa) SOCK_ADDR_IN_PTR(sa)->sin_port 33#define SOCK_ADDR_IN_ADDR(sa) SOCK_ADDR_IN_PTR(sa)->sin_addr 34#define IN_ADDR(ia) (*((struct in_addr *) (ia))) 35 36extern int sock_addr_cmp_addr(const struct sockaddr *, const struct sockaddr *); 37extern int sock_addr_cmp_port(const struct sockaddr *, const struct sockaddr *); 38extern int sock_addr_in_loopback(const struct sockaddr *); 39 40#ifdef HAS_IPV6 41 42#ifndef HAS_SA_LEN 43#define SOCK_ADDR_LEN(sa) \ 44 (SOCK_ADDR_PTR(sa)->sa_family == AF_INET6 ? \ 45 sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)) 46#endif 47 48#define SOCK_ADDR_PORT(sa) \ 49 (SOCK_ADDR_PTR(sa)->sa_family == AF_INET6 ? \ 50 SOCK_ADDR_IN6_PORT(sa) : SOCK_ADDR_IN_PORT(sa)) 51#define SOCK_ADDR_PORTP(sa) \ 52 (SOCK_ADDR_PTR(sa)->sa_family == AF_INET6 ? \ 53 &SOCK_ADDR_IN6_PORT(sa) : &SOCK_ADDR_IN_PORT(sa)) 54 55#define SOCK_ADDR_IN6_PTR(sa) ((struct sockaddr_in6 *)(sa)) 56#define SOCK_ADDR_IN6_FAMILY(sa) SOCK_ADDR_IN6_PTR(sa)->sin6_family 57#define SOCK_ADDR_IN6_PORT(sa) SOCK_ADDR_IN6_PTR(sa)->sin6_port 58#define SOCK_ADDR_IN6_ADDR(sa) SOCK_ADDR_IN6_PTR(sa)->sin6_addr 59#define IN6_ADDR(ia) (*((struct in6_addr *) (ia))) 60 61#define SOCK_ADDR_EQ_ADDR(sa, sb) \ 62 ((SOCK_ADDR_FAMILY(sa) == AF_INET && SOCK_ADDR_FAMILY(sb) == AF_INET \ 63 && SOCK_ADDR_IN_ADDR(sa).s_addr == SOCK_ADDR_IN_ADDR(sb).s_addr) \ 64 || (SOCK_ADDR_FAMILY(sa) == AF_INET6 && SOCK_ADDR_FAMILY(sb) == AF_INET6 \ 65 && memcmp((char *) &(SOCK_ADDR_IN6_ADDR(sa)), \ 66 (char *) &(SOCK_ADDR_IN6_ADDR(sb)), \ 67 sizeof(SOCK_ADDR_IN6_ADDR(sa))) == 0)) 68 69#define SOCK_ADDR_EQ_PORT(sa, sb) \ 70 ((SOCK_ADDR_FAMILY(sa) == AF_INET && SOCK_ADDR_FAMILY(sb) == AF_INET \ 71 && SOCK_ADDR_IN_PORT(sa) == SOCK_ADDR_IN_PORT(sb)) \ 72 || (SOCK_ADDR_FAMILY(sa) == AF_INET6 && SOCK_ADDR_FAMILY(sb) == AF_INET6 \ 73 && SOCK_ADDR_IN6_PORT(sa) == SOCK_ADDR_IN6_PORT(sb))) 74 75#else 76 77#ifndef HAS_SA_LEN 78#define SOCK_ADDR_LEN(sa) sizeof(struct sockaddr_in) 79#endif 80 81#define SOCK_ADDR_PORT(sa) SOCK_ADDR_IN_PORT(sa)) 82#define SOCK_ADDR_PORTP(sa) &SOCK_ADDR_IN_PORT(sa)) 83 84#define SOCK_ADDR_EQ_ADDR(sa, sb) \ 85 (SOCK_ADDR_FAMILY(sa) == AF_INET && SOCK_ADDR_FAMILY(sb) == AF_INET \ 86 && SOCK_ADDR_IN_ADDR(sa).s_addr == SOCK_ADDR_IN_ADDR(sb).s_addr) 87 88#define SOCK_ADDR_EQ_PORT(sa, sb) \ 89 (SOCK_ADDR_FAMILY(sa) == AF_INET && SOCK_ADDR_FAMILY(sb) == AF_INET \ 90 && SOCK_ADDR_IN_PORT(sa) == SOCK_ADDR_IN_PORT(sb)) 91 92#endif 93 94/* LICENSE 95/* .ad 96/* .fi 97/* The Secure Mailer license must be distributed with this software. 98/* AUTHOR(S) 99/* Wietse Venema 100/* IBM T.J. Watson Research 101/* P.O. Box 704 102/* Yorktown Heights, NY 10598, USA 103/*--*/ 104 105#endif 106