Postfix3.3.1
sock_addr.h
[詳解]
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 
36 extern int sock_addr_cmp_addr(const struct sockaddr *, const struct sockaddr *);
37 extern int sock_addr_cmp_port(const struct sockaddr *, const struct sockaddr *);
38 extern 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
int sock_addr_cmp_port(const struct sockaddr *, const struct sockaddr *)
Definition: sock_addr.c:136
int sock_addr_cmp_addr(const struct sockaddr *, const struct sockaddr *)
Definition: sock_addr.c:109
int sock_addr_in_loopback(const struct sockaddr *)
Definition: sock_addr.c:156