From 238f1bf138d8f1c25bae468f2f5bdd275516fac3 Mon Sep 17 00:00:00 2001
From: Marek Vavrusa <marek.vavrusa@nic.cz>
Date: Tue, 7 Feb 2012 13:03:50 +0100
Subject: [PATCH] Implemented both text and hexstring based NSID identifier.

refs #1547
---
 samples/knot.full.conf               | 2 ++
 src/knot/conf/cf-parse.y             | 3 ++-
 src/knot/conf/conf.h                 | 1 +
 src/knot/server/zones.c              | 2 +-
 src/libknot/nameserver/name-server.c | 4 ++--
 src/libknot/nameserver/name-server.h | 3 ++-
 6 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/samples/knot.full.conf b/samples/knot.full.conf
index 7ef63e2a40..55084bdc3c 100644
--- a/samples/knot.full.conf
+++ b/samples/knot.full.conf
@@ -21,6 +21,8 @@ system {
   version "0.1";
 
   # Server identifier 
+  # Use string format "text"
+  # Or hexstring 0x01ab00
   nsid "myserver0";
 
   # Working directory of the server
diff --git a/src/knot/conf/cf-parse.y b/src/knot/conf/cf-parse.y
index 6f227ef119..d7eb5635af 100644
--- a/src/knot/conf/cf-parse.y
+++ b/src/knot/conf/cf-parse.y
@@ -286,7 +286,8 @@ system:
    SYSTEM '{'
  | system VERSION TEXT ';' { new_config->version = $3.t; }
  | system IDENTITY TEXT ';' { new_config->identity = $3.t; }
- | system NSID TEXT ';' { new_config->nsid = $3.t; }
+ | system NSID HEXSTR ';' { new_config->nsid = $3.t; new_config->nsid_len = $3.l; }
+ | system NSID TEXT ';' { new_config->nsid = $3.t; new_config->nsid_len = strlen(new_config->nsid); }
  | system STORAGE TEXT ';' { new_config->storage = $3.t; }
  | system KEY TSIG_ALGO_NAME TEXT ';' {
      fprintf(stderr, "warning: Config option 'system.key' is deprecated "
diff --git a/src/knot/conf/conf.h b/src/knot/conf/conf.h
index 0f89dee5ce..80c07de174 100644
--- a/src/knot/conf/conf.h
+++ b/src/knot/conf/conf.h
@@ -156,6 +156,7 @@ typedef struct conf_t {
 	char *storage;  /*!< Persistent storage path for databases and such. */
 	char *pidfile;  /*!< PID file path. */
 	char *nsid;     /*!< Server's NSID. */
+	size_t nsid_len;/*!< Server's NSID length. */
 	int   workers;  /*!< Number of workers per interface. */
 	int   uid;      /*!< Specified user id. */
 	int   gid;      /*!< Specified group id. */
diff --git a/src/knot/server/zones.c b/src/knot/server/zones.c
index de56f0ad0b..45abd1ba7d 100644
--- a/src/knot/server/zones.c
+++ b/src/knot/server/zones.c
@@ -2356,7 +2356,7 @@ int zones_ns_conf_hook(const struct conf_t *conf, void *data)
 	dbg_zones_verb("zones: reconfiguring name server.\n");
 	
 	/* Set NSID. */
-	knot_ns_set_nsid(ns, conf->nsid);
+	knot_ns_set_nsid(ns, conf->nsid, conf->nsid_len);
 
 	knot_zonedb_t *old_db = 0;
 
diff --git a/src/libknot/nameserver/name-server.c b/src/libknot/nameserver/name-server.c
index 69838cd0ac..f473793828 100644
--- a/src/libknot/nameserver/name-server.c
+++ b/src/libknot/nameserver/name-server.c
@@ -2631,7 +2631,7 @@ knot_nameserver_t *knot_ns_create()
 
 /*----------------------------------------------------------------------------*/
 
-void knot_ns_set_nsid(knot_nameserver_t *nameserver, const char *nsid)
+void knot_ns_set_nsid(knot_nameserver_t *nameserver, const char *nsid, size_t len)
 {
 	if (nameserver == NULL) {
 		dbg_ns("NS: set_nsid: nameserver=NULL.\n");
@@ -2644,7 +2644,7 @@ void knot_ns_set_nsid(knot_nameserver_t *nameserver, const char *nsid)
 	}
 	
 	int ret = knot_edns_add_option(nameserver->opt_rr, EDNS_OPTION_NSID,
-	                               strlen(nsid), (const uint8_t *)nsid);
+	                               len, (const uint8_t *)nsid);
 	if (ret != KNOT_EOK) {
 		dbg_ns("NS: set_nsid: could not add EDNS option.\n");
 		return;
diff --git a/src/libknot/nameserver/name-server.h b/src/libknot/nameserver/name-server.h
index ca6a0d759c..5c05a5c49a 100644
--- a/src/libknot/nameserver/name-server.h
+++ b/src/libknot/nameserver/name-server.h
@@ -177,7 +177,8 @@ typedef enum knot_ns_xfr_type_t {
  */
 knot_nameserver_t *knot_ns_create();
 
-void knot_ns_set_nsid(knot_nameserver_t *nameserver, const char *nsid);
+/*! \todo Document me. */
+void knot_ns_set_nsid(knot_nameserver_t *nameserver, const char *nsid, size_t len);
 
 /*!
  * \brief Parses the given query into the response structure and recognizes
-- 
GitLab