mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-30 14:07:59 +00:00
provide functions to access map names and lists
This commit is contained in:
parent
2d67fbd786
commit
bd4b8fe050
@ -15,7 +15,7 @@
|
|||||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: cfg.h,v 1.2 2001/02/15 05:14:16 gson Exp $ */
|
/* $Id: cfg.h,v 1.3 2001/02/15 18:53:03 gson Exp $ */
|
||||||
|
|
||||||
#ifndef DNS_CFG_H
|
#ifndef DNS_CFG_H
|
||||||
#define DNS_CFG_H 1
|
#define DNS_CFG_H 1
|
||||||
@ -63,6 +63,11 @@ typedef struct cfg_type cfg_type_t;
|
|||||||
*/
|
*/
|
||||||
typedef struct cfg_obj cfg_obj_t;
|
typedef struct cfg_obj cfg_obj_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A configuration object list element.
|
||||||
|
*/
|
||||||
|
typedef struct cfg_listelt cfg_listelt_t;
|
||||||
|
|
||||||
/***
|
/***
|
||||||
*** Functions
|
*** Functions
|
||||||
***/
|
***/
|
||||||
@ -119,6 +124,18 @@ cfg_map_get(cfg_obj_t *mapobj, const char* name, cfg_obj_t **obj);
|
|||||||
* ISC_R_NOTFOUND - name not found in map
|
* ISC_R_NOTFOUND - name not found in map
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
cfg_obj_t *
|
||||||
|
cfg_map_getname(cfg_obj_t *mapobj);
|
||||||
|
/*
|
||||||
|
* Get the name of a named map object, like a server "key" clause.
|
||||||
|
*
|
||||||
|
* Requires:
|
||||||
|
* 'mapobj' ponts to a valid configuraration object of a map type.
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* A pointer to a configuration object naming the map object,
|
||||||
|
* or NULL if the map object does not have a name.
|
||||||
|
*/
|
||||||
|
|
||||||
isc_uint32_t
|
isc_uint32_t
|
||||||
cfg_obj_asuint32(cfg_obj_t *obj);
|
cfg_obj_asuint32(cfg_obj_t *obj);
|
||||||
@ -145,6 +162,46 @@ cfg_obj_asstring(cfg_obj_t *obj);
|
|||||||
* A pointer to a null terminated string.
|
* A pointer to a null terminated string.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
cfg_listelt_t *
|
||||||
|
cfg_list_first(cfg_obj_t *obj);
|
||||||
|
/*
|
||||||
|
* Returns the first list element in a configuration object of a list type.
|
||||||
|
*
|
||||||
|
* Requires:
|
||||||
|
* 'obj' points to a valid configuration object of a list type.
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* A pointer to a cfg_listelt_t representing the first list element,
|
||||||
|
* or NULL if the list is empty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
cfg_listelt_t *
|
||||||
|
cfg_list_next(cfg_listelt_t *elt);
|
||||||
|
/*
|
||||||
|
* Returns the next element of a list of configuration objects.
|
||||||
|
*
|
||||||
|
* Requires:
|
||||||
|
* 'elt' points to cfg_listelt_t obtained from cfg_list_first() or
|
||||||
|
* a previous call to cfg_list_next().
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* A pointer to a cfg_listelt_t representing the next element,
|
||||||
|
* or NULL if there are no more elements.
|
||||||
|
*/
|
||||||
|
|
||||||
|
cfg_obj_t *
|
||||||
|
cfg_listelt_value(cfg_listelt_t *elt);
|
||||||
|
/*
|
||||||
|
* Returns the configuration object associated with cfg_listelt_t.
|
||||||
|
*
|
||||||
|
* Requires:
|
||||||
|
* 'elt' points to cfg_listelt_t obtained from cfg_list_first() or
|
||||||
|
* cfg_list_next().
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* A non-NULL pointer to a configuration object.
|
||||||
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
cfg_print(cfg_obj_t *obj,
|
cfg_print(cfg_obj_t *obj,
|
||||||
void (*f)(void *closure, const char *text, int textlen),
|
void (*f)(void *closure, const char *text, int textlen),
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: parser.c,v 1.2 2001/02/15 05:14:15 gson Exp $ */
|
/* $Id: parser.c,v 1.3 2001/02/15 18:53:02 gson Exp $ */
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
@ -83,7 +83,6 @@
|
|||||||
|
|
||||||
typedef struct cfg_clausedef cfg_clausedef_t;
|
typedef struct cfg_clausedef cfg_clausedef_t;
|
||||||
typedef struct cfg_printer cfg_printer_t;
|
typedef struct cfg_printer cfg_printer_t;
|
||||||
typedef struct cfg_listelt cfg_listelt_t;
|
|
||||||
typedef ISC_LIST(cfg_listelt_t) cfg_list_t;
|
typedef ISC_LIST(cfg_listelt_t) cfg_list_t;
|
||||||
typedef struct cfg_map cfg_map_t;
|
typedef struct cfg_map cfg_map_t;
|
||||||
typedef struct cfg_rep cfg_rep_t;
|
typedef struct cfg_rep cfg_rep_t;
|
||||||
@ -1316,6 +1315,12 @@ cfg_map_get(cfg_obj_t *mapobj, const char* name, cfg_obj_t **obj) {
|
|||||||
return (ISC_R_SUCCESS);
|
return (ISC_R_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cfg_obj_t *
|
||||||
|
cfg_map_getname(cfg_obj_t *mapobj) {
|
||||||
|
REQUIRE(mapobj != NULL && mapobj->type->rep == &cfg_rep_map);
|
||||||
|
return (mapobj->value.map.id);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* void
|
* void
|
||||||
*/
|
*/
|
||||||
@ -1600,10 +1605,43 @@ static cfg_type_t cfg_type_optional_keyref = {
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parse a homogeneous list whose elements are of type 'elttype'
|
* Lists.
|
||||||
* and where each element is terminated by a semicolon.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static isc_result_t
|
||||||
|
create_list(cfg_parser_t *pctx, cfg_type_t *type, cfg_obj_t **obj) {
|
||||||
|
isc_result_t result;
|
||||||
|
CHECK(create_cfgobj(pctx, type, obj));
|
||||||
|
ISC_LIST_INIT((*obj)->value.list);
|
||||||
|
cleanup:
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static isc_result_t
|
||||||
|
create_listelt(cfg_parser_t *pctx, cfg_listelt_t **eltp) {
|
||||||
|
cfg_listelt_t *elt;
|
||||||
|
elt = isc_mem_get(pctx->mctx, sizeof(*elt));
|
||||||
|
if (elt == NULL)
|
||||||
|
return (ISC_R_NOMEMORY);
|
||||||
|
elt->obj = NULL;
|
||||||
|
ISC_LINK_INIT(elt, link);
|
||||||
|
*eltp = elt;
|
||||||
|
return (ISC_R_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_list(cfg_parser_t *pctx, cfg_obj_t *obj) {
|
||||||
|
cfg_listelt_t *elt, *next;
|
||||||
|
for (elt = ISC_LIST_HEAD(obj->value.list);
|
||||||
|
elt != NULL;
|
||||||
|
elt = next)
|
||||||
|
{
|
||||||
|
next = ISC_LIST_NEXT(elt, link);
|
||||||
|
cfg_obj_destroy(pctx, &elt->obj);
|
||||||
|
isc_mem_put(pctx->mctx, elt, sizeof(*elt));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
parse_list_elt(cfg_parser_t *pctx, cfg_type_t *elttype, cfg_listelt_t **ret)
|
parse_list_elt(cfg_parser_t *pctx, cfg_type_t *elttype, cfg_listelt_t **ret)
|
||||||
{
|
{
|
||||||
@ -1627,7 +1665,10 @@ parse_list_elt(cfg_parser_t *pctx, cfg_type_t *elttype, cfg_listelt_t **ret)
|
|||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parse a homogeneous list whose elements are of type 'elttype'
|
||||||
|
* and where each element is terminated by a semicolon.
|
||||||
|
*/
|
||||||
static isc_result_t
|
static isc_result_t
|
||||||
parse_list(cfg_parser_t *pctx, cfg_type_t *listtype, cfg_obj_t **ret)
|
parse_list(cfg_parser_t *pctx, cfg_type_t *listtype, cfg_obj_t **ret)
|
||||||
{
|
{
|
||||||
@ -1734,6 +1775,28 @@ print_spacelist(cfg_printer_t *pctx, cfg_obj_t *obj) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cfg_listelt_t *
|
||||||
|
cfg_list_first(cfg_obj_t *obj) {
|
||||||
|
REQUIRE(obj != NULL && obj->type->rep == &cfg_rep_list);
|
||||||
|
return (ISC_LIST_HEAD(obj->value.list));
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg_listelt_t *
|
||||||
|
cfg_list_next(cfg_listelt_t *elt) {
|
||||||
|
REQUIRE(elt != NULL);
|
||||||
|
return (ISC_LIST_NEXT(elt, link));
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg_obj_t *
|
||||||
|
cfg_listelt_value(cfg_listelt_t *elt) {
|
||||||
|
REQUIRE(elt != NULL);
|
||||||
|
return (elt->obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maps.
|
||||||
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_mapbody(cfg_printer_t *pctx, cfg_obj_t *obj) {
|
print_mapbody(cfg_printer_t *pctx, cfg_obj_t *obj) {
|
||||||
isc_result_t result = ISC_R_SUCCESS;
|
isc_result_t result = ISC_R_SUCCESS;
|
||||||
@ -3026,41 +3089,6 @@ free_map(cfg_parser_t *pctx, cfg_obj_t *obj) {
|
|||||||
isc_symtab_destroy(&obj->value.map.symtab);
|
isc_symtab_destroy(&obj->value.map.symtab);
|
||||||
}
|
}
|
||||||
|
|
||||||
static isc_result_t
|
|
||||||
create_list(cfg_parser_t *pctx, cfg_type_t *type, cfg_obj_t **obj) {
|
|
||||||
isc_result_t result;
|
|
||||||
CHECK(create_cfgobj(pctx, type, obj));
|
|
||||||
ISC_LIST_INIT((*obj)->value.list);
|
|
||||||
cleanup:
|
|
||||||
return (result);
|
|
||||||
}
|
|
||||||
|
|
||||||
static isc_result_t
|
|
||||||
create_listelt(cfg_parser_t *pctx, cfg_listelt_t **eltp) {
|
|
||||||
cfg_listelt_t *elt;
|
|
||||||
elt = isc_mem_get(pctx->mctx, sizeof(*elt));
|
|
||||||
if (elt == NULL)
|
|
||||||
return (ISC_R_NOMEMORY);
|
|
||||||
elt->obj = NULL;
|
|
||||||
ISC_LINK_INIT(elt, link);
|
|
||||||
*eltp = elt;
|
|
||||||
return (ISC_R_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
free_list(cfg_parser_t *pctx, cfg_obj_t *obj) {
|
|
||||||
cfg_listelt_t *elt, *next;
|
|
||||||
for (elt = ISC_LIST_HEAD(obj->value.list);
|
|
||||||
elt != NULL;
|
|
||||||
elt = next)
|
|
||||||
{
|
|
||||||
next = ISC_LIST_NEXT(elt, link);
|
|
||||||
cfg_obj_destroy(pctx, &elt->obj);
|
|
||||||
isc_mem_put(pctx->mctx, elt, sizeof(*elt));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Destroy 'obj', a configuration object created in 'pctx'.
|
* Destroy 'obj', a configuration object created in 'pctx'.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user