1/* 2 * Copyright (C) Internet Systems Consortium, Inc. ("ISC") 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 13 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14 * PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17/* $Id: sockaddr.h,v 1.8 2020/12/21 11:41:09 florian Exp $ */ 18 19#ifndef ISC_SOCKADDR_H 20#define ISC_SOCKADDR_H 1 21 22/*! \file isc/sockaddr.h */ 23 24#include <sys/socket.h> 25#include <netinet/in.h> 26#include <arpa/inet.h> 27 28#include <isc/types.h> 29#include <sys/un.h> 30 31#define ISC_SOCKADDR_CMPADDR 0x0001 /*%< compare the address 32 * sin_addr/sin6_addr */ 33#define ISC_SOCKADDR_CMPPORT 0x0002 /*%< compare the port 34 * sin_port/sin6_port */ 35#define ISC_SOCKADDR_CMPSCOPE 0x0004 /*%< compare the scope 36 * sin6_scope */ 37#define ISC_SOCKADDR_CMPSCOPEZERO 0x0008 /*%< when comparing scopes 38 * zero scopes always match */ 39 40int 41isc_sockaddr_compare(const struct sockaddr_storage *a, const struct sockaddr_storage *b, 42 unsigned int flags); 43/*%< 44 * Compare the elements of the two address ('a' and 'b') as specified 45 * by 'flags' and report if they are equal or not. 46 * 47 * 'flags' is set from ISC_SOCKADDR_CMP*. 48 */ 49 50int 51isc_sockaddr_equal(const struct sockaddr_storage *a, const struct sockaddr_storage *b); 52/*%< 53 * Return 1 iff the socket addresses 'a' and 'b' are equal. 54 */ 55 56int 57isc_sockaddr_eqaddr(const struct sockaddr_storage *a, const struct sockaddr_storage *b); 58/*%< 59 * Return 1 iff the address parts of the socket addresses 60 * 'a' and 'b' are equal, ignoring the ports. 61 */ 62 63void 64isc_sockaddr_any(struct sockaddr_storage *sockaddr); 65/*%< 66 * Return the IPv4 wildcard address. 67 */ 68 69void 70isc_sockaddr_any6(struct sockaddr_storage *sockaddr); 71/*%< 72 * Return the IPv6 wildcard address. 73 */ 74 75void 76isc_sockaddr_anyofpf(struct sockaddr_storage *sockaddr, int family); 77/*%< 78 * Set '*sockaddr' to the wildcard address of protocol family 79 * 'family'. 80 * 81 * Requires: 82 * \li 'family' is AF_INET or AF_INET6. 83 */ 84 85int 86isc_sockaddr_pf(const struct sockaddr_storage *sockaddr); 87/*%< 88 * Get the protocol family of 'sockaddr'. 89 * 90 * Requires: 91 * 92 *\li 'sockaddr' is a valid sockaddr with an address family of AF_INET 93 * or AF_INET6. 94 * 95 * Returns: 96 * 97 *\li The protocol family of 'sockaddr', e.g. PF_INET or PF_INET6. 98 */ 99 100in_port_t 101isc_sockaddr_getport(const struct sockaddr_storage *sockaddr); 102/*%< 103 * Get the port stored in 'sockaddr'. 104 */ 105 106isc_result_t 107isc_sockaddr_totext(const struct sockaddr_storage *sockaddr, isc_buffer_t *target); 108/*%< 109 * Append a text representation of 'sockaddr' to the buffer 'target'. 110 * The text will include both the IP address (v4 or v6) and the port. 111 * The text is null terminated, but the terminating null is not 112 * part of the buffer's used region. 113 * 114 * Returns: 115 * \li ISC_R_SUCCESS 116 * \li ISC_R_NOSPACE The text or the null termination did not fit. 117 */ 118 119void 120isc_sockaddr_format(const struct sockaddr_storage *sa, char *array, unsigned int size); 121/*%< 122 * Format a human-readable representation of the socket address '*sa' 123 * into the character array 'array', which is of size 'size'. 124 * The resulting string is guaranteed to be null-terminated. 125 */ 126 127int 128isc_sockaddr_ismulticast(const struct sockaddr_storage *sa); 129/*%< 130 * Returns #1 if the address is a multicast address. 131 */ 132 133int 134isc_sockaddr_islinklocal(const struct sockaddr_storage *sa); 135/*%< 136 * Returns 1 if the address is a link local address. 137 */ 138 139int 140isc_sockaddr_issitelocal(const struct sockaddr_storage *sa); 141/*%< 142 * Returns 1 if the address is a sitelocal address. 143 */ 144 145#define ISC_SOCKADDR_FORMATSIZE \ 146 sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:XXX.XXX.XXX.XXX%SSSSSSSSSS#YYYYY") 147/*%< 148 * Minimum size of array to pass to isc_sockaddr_format(). 149 */ 150 151#endif /* ISC_SOCKADDR_H */ 152