xref: /netbsd-src/external/ibm-public/postfix/dist/src/util/sock_addr.h (revision c48c605c14fd8622b523d1d6a3f0c0bad133ea89)
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