[sr-dev] git:master: dns_cahce: add_record function exported

Miklos Tirpak miklos at iptel.org
Fri Feb 5 16:53:08 CET 2010


Module: sip-router
Branch: master
Commit: 13e59ebb3906b2f2e4414767482e11ed3978f2f3
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=13e59ebb3906b2f2e4414767482e11ed3978f2f3

Author: Miklos Tirpak <miklos at iptel.org>
Committer: Miklos Tirpak <miklos at 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




More information about the sr-dev mailing list