1 /* $NetBSD: sock_addr.h,v 1.2 2023/12/23 20:30:46 christos 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_ADDRP(sa) \ 51 (SOCK_ADDR_FAMILY(sa) == AF_INET ? \ 52 (void *) &SOCK_ADDR_IN_ADDR(sa) : (void *) &SOCK_ADDR_IN6_ADDR(sa)) 53 #define SOCK_ADDR_PORT(sa) \ 54 (SOCK_ADDR_PTR(sa)->sa_family == AF_INET6 ? \ 55 SOCK_ADDR_IN6_PORT(sa) : SOCK_ADDR_IN_PORT(sa)) 56 #define SOCK_ADDR_PORTP(sa) \ 57 (SOCK_ADDR_PTR(sa)->sa_family == AF_INET6 ? \ 58 &SOCK_ADDR_IN6_PORT(sa) : &SOCK_ADDR_IN_PORT(sa)) 59 60 #define SOCK_ADDR_IN6_PTR(sa) ((struct sockaddr_in6 *)(sa)) 61 #define SOCK_ADDR_IN6_FAMILY(sa) SOCK_ADDR_IN6_PTR(sa)->sin6_family 62 #define SOCK_ADDR_IN6_PORT(sa) SOCK_ADDR_IN6_PTR(sa)->sin6_port 63 #define SOCK_ADDR_IN6_ADDR(sa) SOCK_ADDR_IN6_PTR(sa)->sin6_addr 64 #define IN6_ADDR(ia) (*((struct in6_addr *) (ia))) 65 66 #define SOCK_ADDR_EQ_ADDR(sa, sb) \ 67 ((SOCK_ADDR_FAMILY(sa) == AF_INET && SOCK_ADDR_FAMILY(sb) == AF_INET \ 68 && SOCK_ADDR_IN_ADDR(sa).s_addr == SOCK_ADDR_IN_ADDR(sb).s_addr) \ 69 || (SOCK_ADDR_FAMILY(sa) == AF_INET6 && SOCK_ADDR_FAMILY(sb) == AF_INET6 \ 70 && memcmp((char *) &(SOCK_ADDR_IN6_ADDR(sa)), \ 71 (char *) &(SOCK_ADDR_IN6_ADDR(sb)), \ 72 sizeof(SOCK_ADDR_IN6_ADDR(sa))) == 0)) 73 74 #define SOCK_ADDR_EQ_PORT(sa, sb) \ 75 ((SOCK_ADDR_FAMILY(sa) == AF_INET && SOCK_ADDR_FAMILY(sb) == AF_INET \ 76 && SOCK_ADDR_IN_PORT(sa) == SOCK_ADDR_IN_PORT(sb)) \ 77 || (SOCK_ADDR_FAMILY(sa) == AF_INET6 && SOCK_ADDR_FAMILY(sb) == AF_INET6 \ 78 && SOCK_ADDR_IN6_PORT(sa) == SOCK_ADDR_IN6_PORT(sb))) 79 80 #else 81 82 #ifndef HAS_SA_LEN 83 #define SOCK_ADDR_LEN(sa) sizeof(struct sockaddr_in) 84 #endif 85 86 #define SOCK_ADDR_ADDRP(sa) (&SOCK_ADDR_IN_ADDR(sa)) 87 #define SOCK_ADDR_PORT(sa) SOCK_ADDR_IN_PORT(sa) 88 #define SOCK_ADDR_PORTP(sa) (&SOCK_ADDR_IN_PORT(sa)) 89 90 #define SOCK_ADDR_EQ_ADDR(sa, sb) \ 91 (SOCK_ADDR_FAMILY(sa) == AF_INET && SOCK_ADDR_FAMILY(sb) == AF_INET \ 92 && SOCK_ADDR_IN_ADDR(sa).s_addr == SOCK_ADDR_IN_ADDR(sb).s_addr) 93 94 #define SOCK_ADDR_EQ_PORT(sa, sb) \ 95 (SOCK_ADDR_FAMILY(sa) == AF_INET && SOCK_ADDR_FAMILY(sb) == AF_INET \ 96 && SOCK_ADDR_IN_PORT(sa) == SOCK_ADDR_IN_PORT(sb)) 97 98 #endif 99 100 /* LICENSE 101 /* .ad 102 /* .fi 103 /* The Secure Mailer license must be distributed with this software. 104 /* AUTHOR(S) 105 /* Wietse Venema 106 /* IBM T.J. Watson Research 107 /* P.O. Box 704 108 /* Yorktown Heights, NY 10598, USA 109 /*--*/ 110 111 #endif 112