1 /* $NetBSD: sock_addr.h,v 1.1.1.1 2009/06/23 10:09:00 tron Exp $ */ 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 38 extern int sock_addr_cmp_addr(const struct sockaddr *, const struct sockaddr *); 39 extern int sock_addr_cmp_port(const struct sockaddr *, const struct sockaddr *); 40 extern 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