From 1ea5b4b3042a3d7f0ad3285256600f03edf0c3e4 Mon Sep 17 00:00:00 2001
From: Marek Vavrusa <marek.vavrusa@nic.cz>
Date: Fri, 15 Feb 2013 15:56:50 +0100
Subject: [PATCH] Cleaned zone loading code.

---
 src/knot/server/zones.c      | 99 ++++++++++--------------------------
 src/knot/zone/zone-load.c    |  7 +++
 src/libknot/zone/zone-tree.c | 20 ++++----
 3 files changed, 45 insertions(+), 81 deletions(-)

diff --git a/src/knot/server/zones.c b/src/knot/server/zones.c
index b11f4f62e..7df9723c0 100644
--- a/src/knot/server/zones.c
+++ b/src/knot/server/zones.c
@@ -860,7 +860,6 @@ static int zones_set_acl(acl_t **acl, list* acl_list)
  * \param dst Loaded zone will be returned in this parameter.
  * \param zone_name Zone name (owner of the apex node).
  * \param source Path to zone file source.
- * \param filename Path to requested compiled zone file.
  *
  * \retval KNOT_EOK
  * \retval KNOT_EINVAL
@@ -872,16 +871,29 @@ static int zones_load_zone(knot_zone_t **dst, const char *zone_name,
 	if (dst == NULL || zone_name == NULL || source == NULL) {
 		return KNOT_EINVAL;
 	}
-	*dst = NULL;
 	
+	
+	int ret = KNOT_EOK;
 	zloader_t *zl = NULL;
-	int ret = knot_zload_open(&zl, source, zone_name, 0);
-	if (ret != KNOT_EOK) {
-		return ret;
+	*dst = NULL;
+
+	/* Open zone file for parsing. */
+	switch(knot_zload_open(&zl, source, zone_name, 0)) {
+	case KNOT_EOK: /* OK */ break;
+	case KNOT_EACCES:
+		log_server_error("Failed to open zone file '%s' "
+				 "(Permission denied).\n", source);
+		return KNOT_EZONEINVAL;
+	case KNOT_ENOENT:
+		log_server_error("Couldn't find zone file '%s'\n", source);
+		return KNOT_EZONEINVAL;
+	default:
+		log_server_error("Failed to load zone file '%s'\n", source);
+		return KNOT_EZONEINVAL;
 	}
 	
-	assert(zl);
-	
+	/* Check the source file */
+	assert(zl != NULL);
 	*dst = knot_zload_load(zl);
 	if (*dst == NULL) {
 		log_zone_error("Zone %s could not be loaded.\n", zone_name);
@@ -889,62 +901,6 @@ static int zones_load_zone(knot_zone_t **dst, const char *zone_name,
 		return KNOT_ERROR;
 	}
 	
-	//TODO, change to zone parsing
-//	switch(knot_zload_open(&zl, filename)) {
-//	case KNOT_EOK:
-//		/* OK */
-//		break;
-//	case KNOT_EACCES:
-//		log_server_error("Failed to open compiled zone '%s' "
-//				 "(Permission denied).\n", filename);
-//		free(zname);
-//		return KNOT_EZONEINVAL;
-//	case KNOT_ENOENT:
-//		log_server_error("Couldn't find compiled zone. "
-//				 "Please recompile '%s'.\n", zname);
-//		free(zname);
-//		return KNOT_EZONEINVAL;
-//	case KNOT_ECRC:
-//		log_server_error("Compiled zone db CRC mismatch, "
-//				 "db is corrupted or .crc file is "
-//				 "deleted. Please recompile '%s'.\n",
-//				 zname);
-//		free(zname);
-//		return KNOT_EZONEINVAL;
-//	case KNOT_EMALF:
-//		log_server_error("Compiled db '%s' is too old. "
-//				 "Please recompile '%s'.\n",
-//				 filename, zname);
-//		free(zname);
-//		return KNOT_EZONEINVAL;
-//	case KNOT_EFEWDATA:
-//	case KNOT_ERROR:
-//	case KNOT_ENOMEM:
-//	default:
-//		log_server_error("Failed to load compiled zone file "
-//				 "'%s'.\n", filename);
-//		free(zname);
-//		return KNOT_EZONEINVAL;
-//	}
-	
-//	/* Check the source file */
-//	assert(zl != NULL);
-//	int src_changed = strcmp(source, zl->source) != 0;
-//	if (src_changed || knot_zload_needs_update(zl)) {
-//		log_server_warning("Database for zone '%s' is not "
-//				   "up-to-date. Please recompile.\n",
-//				   zname);
-//	}
-	
-//	*dst = knot_zload_load(zl);
-//	if (*dst == NULL) {
-//		log_server_error("Failed to load db '%s' for zone '%s'.\n",
-//				 filename, zname);
-//		knot_zload_close(zl);
-//		free(zname);
-//		return KNOT_EZONEINVAL;
-//	}
-	
 	/* Check if loaded origin matches. */
 	const knot_dname_t *dname = knot_zone_name(*dst);
 	knot_dname_t *dname_req = NULL;
@@ -957,14 +913,15 @@ static int zones_load_zone(knot_zone_t **dst, const char *zone_name,
 		ret = KNOT_EZONEINVAL;
 	} else {
 		/* Save the timestamp from the zone db file. */
-//		if (stat(source, &st) < 0) { // TODO REVIEW MV
-//			dbg_zones("zones: failed to stat() zone db, "
-//				  "something is seriously wrong\n");
-//			knot_zone_deep_free(dst, 0);
-//			ret = KNOT_EZONEINVAL;
-//		} else {
-//			knot_zone_set_version(*dst, st.st_mtime);
-//		}
+		struct stat st;
+		if (stat(source, &st) < 0) {
+			dbg_zones("zones: failed to stat() zone db, "
+				  "something is seriously wrong\n");
+			knot_zone_deep_free(dst, 0);
+			ret = KNOT_EZONEINVAL;
+		} else {
+			knot_zone_set_version(*dst, st.st_mtime);
+		}
 	}
 	knot_dname_free(&dname_req);
 	knot_zload_close(zl);
diff --git a/src/knot/zone/zone-load.c b/src/knot/zone/zone-load.c
index be4b062c6..338ed7752 100644
--- a/src/knot/zone/zone-load.c
+++ b/src/knot/zone/zone-load.c
@@ -635,6 +635,13 @@ int knot_zload_open(zloader_t **dst, const char *source, const char *origin,
 	}
 	
 	*dst = NULL;
+	
+	/* Check zone file. */
+	struct stat st;
+	if (stat(source, &st) < 0) {
+		return knot_map_errno(errno);
+	}
+	
 	/* Create context. */
 	parser_context_t *context = xmalloc(sizeof(parser_context_t));
 	context->origin_from_config = knot_dname_new_from_str(origin,
diff --git a/src/libknot/zone/zone-tree.c b/src/libknot/zone/zone-tree.c
index 54dc5a6c5..098f16bf4 100644
--- a/src/libknot/zone/zone-tree.c
+++ b/src/libknot/zone/zone-tree.c
@@ -55,7 +55,7 @@ static int dname_lf(char *dst, const knot_dname_t *src, size_t maxlen) {
 	if (src->size > maxlen) return KNOT_ESPACE;
 	*dst++ = src->size - 1;
 	*dst = '\0';
-	char* pdst = dst;
+//	char* pdst = dst;
 	uint8_t* l = src->name;
 	uint8_t lstack[127];
 	uint8_t *sp = lstack;
@@ -70,15 +70,15 @@ static int dname_lf(char *dst, const knot_dname_t *src, size_t maxlen) {
 		*dst++ = '\0';         /* label separator */
 	}
 	
-	/*! DEBUG ---> */
-	printf("dname_lf: '%s' => '", knot_dname_to_str(src));
-	for(unsigned i = 0; i < src->size - 1; ++i) {
-		char *c = pdst + i;
-		if (*c == '\0') printf("0");
-		else printf("%c", *c);
-	}
-	printf("'\n");
-	/*! <--- DEBUG */
+//	/*! DEBUG ---> */
+//	printf("dname_lf: '%s' => '", knot_dname_to_str(src));
+//	for(unsigned i = 0; i < src->size - 1; ++i) {
+//		char *c = pdst + i;
+//		if (*c == '\0') printf("0");
+//		else printf("%c", *c);
+//	}
+//	printf("'\n");
+//	/*! <--- DEBUG */
 	return KNOT_EOK;
 }
 
-- 
GitLab