bd911976d51f102751848568ccf56592fd5f6d77Tinderbox User * Copyright (C) 1999-2007, 2010-2012, 2014-2017 Internet Systems Consortium, Inc. ("ISC")
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
2cc1d2536d5834fbe20281068b8bd34dd1ee5337David Lawrenceisc_sockaddr_equal(const isc_sockaddr_t *a, const isc_sockaddr_t *b) {
c1807114ce574896694e3f449c73b098fe91730fMark Andrews return (isc_sockaddr_compare(a, b, ISC_SOCKADDR_CMPADDR|
c1807114ce574896694e3f449c73b098fe91730fMark Andrewsisc_sockaddr_eqaddr(const isc_sockaddr_t *a, const isc_sockaddr_t *b) {
c1807114ce574896694e3f449c73b098fe91730fMark Andrews return (isc_sockaddr_compare(a, b, ISC_SOCKADDR_CMPADDR|
c1807114ce574896694e3f449c73b098fe91730fMark Andrewsisc_sockaddr_compare(const isc_sockaddr_t *a, const isc_sockaddr_t *b,
c1807114ce574896694e3f449c73b098fe91730fMark Andrews unsigned int flags)
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley * We don't just memcmp because the sin_zero field isn't always
3724ec85fb720159dd4542d9c590725bb7effb6fBob Halley if (a->type.sa.sa_family != b->type.sa.sa_family)
c1807114ce574896694e3f449c73b098fe91730fMark Andrews memcmp(&a->type.sin.sin_addr, &b->type.sin.sin_addr,
c1807114ce574896694e3f449c73b098fe91730fMark Andrews memcmp(&a->type.sin6.sin6_addr, &b->type.sin6.sin6_addr,
c1807114ce574896694e3f449c73b098fe91730fMark Andrews * If ISC_SOCKADDR_CMPSCOPEZERO is set then don't return
c1807114ce574896694e3f449c73b098fe91730fMark Andrews * ISC_FALSE if one of the scopes in zero.
c1807114ce574896694e3f449c73b098fe91730fMark Andrews a->type.sin6.sin6_scope_id != b->type.sin6.sin6_scope_id &&
c1807114ce574896694e3f449c73b098fe91730fMark Andrews a->type.sin6.sin6_port != b->type.sin6.sin6_port)
54570ba7ffb85ad8449d86bd0e14fb6fb2e271c4James Brister if (memcmp(&a->type, &b->type, a->length) != 0)
33911b409bea2e0576cb1a58e0f3408f63187976Andreas Gustafssonisc_sockaddr_eqaddrprefix(const isc_sockaddr_t *a, const isc_sockaddr_t *b,
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson return (isc_netaddr_eqprefix(&na, &nb, prefixlen));
4ed0c326e6c344589db02738358f98d96c6299d2Andreas Gustafssonisc_sockaddr_totext(const isc_sockaddr_t *sockaddr, isc_buffer_t *target) {
35af0018ddee51e2a9551d7aec343933498d0a79Andreas Gustafsson * Do the port first, giving us the opportunity to check for
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * unsupported address families before calling
35af0018ddee51e2a9551d7aec343933498d0a79Andreas Gustafsson * isc_netaddr_fromsockaddr().
806c235ecf533b98d068b3f8df9d7abbe1e30cf9Mark Andrews snprintf(pbuf, sizeof(pbuf), "%u", ntohs(sockaddr->type.sin.sin_port));
806c235ecf533b98d068b3f8df9d7abbe1e30cf9Mark Andrews snprintf(pbuf, sizeof(pbuf), "%u", ntohs(sockaddr->type.sin6.sin6_port));
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews if (plen >= isc_buffer_availablelength(target))
15683369e0113bd08863a705a8a1785c093455d3Mark Andrews isc_buffer_putmem(target, sockaddr->type.sunix.sun_path, plen);
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrews * Null terminate after used region.
35af0018ddee51e2a9551d7aec343933498d0a79Andreas Gustafsson isc_netaddr_fromsockaddr(&netaddr, sockaddr);
35af0018ddee51e2a9551d7aec343933498d0a79Andreas Gustafsson result = isc_netaddr_totext(&netaddr, target);
bb25076ffc6fd068c081c3c41b9782f715edd883Andreas Gustafsson if (1 + plen + 1 > isc_buffer_availablelength(target))
87cafc5e70f79f2586d067fbdd64f61bbab069d2David Lawrence isc_buffer_putmem(target, (const unsigned char *)"#", 1);
87cafc5e70f79f2586d067fbdd64f61bbab069d2David Lawrence isc_buffer_putmem(target, (const unsigned char *)pbuf, plen);
87cafc5e70f79f2586d067fbdd64f61bbab069d2David Lawrence * Null terminate after used region.
28e509b145c3d241d1d2d9102fea38afad95bbd4Andreas Gustafssonisc_sockaddr_format(const isc_sockaddr_t *sa, char *array, unsigned int size) {
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence * The message is the same as in netaddr.c.
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence isc_msgcat_get(isc_msgcat, ISC_MSGSET_NETADDR,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence "<unknown address, family %u>"),
0f0ed7ea47ce9911e9249fba14ecfef8d6054008Mark Andrewsisc_sockaddr_hash(const isc_sockaddr_t *sockaddr, isc_boolean_t address_only) {
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews const unsigned char *s = NULL;
56f6fd83625392a3055483e6a55c6d4b666fecd3Bob Halley unsigned int h = 0;
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews unsigned int p = 0;
1e107b3d7b54de5022c3328423164e533afcc15eMark Andrews s = (const unsigned char *)&sockaddr->type.sin.sin_addr;
1e107b3d7b54de5022c3328423164e533afcc15eMark Andrews length = sizeof(sockaddr->type.sin.sin_addr.s_addr);
47c5b8af920a93763c97d9a93ea1fd766961a5b3Evan Hunt s = (const unsigned char *)in6;
1e107b3d7b54de5022c3328423164e533afcc15eMark Andrews length = sizeof(sockaddr->type.sin.sin_addr.s_addr);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson length = sizeof(sockaddr->type.sin6.sin6_addr);
c54091c8ed26b98ceabcb3f82237b847e328769aMark Andrews "unknown address family: %d"),
5d79b60fc5e4dad4f04da39570517d20a2425f8bMukund Sivaraman h = isc_hash_function(s, length, ISC_TRUE, NULL);
5d79b60fc5e4dad4f04da39570517d20a2425f8bMukund Sivaraman h = isc_hash_function(&p, sizeof(p), ISC_TRUE, &h);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->type.sin.sin_len = sizeof(sockaddr->type.sin);
6c41175537784e3d84f47b5b47b7db0e6cc8d5cfMichael Graff sockaddr->type.sin.sin_addr.s_addr = INADDR_ANY;
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->length = sizeof(sockaddr->type.sin);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->type.sin6.sin6_len = sizeof(sockaddr->type.sin6);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->length = sizeof(sockaddr->type.sin6);
0f0ed7ea47ce9911e9249fba14ecfef8d6054008Mark Andrewsisc_sockaddr_fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina,
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->type.sin.sin_len = sizeof(sockaddr->type.sin);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->length = sizeof(sockaddr->type.sin);
5bba7216f3263dc49dd4db2ac64b6203a9e2b180Andreas Gustafssonisc_sockaddr_anyofpf(isc_sockaddr_t *sockaddr, int pf) {
0f0ed7ea47ce9911e9249fba14ecfef8d6054008Mark Andrewsisc_sockaddr_fromin6(isc_sockaddr_t *sockaddr, const struct in6_addr *ina6,
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->type.sin6.sin6_len = sizeof(sockaddr->type.sin6);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->length = sizeof(sockaddr->type.sin6);
0f0ed7ea47ce9911e9249fba14ecfef8d6054008Mark Andrewsisc_sockaddr_v6fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina,
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->type.sin6.sin6_len = sizeof(sockaddr->type.sin6);
2dcb05b6a864f418c9f40ff525f56ce9c449006cMichael Graff sockaddr->type.sin6.sin6_addr.s6_addr[10] = 0xff;
2dcb05b6a864f418c9f40ff525f56ce9c449006cMichael Graff sockaddr->type.sin6.sin6_addr.s6_addr[11] = 0xff;
e851ea826066ac5a5b01c2c23218faa0273a12e8Evan Hunt memmove(&sockaddr->type.sin6.sin6_addr.s6_addr[12], ina, 4);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->length = sizeof(sockaddr->type.sin6);
0f0ed7ea47ce9911e9249fba14ecfef8d6054008Mark Andrewsisc_sockaddr_pf(const isc_sockaddr_t *sockaddr) {
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley * Get the protocol family of 'sockaddr'.
ae35d63c9d590537e97bd6f23f3b053666a7633dBob Halley * Assume that PF_xxx == AF_xxx for all AF and PF.
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence isc_msgcat_get(isc_msgcat, ISC_MSGSET_SOCKADDR,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence "unknown address family: %d"),
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafssonisc_sockaddr_fromnetaddr(isc_sockaddr_t *sockaddr, const isc_netaddr_t *na,
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson sockaddr->type.sin.sin_family = na->family;
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->length = sizeof(sockaddr->type.sin);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->type.sin.sin_len = sizeof(sockaddr->type.sin);
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson sockaddr->type.sin.sin_addr = na->type.in;
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson sockaddr->type.sin.sin_port = htons(port);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->length = sizeof(sockaddr->type.sin6);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson sockaddr->type.sin6.sin6_len = sizeof(sockaddr->type.sin6);
e851ea826066ac5a5b01c2c23218faa0273a12e8Evan Hunt memmove(&sockaddr->type.sin6.sin6_addr, &na->type.in6, 16);
6526fd032fc418411da3af4201214e95c113d3e2Mark Andrews sockaddr->type.sin6.sin6_scope_id = isc_netaddr_getzone(na);
5d82424f5d3c77c092c111b935041fd3dc4b3e98Andreas Gustafsson sockaddr->type.sin6.sin6_port = htons(port);
043c6c62e63f0fcdd573f47137fb3be5c565aef1Bob Halleyisc_sockaddr_setport(isc_sockaddr_t *sockaddr, in_port_t port) {
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence isc_msgcat_get(isc_msgcat, ISC_MSGSET_SOCKADDR,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence "unknown address family: %d"),
45e1bd63587102c3bb361eaca42ee7b714fb3542Mark Andrewsisc_sockaddr_getport(const isc_sockaddr_t *sockaddr) {
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence isc_msgcat_get(isc_msgcat, ISC_MSGSET_SOCKADDR,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence "unknown address family: %d"),
45e1bd63587102c3bb361eaca42ee7b714fb3542Mark Andrewsisc_sockaddr_ismulticast(const isc_sockaddr_t *sockaddr) {
45e1bd63587102c3bb361eaca42ee7b714fb3542Mark Andrewsisc_sockaddr_isexperimental(const isc_sockaddr_t *sockaddr) {
45e1bd63587102c3bb361eaca42ee7b714fb3542Mark Andrewsisc_sockaddr_issitelocal(const isc_sockaddr_t *sockaddr) {
45e1bd63587102c3bb361eaca42ee7b714fb3542Mark Andrewsisc_sockaddr_islinklocal(const isc_sockaddr_t *sockaddr) {
6588a2b404365cea59e71a3f639349272600f68dMark Andrewsisc_sockaddr_isnetzero(const isc_sockaddr_t *sockaddr) {
4423c99613db1399dbb5c51e86ef0d351a1418c2Mark Andrewsisc_sockaddr_frompath(isc_sockaddr_t *sockaddr, const char *path) {
15683369e0113bd08863a705a8a1785c093455d3Mark Andrews if (strlen(path) >= sizeof(sockaddr->type.sunix.sun_path))