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