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