From 3f92744a6807c181a0f9588514aeeca090b9dd4c Mon Sep 17 00:00:00 2001
From: Lubos Slovak <lubos.slovak@nic.cz>
Date: Sun, 2 Sep 2012 09:03:42 +0200
Subject: [PATCH] Enabled UPDATE processing.

refs #937 @30m
---
 src/knot/server/tcp-handler.c        | 10 ++++++----
 src/knot/server/udp-handler.c        | 11 ++++++-----
 src/knot/server/zones.c              |  2 +-
 src/knot/server/zones.h              |  8 ++++++++
 src/libknot/nameserver/name-server.c |  2 +-
 src/libknot/nameserver/name-server.h |  2 +-
 src/libknot/packet/packet.c          |  4 ++--
 src/libknot/packet/packet.h          |  4 ++--
 src/libknot/updates/ddns.c           |  6 +++---
 src/libknot/updates/ddns.h           |  8 ++++----
 10 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/src/knot/server/tcp-handler.c b/src/knot/server/tcp-handler.c
index 60f4301121..d299bb4c37 100644
--- a/src/knot/server/tcp-handler.c
+++ b/src/knot/server/tcp-handler.c
@@ -252,10 +252,12 @@ static int tcp_handle(tcp_worker_t *w, int fd, uint8_t *qbuf, size_t qbuf_maxlen
 		return xfr_answer(ns, &xfr);
 		
 	case KNOT_QUERY_UPDATE:
-		knot_ns_error_response_from_query(ns, packet,
-		                                  KNOT_RCODE_NOTIMPL,
-		                                  qbuf, &resp_len);
-		res = KNOTD_EOK;
+//		knot_ns_error_response_from_query(ns, packet,
+//		                                  KNOT_RCODE_NOTIMPL,
+//		                                  qbuf, &resp_len);
+		res = zones_process_update(ns, packet, &addr, qbuf, &resp_len,
+		                           NS_TRANSPORT_UDP);
+//		res = KNOTD_EOK;
 		break;
 		
 	case KNOT_QUERY_NOTIFY:
diff --git a/src/knot/server/udp-handler.c b/src/knot/server/udp-handler.c
index fc4e9b1d7e..d6b995c4cb 100644
--- a/src/knot/server/udp-handler.c
+++ b/src/knot/server/udp-handler.c
@@ -164,11 +164,12 @@ int udp_handle(int fd, uint8_t *qbuf, size_t qbuflen, size_t *resp_len,
 		break;
 		
 	case KNOT_QUERY_UPDATE:
-		dbg_net("udp: UPDATE query on fd=%d not implemented\n", fd);
-		knot_ns_error_response_from_query(ns, packet,
-		                                  KNOT_RCODE_NOTIMPL, qbuf,
-		                                  resp_len);
-		res = KNOTD_EOK;
+//		dbg_net("udp: UPDATE query on fd=%d not implemented\n", fd);
+//		knot_ns_error_response_from_query(ns, packet,
+//		                                  KNOT_RCODE_NOTIMPL, qbuf,
+//		                                  resp_len);
+		res = zones_process_update(ns, packet, addr, qbuf, resp_len,
+		                           NS_TRANSPORT_UDP);
 		break;
 		
 	/* Unhandled opcodes. */
diff --git a/src/knot/server/zones.c b/src/knot/server/zones.c
index 2c6fec2ff5..02e64f9d5b 100644
--- a/src/knot/server/zones.c
+++ b/src/knot/server/zones.c
@@ -2795,7 +2795,7 @@ int zones_process_update(knot_nameserver_t *nameserver,
 	knot_packet_free(&resp);
 	rcu_read_unlock();
 
-	return KNOT_EOK;
+	return KNOTD_EOK;
 }
 
 /*----------------------------------------------------------------------------*/
diff --git a/src/knot/server/zones.h b/src/knot/server/zones.h
index e46d2f6196..41ce0232ea 100644
--- a/src/knot/server/zones.h
+++ b/src/knot/server/zones.h
@@ -154,6 +154,14 @@ int zones_normal_query_answer(knot_nameserver_t *nameserver,
                               uint8_t *response_wire, size_t *rsize,
                               knot_ns_transport_t transport);
 
+/*!
+ * \todo Document me.
+ */
+int zones_process_update(knot_nameserver_t *nameserver,
+                         knot_packet_t *query, const sockaddr_t *addr,
+                         uint8_t *resp_wire, size_t *rsize,
+                         knot_ns_transport_t transport);
+
 /*!
  * \brief Processes normal response packet.
  *
diff --git a/src/libknot/nameserver/name-server.c b/src/libknot/nameserver/name-server.c
index e56d1f3751..3abd018589 100644
--- a/src/libknot/nameserver/name-server.c
+++ b/src/libknot/nameserver/name-server.c
@@ -4213,7 +4213,7 @@ int knot_ns_process_ixfrin(knot_nameserver_t *nameserver,
  * This function should process the contents, prepare prerequisities, prepare
  * changeset and return to the caller.
  */
-int knot_ns_process_update(knot_packet_t *query, 
+int knot_ns_process_update(const knot_packet_t *query, 
                            const knot_zone_contents_t *zone, 
                            knot_changeset_t *changeset, knot_rcode_t *rcode)
 {
diff --git a/src/libknot/nameserver/name-server.h b/src/libknot/nameserver/name-server.h
index 939975a5dc..7bddc0badf 100644
--- a/src/libknot/nameserver/name-server.h
+++ b/src/libknot/nameserver/name-server.h
@@ -344,7 +344,7 @@ int knot_ns_switch_zone(knot_nameserver_t *nameserver,
 int knot_ns_process_ixfrin(knot_nameserver_t *nameserver, 
                              knot_ns_xfr_t *xfr);
 
-int knot_ns_process_update(knot_packet_t *query, 
+int knot_ns_process_update(const knot_packet_t *query, 
                            const knot_zone_contents_t *zone, 
                            knot_changeset_t *changeset, knot_rcode_t *rcode);
 
diff --git a/src/libknot/packet/packet.c b/src/libknot/packet/packet.c
index 6c7fd020d5..4eee3fc1fe 100644
--- a/src/libknot/packet/packet.c
+++ b/src/libknot/packet/packet.c
@@ -1254,7 +1254,7 @@ const knot_rrset_t *knot_packet_answer_rrset(
 /*----------------------------------------------------------------------------*/
 
 const knot_rrset_t *knot_packet_authority_rrset(
-	knot_packet_t *packet, short pos)
+	const knot_packet_t *packet, short pos)
 {
 	if (packet == NULL || pos > packet->ns_rrsets) {
 		return NULL;
@@ -1266,7 +1266,7 @@ const knot_rrset_t *knot_packet_authority_rrset(
 /*----------------------------------------------------------------------------*/
 
 const knot_rrset_t *knot_packet_additional_rrset(
-    knot_packet_t *packet, short pos)
+    const knot_packet_t *packet, short pos)
 {
 	if (packet == NULL || pos > packet->ar_rrsets) {
 		return NULL;
diff --git a/src/libknot/packet/packet.h b/src/libknot/packet/packet.h
index d76209af5d..e494e2317d 100644
--- a/src/libknot/packet/packet.h
+++ b/src/libknot/packet/packet.h
@@ -445,7 +445,7 @@ const knot_rrset_t *knot_packet_answer_rrset(
  *         or NULL if there is no such RRSet.
  */
 const knot_rrset_t *knot_packet_authority_rrset(
-	knot_packet_t *packet, short pos);
+	const knot_packet_t *packet, short pos);
 
 /*!
  * \brief Returns the requested Additional RRset.
@@ -459,7 +459,7 @@ const knot_rrset_t *knot_packet_authority_rrset(
  *         or NULL if there is no such RRSet.
  */
 const knot_rrset_t *knot_packet_additional_rrset(
-    knot_packet_t *packet, short pos);
+	const knot_packet_t *packet, short pos);
 
 /*!
  * \brief Checks if the packet already contains the given RRSet.
diff --git a/src/libknot/updates/ddns.c b/src/libknot/updates/ddns.c
index 2566045531..73b213d45f 100644
--- a/src/libknot/updates/ddns.c
+++ b/src/libknot/updates/ddns.c
@@ -411,7 +411,7 @@ static int knot_ddns_check_not_in_use(const knot_zone_contents_t *zone,
 /*----------------------------------------------------------------------------*/
 
 int knot_ddns_check_zone(const knot_zone_contents_t *zone, 
-                         knot_packet_t *query, knot_rcode_t *rcode)
+                         const knot_packet_t *query, knot_rcode_t *rcode)
 {
 	if (zone == NULL || query == NULL || rcode == NULL) {
 		return KNOT_EBADARG;
@@ -434,7 +434,7 @@ int knot_ddns_check_zone(const knot_zone_contents_t *zone,
 
 /*----------------------------------------------------------------------------*/
 
-int knot_ddns_process_prereqs(knot_packet_t *query,
+int knot_ddns_process_prereqs(const knot_packet_t *query,
                               knot_ddns_prereq_t **prereqs, knot_rcode_t *rcode)
 {
 	/*! \todo Consider not parsing the whole packet at once, but
@@ -561,7 +561,7 @@ static int knot_ddns_check_update(const knot_rrset_t *rrset,
 
 /*----------------------------------------------------------------------------*/
 
-int knot_ddns_process_update(knot_packet_t *query,
+int knot_ddns_process_update(const knot_packet_t *query,
                              knot_changeset_t *changeset, knot_rcode_t *rcode)
 {
 	// just put all RRSets from query's Authority section
diff --git a/src/libknot/updates/ddns.h b/src/libknot/updates/ddns.h
index 030525548f..6b4400f253 100644
--- a/src/libknot/updates/ddns.h
+++ b/src/libknot/updates/ddns.h
@@ -56,16 +56,16 @@ typedef struct knot_ddns_prereq_t {
 	size_t not_in_use_allocd;
 } knot_ddns_prereq_t;
 
-int knot_ddns_check_zone(const knot_zone_contents_t *zone, knot_packet_t *query,
-                         knot_rcode_t *rcode);
+int knot_ddns_check_zone(const knot_zone_contents_t *zone, 
+                         const knot_packet_t *query, knot_rcode_t *rcode);
 
-int knot_ddns_process_prereqs(knot_packet_t *query,
+int knot_ddns_process_prereqs(const knot_packet_t *query,
                               knot_ddns_prereq_t **prereqs, knot_rcode_t *rcode);
 
 int knot_ddns_check_prereqs(const knot_zone_contents_t *zone,
                             knot_ddns_prereq_t **prereqs, knot_rcode_t *rcode);
 
-int knot_ddns_process_update(knot_packet_t *query,
+int knot_ddns_process_update(const knot_packet_t *query,
                              knot_changeset_t *changeset, knot_rcode_t *rcode);
 
 void knot_ddns_prereqs_free(knot_ddns_prereq_t **prereq);
-- 
GitLab