Home | History | Annotate | Line # | Download | only in util
      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