From b52b13b1ebdad4911abb1849ecbbff7aedc900ec Mon Sep 17 00:00:00 2001
From: Lubos Slovak <lubos.slovak@nic.cz>
Date: Mon, 1 Aug 2011 15:03:24 +0200
Subject: [PATCH] Cleaned up copy functions.

- Renamed to either deep_copy or shallow_copy.
- Removed zonedb_copy() (not used).
---
 src/dnslib/dname-table.c                        |  4 ++--
 src/dnslib/dname-table.h                        |  4 ++--
 src/dnslib/dname.c                              |  2 +-
 src/dnslib/dname.h                              |  4 ++--
 src/dnslib/node.c                               | 15 +++------------
 src/dnslib/node.h                               |  2 +-
 src/dnslib/rdata.c                              |  5 +++--
 src/dnslib/rdata.h                              |  3 ++-
 src/dnslib/rrset.c                              | 10 +++++++---
 src/dnslib/rrset.h                              |  2 +-
 .../realdata/dnslib/response_tests_realdata.c   |  2 --
 src/dnslib/zone-contents.c                      |  8 ++++----
 src/dnslib/zone-tree.c                          |  3 ++-
 src/dnslib/zone-tree.h                          |  3 ++-
 src/dnslib/zone.c                               |  2 +-
 src/dnslib/zonedb.c                             | 17 -----------------
 src/dnslib/zonedb.h                             | 10 ----------
 src/knot/server/name-server.c                   |  8 ++++----
 src/knot/server/xfr-in.c                        |  4 ++--
 src/zcompile/zparser.y                          |  8 ++++----
 20 files changed, 43 insertions(+), 73 deletions(-)

diff --git a/src/dnslib/dname-table.c b/src/dnslib/dname-table.c
index 0ff42e50d..72258d2f0 100644
--- a/src/dnslib/dname-table.c
+++ b/src/dnslib/dname-table.c
@@ -216,8 +216,8 @@ int dnslib_dname_table_add_dname2(dnslib_dname_table_t *table,
 	return DNSLIB_EOK;
 }
 
