Merge branch 'features/str_without0byte' into develop

This commit is contained in:
Willem Toorop 2015-08-17 16:30:54 +02:00
commit 972ebf55d0
4 changed files with 79 additions and 25 deletions

View File

@ -85,12 +85,9 @@ getdns_dict_find_and_add(struct getdns_dict *dict, const char *key)
/*---------------------------------------- getdns_dict_get_names /*---------------------------------------- getdns_dict_get_names
*/ */
getdns_return_t getdns_return_t
getdns_dict_get_names(const struct getdns_dict * dict, getdns_dict_get_names(const getdns_dict *dict, getdns_list **answer)
struct getdns_list ** answer)
{ {
struct getdns_dict_item *item; struct getdns_dict_item *item;
size_t index;
struct getdns_bindata bindata;
if (!dict || !answer) if (!dict || !answer)
return GETDNS_RETURN_INVALID_PARAMETER; return GETDNS_RETURN_INVALID_PARAMETER;
@ -103,11 +100,7 @@ getdns_dict_get_names(const struct getdns_dict * dict,
RBTREE_FOR(item, struct getdns_dict_item *, RBTREE_FOR(item, struct getdns_dict_item *,
(getdns_rbtree_t *)&(dict->root)) { (getdns_rbtree_t *)&(dict->root)) {
if (getdns_list_add_item(*answer, &index) != GETDNS_RETURN_GOOD) getdns_list_append_string(*answer, item->node.key);
continue;
bindata.size = strlen(item->node.key) + 1;
bindata.data = (void *) item->node.key;
getdns_list_set_bindata(*answer, index, &bindata);
} }
return GETDNS_RETURN_GOOD; return GETDNS_RETURN_GOOD;
} /* getdns_dict_get_names */ } /* getdns_dict_get_names */
@ -465,6 +458,35 @@ getdns_dict_set_bindata(struct getdns_dict * dict, const char *name,
return GETDNS_RETURN_GOOD; return GETDNS_RETURN_GOOD;
} /* getdns_dict_set_bindata */ } /* getdns_dict_set_bindata */
/*---------------------------------------- getdns_dict_set_bindata */
getdns_return_t
getdns_dict_util_set_string(getdns_dict *dict, char *name, const char *value)
{
struct getdns_dict_item *item;
getdns_bindata *newbindata;
if (!dict || !name || !value)
return GETDNS_RETURN_INVALID_PARAMETER;
if (!(newbindata = GETDNS_MALLOC(dict->mf, getdns_bindata)))
return GETDNS_RETURN_MEMORY_ERROR;
newbindata->size = strlen(value);
if (!(newbindata->data = (void *)getdns_strdup(&dict->mf, value)))
goto error_free_bindata;
if ((item = getdns_dict_find_and_add(dict, name))) {
item->dtype = t_bindata;
item->data.bindata = newbindata;
return GETDNS_RETURN_GOOD;
}
GETDNS_FREE(dict->mf, newbindata->data);
error_free_bindata:
GETDNS_FREE(dict->mf, newbindata);
return GETDNS_RETURN_MEMORY_ERROR;
} /* getdns_dict_util_set_dict */
/*---------------------------------------- getdns_dict_set_int */ /*---------------------------------------- getdns_dict_set_int */
getdns_return_t getdns_return_t
getdns_dict_set_int(struct getdns_dict * dict, const char *name, getdns_dict_set_int(struct getdns_dict * dict, const char *name,

View File

@ -456,6 +456,43 @@ getdns_list_set_bindata(struct getdns_list * list, size_t index,
return GETDNS_RETURN_GOOD; return GETDNS_RETURN_GOOD;
} /* getdns_list_set_bindata */ } /* getdns_list_set_bindata */
/*----------------------------------------- getdns_list_set_string */
static getdns_return_t
getdns_list_set_string(getdns_list *list, size_t index, const char *value)
{
getdns_bindata *newbindata;
getdns_return_t retval;
if (!list || !value)
return GETDNS_RETURN_INVALID_PARAMETER;
if (index > list->numinuse)
return GETDNS_RETURN_NO_SUCH_LIST_ITEM;
if (!(newbindata = GETDNS_MALLOC(list->mf, getdns_bindata)))
return GETDNS_RETURN_MEMORY_ERROR;
newbindata->size = strlen(value);
if (!(newbindata->data = (void *)getdns_strdup(&list->mf, value))) {
GETDNS_FREE(list->mf, newbindata);
return GETDNS_RETURN_MEMORY_ERROR;
}
if (index == list->numinuse) {
retval = getdns_list_add_item(list, &index);
if (retval != GETDNS_RETURN_GOOD) {
GETDNS_FREE(list->mf, newbindata->data);
GETDNS_FREE(list->mf, newbindata);
return retval;
}
} else
getdns_list_destroy_item(list, index);
list->items[index].dtype = t_bindata;
list->items[index].data.bindata = newbindata;
return GETDNS_RETURN_GOOD;
} /* getdns_list_set_string */
/*---------------------------------------- getdns_list_set_int */ /*---------------------------------------- getdns_list_set_int */
getdns_return_t getdns_return_t
getdns_list_set_int(struct getdns_list * list, size_t index, getdns_list_set_int(struct getdns_list * list, size_t index,
@ -500,6 +537,12 @@ getdns_list_append_bindata(getdns_list *list, const getdns_bindata *child_bindat
return getdns_list_set_bindata(list, list->numinuse, child_bindata); return getdns_list_set_bindata(list, list->numinuse, child_bindata);
} }
getdns_return_t getdns_return_t
getdns_list_append_string(getdns_list *list, const char *value)
{
if (!list) return GETDNS_RETURN_INVALID_PARAMETER;
return getdns_list_set_string(list, list->numinuse, value);
}
getdns_return_t
getdns_list_append_int(getdns_list *list, uint32_t child_int) getdns_list_append_int(getdns_list *list, uint32_t child_int)
{ {
if (!list) return GETDNS_RETURN_INVALID_PARAMETER; if (!list) return GETDNS_RETURN_INVALID_PARAMETER;

View File

@ -73,19 +73,6 @@ static getdns_extension_format extformats[] = {
{"specify_class", t_int}, {"specify_class", t_int},
}; };
static struct getdns_bindata IPv4_str_bindata = { 5, (void *)"IPv4" };
static struct getdns_bindata IPv6_str_bindata = { 5, (void *)"IPv6" };
getdns_return_t
getdns_dict_util_set_string(struct getdns_dict * dict, char *name, const char *value)
{
/* account for the null term */
if (value == NULL) {
return GETDNS_RETURN_WRONG_TYPE_REQUESTED;
}
struct getdns_bindata type_bin = { strlen(value) + 1, (uint8_t *) value };
return getdns_dict_set_bindata(dict, name, &type_bin);
}
getdns_return_t getdns_return_t
getdns_dict_util_get_string(struct getdns_dict * dict, char *name, char **result) getdns_dict_util_get_string(struct getdns_dict * dict, char *name, char **result)
@ -606,9 +593,8 @@ priv_getdns_create_reply_dict(getdns_context *context, getdns_network_req *req,
bindata.data = rdf_iter->pos; bindata.data = rdf_iter->pos;
if (!set_dict(&rr_dict, getdns_dict_create_with_context(context)) || if (!set_dict(&rr_dict, getdns_dict_create_with_context(context)) ||
getdns_dict_set_bindata(rr_dict, "address_type", getdns_dict_util_set_string(rr_dict, "address_type",
rr_type == GETDNS_RRTYPE_A ? rr_type == GETDNS_RRTYPE_A ? "IPv4" : "IPv6" ) ||
&IPv4_str_bindata : &IPv6_str_bindata) ||
getdns_dict_set_bindata(rr_dict,"address_data",&bindata) || getdns_dict_set_bindata(rr_dict,"address_data",&bindata) ||

View File

@ -76,6 +76,9 @@ getdns_return_t getdns_list_append_list(getdns_list *list,
const getdns_list *child_list); const getdns_list *child_list);
getdns_return_t getdns_list_append_bindata(getdns_list *list, getdns_return_t getdns_list_append_bindata(getdns_list *list,
const getdns_bindata *child_bindata); const getdns_bindata *child_bindata);
getdns_return_t getdns_list_append_string(getdns_list *list,
const char *value);
getdns_return_t getdns_list_append_int(getdns_list *list, getdns_return_t getdns_list_append_int(getdns_list *list,
uint32_t child_uint32); uint32_t child_uint32);