Module: sip-router Branch: master Commit: 13e59ebb3906b2f2e4414767482e11ed3978f2f3 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=13e59ebb...
Author: Miklos Tirpak miklos@iptel.org Committer: Miklos Tirpak miklos@iptel.org Date: Mon Nov 9 16:35:29 2009 +0100
dns_cahce: add_record function exported
dns_cache_add_record() function has been separated from the RPC interface so that it can be used also from other places.
---
dns_cache.c | 160 ++++++++++++++++++++++++++++++++++++++--------------------- dns_cache.h | 17 ++++++ 2 files changed, 120 insertions(+), 57 deletions(-)
diff --git a/dns_cache.c b/dns_cache.c index 1e657ea..7605ee6 100644 --- a/dns_cache.c +++ b/dns_cache.c @@ -4066,16 +4066,19 @@ static struct dns_hash_entry *dns_cache_clone_entry(struct dns_hash_entry *e, * * Currently only A, AAAA, and SRV records are supported. */ -static void dns_cache_add_record(rpc_t* rpc, void* ctx, unsigned short type) +int dns_cache_add_record(unsigned short type, + str *name, + int ttl, + str *value, + int priority, + int weight, + int port, + int flags) { struct dns_hash_entry *old=NULL, *new=NULL; struct dns_rr *rr; - str name; - int ttl; - str ip, rr_name; - int flags; + str rr_name; struct ip_addr *ip_addr; - int priority, weight, port; ticks_t expire; int err, h; int size; @@ -4083,63 +4086,52 @@ static void dns_cache_add_record(rpc_t* rpc, void* ctx, unsigned short type) /* eliminate gcc warnings */ ip_addr = 0; size = 0; + rr_name.s = NULL; + rr_name.len = 0;
if (!cfg_get(core, core_cfg, use_dns_cache)){ - rpc->fault(ctx, 500, "dns cache support disabled (see use_dns_cache)"); - return; + LOG(L_ERR, "ERROR: dns cache support disabled (see use_dns_cache)\n"); + return -1; } - switch(type) { - case T_A: - case T_AAAA: - if (rpc->scan(ctx, "SdSd", &name, &ttl, &ip, &flags) < 4) - return; - break; - case T_SRV: - if (rpc->scan(ctx, "SddddSd", &name, &ttl, &priority, &weight, &port, - &rr_name, &flags) < 7) - return; - break; - case T_CNAME: - case T_NAPTR: - case T_TXT: - case T_EBL: - case T_PTR: - rpc->fault(ctx, 400, "not implemented"); - return; - default: - rpc->fault(ctx, 400, "unknown type"); - return; + if ((type != T_A) && (type != T_AAAA) && (type != T_SRV)) { + LOG(L_ERR, "ERROR: rr type %d is not implemented\n", + type); + return -1; }
if (!flags) { /* fix-up the values */ switch(type) { case T_A: - ip_addr = str2ip(&ip); + ip_addr = str2ip(value); if (!ip_addr) { - rpc->fault(ctx, 400, "Malformed ip address"); - goto error; + LOG(L_ERR, "ERROR: Malformed ip address: %.*s\n", + value->len, value->s); + return -1; } break; case T_AAAA: #ifdef USE_IPV6 - ip_addr = str2ip6(&ip); + ip_addr = str2ip6(value); if (!ip_addr) { - rpc->fault(ctx, 400, "Malformed ip address"); - goto error; + LOG(L_ERR, "ERROR: Malformed ip address: %.*s\n", + value->len, value->s); + return -1; } break; #else /* USE_IPV6 */ - rpc->fault(ctx, 400, "IPv6 support disabled "); - return; + LOG(L_ERR, "ERROR: IPv6 support is disabled\n"); + return -1; #endif /* USE_IPV6 */ - /* case T_SRV: nothing to do */ + case T_SRV: + rr_name = *value; + break; } }
/* check whether there is a matching entry in the cache */ - old = dns_hash_get(&name, type, &h, &err); + old = dns_hash_get(name, type, &h, &err); if (old && old->type!=type) { /* probably we found a CNAME instead of the specified type, it is not needed */ @@ -4150,9 +4142,10 @@ static void dns_cache_add_record(rpc_t* rpc, void* ctx, unsigned short type) /* prepare the entry */ if (flags) { /* negative entry */ - new = dns_cache_mk_bad_entry(&name, type, ttl, flags); + new = dns_cache_mk_bad_entry(name, type, ttl, flags); if (!new) { - rpc->fault(ctx, 400, "Failed to add the entry to the cache"); + LOG(L_ERR, "ERROR: Failed to create a negative " + "DNS cache entry\n"); goto error; } } else { @@ -4163,10 +4156,9 @@ static void dns_cache_add_record(rpc_t* rpc, void* ctx, unsigned short type) switch(type) { case T_A: case T_AAAA: - new = dns_cache_mk_ip_entry(&name, ip_addr); + new = dns_cache_mk_ip_entry(name, ip_addr); if (!new) { - rpc->fault(ctx, 400, "Failed to add the entry to" - " the cache"); + LOG(L_ERR, "ERROR: Failed to create an A/AAAA record\n"); goto error; } /* fix the expiration time, dns_cache_mk_ip_entry() sets it @@ -4176,11 +4168,10 @@ static void dns_cache_add_record(rpc_t* rpc, void* ctx, unsigned short type) new->rr_lst->expire = expire; break; case T_SRV: - new = dns_cache_mk_srv_entry(&name, priority, weight, port, + new = dns_cache_mk_srv_entry(name, priority, weight, port, &rr_name, ttl); if (!new) { - rpc->fault(ctx, 400, "Failed to add the entry to" - " the cache"); + LOG(L_ERR, "ERROR: Failed to create an SRV record\n"); goto error; } } @@ -4206,8 +4197,8 @@ static void dns_cache_add_record(rpc_t* rpc, void* ctx, unsigned short type) /* the rr was found in the list */ new = dns_cache_clone_entry(old, 0, 0, 0); if (!new) { - rpc->fault(ctx, 400, "Failed to add the entry to " - "the cache"); + LOG(L_ERR, "ERROR: Failed to clone an existing " + "DNS cache entry\n"); goto error; } /* let the rr point to the new structure */ @@ -4243,8 +4234,8 @@ static void dns_cache_add_record(rpc_t* rpc, void* ctx, unsigned short type) } new = dns_cache_clone_entry(old, size, ttl, &rr); if (!new) { - rpc->fault(ctx, 400, "Failed to add the entry to" - " the cache"); + LOG(L_ERR, "ERROR: Failed to clone an existing " + "DNS cache entry\n"); goto error; }
@@ -4269,7 +4260,7 @@ static void dns_cache_add_record(rpc_t* rpc, void* ctx, unsigned short type)
LOCK_DNS_HASH(); if (dns_cache_add_unsafe(new)) { - rpc->fault(ctx, 400, "Failed to add the entry to the cache"); + LOG(L_ERR, "ERROR: Failed to add the entry to the cache\n"); UNLOCK_DNS_HASH(); goto error; } else { @@ -4281,7 +4272,7 @@ static void dns_cache_add_record(rpc_t* rpc, void* ctx, unsigned short type)
if (old) dns_hash_put(old); - return; + return 0;
error: /* leave the old entry in the list, and free the new one */ @@ -4289,6 +4280,7 @@ error: dns_hash_put(old); if (new) dns_destroy_entry(new); + return -1; }
@@ -4356,22 +4348,76 @@ void dns_cache_rpc_lookup(rpc_t* rpc, void* ctx) /* wrapper functions for adding and deleting records */ void dns_cache_add_a(rpc_t* rpc, void* ctx) { - dns_cache_add_record(rpc, ctx, T_A); + str name; + int ttl; + str ip; + int flags; + + if (rpc->scan(ctx, "SdSd", &name, &ttl, &ip, &flags) < 4) + return; + + if (dns_cache_add_record(T_A, + &name, + ttl, + &ip, + 0 /* priority */, + 0 /* weight */, + 0 /* port */, + flags) + ) + rpc->fault(ctx, 400, "Failed to add the entry to the cache"); }
void dns_cache_add_aaaa(rpc_t* rpc, void* ctx) { - dns_cache_add_record(rpc, ctx, T_AAAA); -} + str name; + int ttl; + str ip; + int flags; + + if (rpc->scan(ctx, "SdSd", &name, &ttl, &ip, &flags) < 4) + return;
+ if (dns_cache_add_record(T_AAAA, + &name, + ttl, + &ip, + 0 /* priority */, + 0 /* weight */, + 0 /* port */, + flags) + ) + rpc->fault(ctx, 400, "Failed to add the entry to the cache"); +}
void dns_cache_add_srv(rpc_t* rpc, void* ctx) { - dns_cache_add_record(rpc, ctx, T_SRV); + str name; + int ttl, priority, weight, port; + str rr_name; + int flags; + + if (rpc->scan(ctx, "SddddSd", &name, &ttl, &priority, &weight, &port, + &rr_name, &flags) < 7 + ) + return; + + if (dns_cache_add_record(T_SRV, + &name, + ttl, + &rr_name, + priority, + weight, + port, + flags) + ) + rpc->fault(ctx, 400, "Failed to add the entry to the cache"); }
+ + void dns_cache_delete_a(rpc_t* rpc, void* ctx) { dns_cache_delete_record(rpc, ctx, T_A); diff --git a/dns_cache.h b/dns_cache.h index 72ad971..a8a4bd4 100644 --- a/dns_cache.h +++ b/dns_cache.h @@ -350,4 +350,21 @@ void dns_set_server_state(int state); int dns_get_server_state(void); #endif /* DNS_WATCHDOG_SUPPORT */
+/* Adds a new record to the cache. + * If there is an existing record with the same name and value + * (ip address in case of A/AAAA record, name in case of SRV record) + * only the remaining fields are updated. + * + * Currently only A, AAAA, and SRV records are supported. + */ +int dns_cache_add_record(unsigned short type, + str *name, + int ttl, + str *value, + int priority, + int weight, + int port, + int flags); + + #endif