portlist.c revision 70e5a7403f0e0a3bd292b8287c5fed5772c15270
2728d0618e15ee3a2ecc5f6d15acd7898e6de85aTinderbox User * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * Copyright (C) 2003 Internet Software Consortium.
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Permission to use, copy, modify, and/or distribute this software for any
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * purpose with or without fee is hereby granted, provided that the above
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * copyright notice and this permission notice appear in all copies.
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
699f790c49d03a9ef3c3234a72d272bb469203e8Evan Hunt * PERFORMANCE OF THIS SOFTWARE.
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt/* $Id: portlist.c,v 1.13 2007/06/19 23:47:16 tbox Exp $ */
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt#define DNS_PORTLIST_MAGIC ISC_MAGIC('P','L','S','T')
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt#define DNS_VALID_PORTLIST(p) ISC_MAGIC_VALID(p, DNS_PORTLIST_MAGIC)
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunttypedef struct dns_element {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt unsigned int magic;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt unsigned int allocated;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt unsigned int active;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt const dns_element_t *e1 = (const dns_element_t *)arg1;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt const dns_element_t *e2 = (const dns_element_t *)arg2;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt return (-1);
dbb012765c735ee0d82dedb116cdc7cf18957814Evan Huntdns_portlist_create(isc_mem_t *mctx, dns_portlist_t **portlistp) {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt result = isc_refcount_init(&portlist->refcount, 1);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Huntfind_port(dns_element_t *list, unsigned int len, in_port_t port) {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt unsigned int min = 0;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Huntdns_portlist_add(dns_portlist_t *portlist, int af, in_port_t port) {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt el = find_port(portlist->list, portlist->active, port);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt unsigned int allocated;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt allocated = portlist->allocated + DNS_PL_ALLOCATE;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt el = isc_mem_get(portlist->mctx, sizeof(*el) * allocated);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt portlist->list[portlist->active].flags = DNS_PL_INET;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt portlist->list[portlist->active].flags = DNS_PL_INET6;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt qsort(portlist->list, portlist->active, sizeof(*el), compare);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Huntdns_portlist_remove(dns_portlist_t *portlist, int af, in_port_t port) {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt el = find_port(portlist->list, portlist->active, port);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Huntdns_portlist_match(dns_portlist_t *portlist, int af, in_port_t port) {
1b255a0c4eaccf0feff70328a8c108a22abfbf3cEvan Hunt el = find_port(portlist->list, portlist->active, port);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt if (af == AF_INET && (el->flags & DNS_PL_INET) != 0)
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt if (af == AF_INET6 && (el->flags & DNS_PL_INET6) != 0)
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Huntdns_portlist_attach(dns_portlist_t *portlist, dns_portlist_t **portlistp) {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt isc_refcount_increment(&portlist->refcount, NULL);
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt unsigned int count;