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