keytable.c revision 15a44745412679c30a6d022733925af70a38b715
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt * Copyright (C) 2000 Internet Software Consortium.
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * Permission to use, copy, modify, and distribute this software for any
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt * purpose with or without fee is hereby granted, provided that the above
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews * copyright notice and this permission notice appear in all copies.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt/* $Id: keytable.c,v 1.20 2000/07/27 09:46:09 tale Exp $ */
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt#include <isc/string.h> /* Required for HP/UX (and others?) */
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt /* Unlocked. */
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt unsigned int magic;
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt /* Locked by lock. */
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt /* Locked by rwlock. */
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt#define VALID_KEYTABLE(kt) ISC_MAGIC_VALID(kt, KEYTABLE_MAGIC)
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt unsigned int magic;
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt#define VALID_KEYNODE(kn) ISC_MAGIC_VALID(kn, KEYNODE_MAGIC)
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt isc_mem_put(mctx, keynode, sizeof(dns_keynode_t));
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Huntdns_keytable_create(isc_mem_t *mctx, dns_keytable_t **keytablep) {
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt * Create a keytable.
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt result = dns_rbt_create(mctx, free_keynode, mctx, &keytable->table);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt "isc_mutex_init() failed: %s",
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt result = isc_rwlock_init(&keytable->rwlock, 0, 0);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt "isc_rwlock_init() failed: %s",
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Huntdns_keytable_attach(dns_keytable_t *source, dns_keytable_t **targetp) {
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt * Attach *targetp to source.
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt * Detach *keytablep from its keytable.
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt REQUIRE(keytablep != NULL && VALID_KEYTABLE(*keytablep));
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt if (keytable->references == 0 && keytable->active_nodes == 0)
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt RWUNLOCK(&keytable->rwlock, isc_rwlocktype_write);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt isc_mem_put(keytable->mctx, keytable, sizeof *keytable);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Huntdns_keytable_add(dns_keytable_t *keytable, dst_key_t **keyp) {
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt * Add '*keyp' to 'keytable'.
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt knode = isc_mem_get(keytable->mctx, sizeof *knode);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt result = dns_rbt_addnode(keytable->table, keyname, &node);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt if (result == ISC_R_SUCCESS || result == ISC_R_EXISTS) {
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt RWUNLOCK(&keytable->rwlock, isc_rwlocktype_write);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt isc_mem_put(keytable->mctx, knode, sizeof *knode);
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Huntdns_keytable_findkeynode(dns_keytable_t *keytable, dns_name_t *name,
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt * Search for a key named 'name', matching 'algorithm' and 'tag' in
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt * 'keytable'.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt result = dns_rbt_findname(keytable->table, name, 0, NULL, &data);
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt for (knode = data; knode != NULL; knode = knode->next) {
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt if (algorithm == (dns_secalg_t)dst_key_alg(knode->key)
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Huntdns_keytable_findnextkeynode(dns_keytable_t *keytable, dns_keynode_t *keynode,
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt * Search for the next key with the same properties as 'keynode' in
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt * 'keytable'.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt for (knode = keynode->next; knode != NULL; knode = knode->next) {
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt if (dst_key_alg(keynode->key) == dst_key_alg(knode->key) &&
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt dst_key_id(keynode->key) == dst_key_id(knode->key))
ef421f66f47224a42073deaf087378c5d0c9952eEvan Huntdns_keytable_finddeepestmatch(dns_keytable_t *keytable, dns_name_t *name,
a747113422afaa29ce72d2c5ba7f0b7ea9ec2054Evan Hunt * Search for the deepest match in 'keytable'.
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt result = dns_rbt_findname(keytable->table, name, 0, foundname, &data);
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH)
ef421f66f47224a42073deaf087378c5d0c9952eEvan Huntdns_keytable_detachkeynode(dns_keytable_t *keytable, dns_keynode_t **keynodep)
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt * Give back a keynode found via dns_keytable_findkeynode().
ef421f66f47224a42073deaf087378c5d0c9952eEvan Hunt REQUIRE(keynodep != NULL && VALID_KEYNODE(*keynodep));
void *data;
return (result);