-int dnslib_dname_table_copy(dnslib_dname_table_t *from,
-                            dnslib_dname_table_t *to)
+int dnslib_dname_table_shallow_copy(dnslib_dname_table_t *from,
+                                    dnslib_dname_table_t *to)
 {
 	to->id_counter = from->id_counter;
 
diff --git a/src/dnslib/dname-table.h b/src/dnslib/dname-table.h
index dc6d81219..ea2893371 100644
--- a/src/dnslib/dname-table.h
+++ b/src/dnslib/dname-table.h
@@ -108,8 +108,8 @@ int dnslib_dname_table_add_dname2(dnslib_dname_table_t *table,
  * \param from Original domain name table.
  * \param to Copy of the domain name table.
  */
-int dnslib_dname_table_copy(dnslib_dname_table_t *from,
-                            dnslib_dname_table_t *to);
+int dnslib_dname_table_shallow_copy(dnslib_dname_table_t *from,
+                                    dnslib_dname_table_t *to);
 
 /*!
  * \brief Frees dname table without its nodes. Sets pointer to NULL.
diff --git a/src/dnslib/dname.c b/src/dnslib/dname.c
index a01757bf3..dbf405b45 100644
--- a/src/dnslib/dname.c
+++ b/src/dnslib/dname.c
@@ -564,7 +564,7 @@ int dnslib_dname_from_wire(const uint8_t *name, uint size,
 
 /*----------------------------------------------------------------------------*/
 
-dnslib_dname_t *dnslib_dname_copy(const dnslib_dname_t *dname)
+dnslib_dname_t *dnslib_dname_deep_copy(const dnslib_dname_t *dname)
 {
 	return dnslib_dname_new_from_wire(dname->name, dname->size,
 	                                  dname->node);
diff --git a/src/dnslib/dname.h b/src/dnslib/dname.h
index c96b943f9..df2d6feec 100644
--- a/src/dnslib/dname.h
+++ b/src/dnslib/dname.h
@@ -27,7 +27,6 @@ struct dnslib_node;
  * \todo Consider restricting to FQDN only (see dnslib_dname_new_from_str()).
  */
 struct dnslib_dname {
-	ref_t ref;     /*!< Reference counting. */
 	uint8_t *name;	/*!< Wire format of the domain name. */
 	/*!
 	 * \brief Size of the domain name in octets.
@@ -38,6 +37,7 @@ struct dnslib_dname {
 	unsigned short label_count;
 	struct dnslib_node *node; /*!< Zone node the domain name belongs to. */
 	unsigned int id; /*!< ID of domain name used in zone dumping. */
+	ref_t ref;     /*!< Reference counting. */
 };
 
 typedef struct dnslib_dname dnslib_dname_t;
@@ -143,7 +143,7 @@ int dnslib_dname_from_wire(const uint8_t *name, unsigned int size,
  *
  * \return New domain name which is an exact copy of \a dname.
  */
-dnslib_dname_t *dnslib_dname_copy(const dnslib_dname_t *dname);
+dnslib_dname_t *dnslib_dname_deep_copy(const dnslib_dname_t *dname);
 
 /*!
  * \brief Converts the given domain name to string representation.
diff --git a/src/dnslib/node.c b/src/dnslib/node.c
index 462aba962..54e9d6db9 100644
--- a/src/dnslib/node.c
+++ b/src/dnslib/node.c
@@ -773,7 +773,7 @@ int dnslib_node_compare(dnslib_node_t *node1, dnslib_node_t *node2)
 
 /*----------------------------------------------------------------------------*/
 
-int dnslib_node_deep_copy(const dnslib_node_t *from, dnslib_node_t **to)
+int dnslib_node_shallow_copy(const dnslib_node_t *from, dnslib_node_t **to)
 {
 	// create new node
 	*to = dnslib_node_new(from->owner, from->parent, from->flags);
@@ -781,17 +781,10 @@ int dnslib_node_deep_copy(const dnslib_node_t *from, dnslib_node_t **to)
 		return DNSLIB_ENOMEM;
 	}
 
-	// copy references
-	
+	// copy references	
 	// do not use the API function to set parent, so that children count 
 	// is not changed
-	(*to)->parent = from->parent;
-	(*to)->nsec3_node = from->nsec3_node;
-	(*to)->nsec3_referer = from->nsec3_referer;
-	(*to)->wildcard_child = from->wildcard_child;
-	(*to)->prev = from->prev;
-	(*to)->next = from->next;
-	(*to)->children = from->children;
+	memcpy(*to, from, sizeof(dnslib_node_t));
 
 	// copy RRSets
 	// copy the skip list with the old references
@@ -802,7 +795,5 @@ int dnslib_node_deep_copy(const dnslib_node_t *from, dnslib_node_t **to)
 		return DNSLIB_ENOMEM;
 	}
 
-	(*to)->rrset_count = from->rrset_count;
-
 	return DNSLIB_EOK;
 }
diff --git a/src/dnslib/node.h b/src/dnslib/node.h
index d9a36c441..95a8f741a 100644
--- a/src/dnslib/node.h
+++ b/src/dnslib/node.h
@@ -411,7 +411,7 @@ void dnslib_node_free(dnslib_node_t **node, int free_owner, int fix_refs);
  */
 int dnslib_node_compare(dnslib_node_t *node1, dnslib_node_t *node2);
 
-int dnslib_node_deep_copy(const dnslib_node_t *from, dnslib_node_t **to);
+int dnslib_node_shallow_copy(const dnslib_node_t *from, dnslib_node_t **to);
 
 #endif /* _KNOT_DNSLIB_NODE_H_ */
 
diff --git a/src/dnslib/rdata.c b/src/dnslib/rdata.c
index 8208b1a30..04d6dc1c7 100644
--- a/src/dnslib/rdata.c
+++ b/src/dnslib/rdata.c
@@ -600,7 +600,8 @@ void dnslib_rdata_deep_free(dnslib_rdata_t **rdata, uint type,
 
 /*----------------------------------------------------------------------------*/
 
-dnslib_rdata_t *dnslib_rdata_copy(const dnslib_rdata_t *rdata, uint16_t type)
+dnslib_rdata_t *dnslib_rdata_deep_copy(const dnslib_rdata_t *rdata, 
+                                       uint16_t type)
 {
 	dnslib_rdata_t *copy = dnslib_rdata_new();
 	CHECK_ALLOC_LOG(copy, NULL);
@@ -625,7 +626,7 @@ dnslib_rdata_t *dnslib_rdata_copy(const dnslib_rdata_t *rdata, uint16_t type)
 		    || d->wireformat[i] == DNSLIB_RDATA_WF_UNCOMPRESSED_DNAME
 		    || d->wireformat[i] == DNSLIB_RDATA_WF_LITERAL_DNAME) {
 			copy->items[i].dname =
-				dnslib_dname_copy(rdata->items[i].dname);
+				dnslib_dname_deep_copy(rdata->items[i].dname);
 		} else {
 			copy->items[i].raw_data = (uint16_t *)malloc(
 					rdata->items[i].raw_data[0] + 2);
diff --git a/src/dnslib/rdata.h b/src/dnslib/rdata.h
index 0b3051302..a679dbc7a 100644
--- a/src/dnslib/rdata.h
+++ b/src/dnslib/rdata.h
@@ -213,7 +213,8 @@ int dnslib_rdata_item_set_raw_data(dnslib_rdata_t *rdata, unsigned int pos,
  *
  * \return Copy of \a rdata.
  */
-dnslib_rdata_t *dnslib_rdata_copy(const dnslib_rdata_t *rdata, uint16_t type);
+dnslib_rdata_t *dnslib_rdata_deep_copy(const dnslib_rdata_t *rdata, 
+                                       uint16_t type);
 
 /*!
  * \brief Destroys the RDATA structure without deleting RDATA items.
diff --git a/src/dnslib/rrset.c b/src/dnslib/rrset.c
index 89c405359..aa6025daa 100644
--- a/src/dnslib/rrset.c
+++ b/src/dnslib/rrset.c
@@ -308,10 +308,14 @@ int dnslib_rrset_compare(const dnslib_rrset_t *r1,
 
 /*----------------------------------------------------------------------------*/
 
-int dnslib_rrset_copy(const dnslib_rrset_t *from, dnslib_rrset_t **to)
+int dnslib_rrset_shallow_copy(const dnslib_rrset_t *from, dnslib_rrset_t **to)
 {
-	/*! \todo Implement (shallow copy). */
-	return DNSLIB_ERROR;
+	*to = (dnslib_rrset_t *)malloc(sizeof(dnslib_rrset_t));
+	CHECK_ALLOC_LOG(*to, DNSLIB_ENOMEM);
+	
+	memcpy(*to, from, sizeof(dnslib_rrset_t));
+	
+	return DNSLIB_EOK;
 }
 
 /*----------------------------------------------------------------------------*/
diff --git a/src/dnslib/rrset.h b/src/dnslib/rrset.h
index df9bc2aec..ec456d82e 100644
--- a/src/dnslib/rrset.h
+++ b/src/dnslib/rrset.h
@@ -211,7 +211,7 @@ int dnslib_rrset_compare(const dnslib_rrset_t *r1,
                          const dnslib_rrset_t *r2,
                          dnslib_rrset_compare_type_t cmp);
 
-int dnslib_rrset_copy(const dnslib_rrset_t *from, dnslib_rrset_t **to);
+int dnslib_rrset_shallow_copy(const dnslib_rrset_t *from, dnslib_rrset_t **to);
 
 /*!
  * \brief Destroys the RRSet structure.
diff --git a/src/dnslib/tests/realdata/dnslib/response_tests_realdata.c b/src/dnslib/tests/realdata/dnslib/response_tests_realdata.c
index 5ba6c4636..dfc982db1 100644
--- a/src/dnslib/tests/realdata/dnslib/response_tests_realdata.c
+++ b/src/dnslib/tests/realdata/dnslib/response_tests_realdata.c
@@ -919,8 +919,6 @@ int dnslib_response_tests_count(int argc, char *argv[])
 
 int dnslib_response_tests_run(int argc, char *argv[])
 {
-	int ret;
-
 	test_data_t *data = data_for_dnslib_tests;
 
 	ok(test_response_add_rrset_answer(data->rrset_list),
diff --git a/src/dnslib/zone-contents.c b/src/dnslib/zone-contents.c
index 2278d1c67..d72700173 100644
--- a/src/dnslib/zone-contents.c
+++ b/src/dnslib/zone-contents.c
@@ -1738,7 +1738,7 @@ DEBUG_DNSLIB_ZONE(
 	// chop leftmost labels until some node is found
 	// copy the name for chopping
 	/* Local allocation, will be discarded. */
-	dnslib_dname_t *name_copy = dnslib_dname_copy(name);
+	dnslib_dname_t *name_copy = dnslib_dname_deep_copy(name);
 DEBUG_DNSLIB_ZONE(
 	char *n = dnslib_dname_to_str(name_copy);
 	debug_dnslib_zone("Finding closest encloser..\nStarting with: %s\n", n);
@@ -2156,7 +2156,7 @@ int dnslib_zone_contents_shallow_copy(const dnslib_zone_contents_t *from,
 			ret = DNSLIB_ENOMEM;
 			goto cleanup;
 		}
-		if ((ret = dnslib_dname_table_copy(from->dname_table,
+		if ((ret = dnslib_dname_table_shallow_copy(from->dname_table,
 		                        contents->dname_table)) != DNSLIB_EOK) {
 			goto cleanup;
 		}
@@ -2171,9 +2171,9 @@ int dnslib_zone_contents_shallow_copy(const dnslib_zone_contents_t *from,
 	memcpy(&contents->nsec3_params, &from->nsec3_params,
 	       sizeof(dnslib_nsec3_params_t));
 
-	if ((ret = dnslib_zone_tree_copy(from->nodes,
+	if ((ret = dnslib_zone_tree_shallow_copy(from->nodes,
 	                                 contents->nodes)) != DNSLIB_EOK
-	    || (ret = dnslib_zone_tree_copy(from->nsec3_nodes,
+	    || (ret = dnslib_zone_tree_shallow_copy(from->nsec3_nodes,
 	                                contents->nsec3_nodes)) != DNSLIB_EOK) {
 		goto cleanup;
 	}
diff --git a/src/dnslib/zone-tree.c b/src/dnslib/zone-tree.c
index 28d80b6f4..271863463 100644
--- a/src/dnslib/zone-tree.c
+++ b/src/dnslib/zone-tree.c
@@ -398,7 +398,8 @@ int dnslib_zone_tree_reverse_apply_postorder(dnslib_zone_tree_t *tree,
 
 /*----------------------------------------------------------------------------*/
 
-int dnslib_zone_tree_copy(dnslib_zone_tree_t *from, dnslib_zone_tree_t *to)
+int dnslib_zone_tree_shallow_copy(dnslib_zone_tree_t *from, 
+                                  dnslib_zone_tree_t *to)
 {
 	/*
 	 * This function will copy the tree by hand, so that the nodes
diff --git a/src/dnslib/zone-tree.h b/src/dnslib/zone-tree.h
index aaa8c9306..1dade6acc 100644
--- a/src/dnslib/zone-tree.h
+++ b/src/dnslib/zone-tree.h
@@ -256,7 +256,8 @@ int dnslib_zone_tree_reverse_apply_postorder(dnslib_zone_tree_t *tree,
  * \retval DNSLIB_EOK
  * \retval DNSLIB_ENOMEM
  */
-int dnslib_zone_tree_copy(dnslib_zone_tree_t *from, dnslib_zone_tree_t *to);
+int dnslib_zone_tree_shallow_copy(dnslib_zone_tree_t *from, 
+                                  dnslib_zone_tree_t *to);
 
 /*!
  * \brief Destroys the zone tree, not touching the saved data.
diff --git a/src/dnslib/zone.c b/src/dnslib/zone.c
index e8dcca1bb..c6ab358d2 100644
--- a/src/dnslib/zone.c
+++ b/src/dnslib/zone.c
@@ -40,7 +40,7 @@ dnslib_zone_t *dnslib_zone_new(dnslib_node_t *apex, uint node_count,
 
 	// save the zone name
 	debug_dnslib_zone("Copying zone name.\n");
-	zone->name = dnslib_dname_copy(dnslib_node_owner(apex));
+	zone->name = dnslib_dname_deep_copy(dnslib_node_owner(apex));
 	if (zone->name == NULL) {
 		ERR_ALLOC_FAILED;
 		free(zone);
diff --git a/src/dnslib/zonedb.c b/src/dnslib/zonedb.c
index c20a1e166..501ca07f1 100644
--- a/src/dnslib/zonedb.c
+++ b/src/dnslib/zonedb.c
@@ -210,23 +210,6 @@ DEBUG_DNSLIB_ZONEDB(
 
 /*----------------------------------------------------------------------------*/
 
-dnslib_zonedb_t *dnslib_zonedb_copy(const dnslib_zonedb_t *db)
-{
-	dnslib_zonedb_t *db_new =
-		(dnslib_zonedb_t *)malloc(sizeof(dnslib_zonedb_t));
-	CHECK_ALLOC_LOG(db_new, NULL);
-
-	db_new->zones = skip_copy_list(db->zones);
-	if (db_new->zones == NULL) {
-		free(db_new);
-		return NULL;
-	}
-
-	return db_new;
-}
-
-/*----------------------------------------------------------------------------*/
-
 void dnslib_zonedb_free(dnslib_zonedb_t **db)
 {
 	skip_destroy_list(&(*db)->zones, NULL, NULL);
diff --git a/src/dnslib/zonedb.h b/src/dnslib/zonedb.h
index fe374e55e..45e811f45 100644
--- a/src/dnslib/zonedb.h
+++ b/src/dnslib/zonedb.h
@@ -97,16 +97,6 @@ dnslib_zone_t *dnslib_zonedb_find_zone(const dnslib_zonedb_t *db,
 const dnslib_zone_t *dnslib_zonedb_find_zone_for_name(dnslib_zonedb_t *db,
                                                    const dnslib_dname_t *dname);
 
-/*!
- * \brief Copies the zone database structure (but not the zones within).
- *
- * \param db Zone database to copy.
- *
- * \return A new zone database structure containing the same zones as \a db or
- *         NULL if an error occured.
- */
-dnslib_zonedb_t *dnslib_zonedb_copy(const dnslib_zonedb_t *db);
-
 /*!
  * \brief Destroys and deallocates the zone database structure (but not the
  *        zones within).
diff --git a/src/knot/server/name-server.c b/src/knot/server/name-server.c
index 5dbe8abd1..2e4ab3a8b 100644
--- a/src/knot/server/name-server.c
+++ b/src/knot/server/name-server.c
@@ -112,7 +112,7 @@ static dnslib_rrset_t *ns_synth_from_wildcard(
 {
 	debug_ns("Synthetizing RRSet from wildcard...\n");
 
-	dnslib_dname_t *owner = dnslib_dname_copy(qname);
+	dnslib_dname_t *owner = dnslib_dname_deep_copy(qname);
 //	printf("Copied owner ptr: %p\n", owner);
 
 	dnslib_rrset_t *synth_rrset = dnslib_rrset_new(
@@ -136,7 +136,7 @@ static dnslib_rrset_t *ns_synth_from_wildcard(
 		// we could use the RDATA from the wildcard rrset
 		// but there is no way to distinguish it when deleting
 		// temporary RRSets
-		dnslib_rdata_t *rdata_copy = dnslib_rdata_copy(rdata,
+		dnslib_rdata_t *rdata_copy = dnslib_rdata_deep_copy(rdata,
 		                                dnslib_rrset_type(synth_rrset));
 		if (rdata_copy == NULL) {
 			dnslib_rrset_deep_free(&synth_rrset, 1, 1, 0);
@@ -634,7 +634,7 @@ static dnslib_dname_t *ns_next_closer(const dnslib_dname_t *closest_encloser,
 	       == ce_labels);
 
 	// chop some labels from the qname
-	dnslib_dname_t *next_closer = dnslib_dname_copy(name);
+	dnslib_dname_t *next_closer = dnslib_dname_deep_copy(name);
 	if (next_closer == NULL) {
 		return NULL;
 	}
@@ -1419,7 +1419,7 @@ static dnslib_rrset_t *ns_cname_from_dname(const dnslib_rrset_t *dname_rrset,
 
 	// create new CNAME RRSet
 
-	dnslib_dname_t *owner = dnslib_dname_copy(qname);
+	dnslib_dname_t *owner = dnslib_dname_deep_copy(qname);
 	if (owner == NULL) {
 		return NULL;
 	}
diff --git a/src/knot/server/xfr-in.c b/src/knot/server/xfr-in.c
index c16c7b2c8..9e94940ee 100644
--- a/src/knot/server/xfr-in.c
+++ b/src/knot/server/xfr-in.c
@@ -1588,7 +1588,7 @@ static int xfrin_get_node_copy(dnslib_node_t **node, xfrin_changes_t *changes)
 		dnslib_node_get_new_node(*node);
 	if (new_node == NULL) {
 		debug_xfr("Creating copy of node.\n");
-		int ret = dnslib_node_deep_copy(*node, &new_node);
+		int ret = dnslib_node_shallow_copy(*node, &new_node);
 		if (ret != DNSLIB_EOK) {
 			debug_xfr("Failed to create node copy.\n");
 			return KNOT_ENOMEM;
@@ -1636,7 +1636,7 @@ static int xfrin_copy_old_rrset(dnslib_rrset_t *old,
                                 dnslib_rrset_t **copy, xfrin_changes_t *changes)
 {
 	// create new RRSet by copying the old one
-	int ret = dnslib_rrset_copy(old, copy);
+	int ret = dnslib_rrset_shallow_copy(old, copy);
 	if (ret != DNSLIB_EOK) {
 		debug_xfr("Failed to create RRSet copy.\n");
 		return KNOT_ENOMEM;
diff --git a/src/zcompile/zparser.y b/src/zcompile/zparser.y
index a1e539aaa..c4d5c5330 100644
--- a/src/zcompile/zparser.y
+++ b/src/zcompile/zparser.y
@@ -275,14 +275,14 @@ owner:	dname sp
 //	printf("Totally new dname: %p %s\n", $1,
 //	dnslib_dname_to_str($1));
 	dnslib_dname_free(&parser->prev_dname);
-	    parser->prev_dname = dnslib_dname_copy($1);
+	    parser->prev_dname = dnslib_dname_deep_copy($1);
 	    $$ = $1;
     }
     |	PREV
     {
 //	    printf("Name from prev_dname!: %p %s\n", parser->prev_dname,
 //	    dnslib_dname_to_str(parser->prev_dname));
-	    $$ = dnslib_dname_copy(parser->prev_dname);
+	    $$ = dnslib_dname_deep_copy(parser->prev_dname);
     }
     ;
 
@@ -337,7 +337,7 @@ abs_dname:	'.'
     {
 	    /*! \todo Get root domain from db. */
 		//$$ = parser->db->domains->root;
-	    $$ = dnslib_dname_copy(parser->root_domain);
+	    $$ = dnslib_dname_deep_copy(parser->root_domain);
     }
     |	'@'
     {
@@ -1458,7 +1458,7 @@ zparser_init(const char *filename, uint32_t ttl, uint16_t rclass,
 	parser->default_class = rclass;
 
 	parser->origin = origin;
-	parser->prev_dname = dnslib_dname_copy(parser->origin->owner);
+	parser->prev_dname = dnslib_dname_deep_copy(parser->origin->owner);
 
 	parser->default_apex = origin;
 	parser->error_occurred = 0;
-- 
GitLab