strcasecmp(TOKEN_STRING(pctx), "local") == 0)
{
cfg_obj_t *obj = NULL;
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_ustring, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
+ pctx->line, &cfg_type_ustring, &obj);
obj->value.string.length = strlen("local");
obj->value.string.base =
isc_mem_get(pctx->mctx, obj->value.string.length + 1);
if (pctx->token.type == isc_tokentype_string &&
strcasecmp(TOKEN_STRING(pctx), "none") == 0)
{
- return cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_none, ret);
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
+ pctx->line, &cfg_type_none, ret);
+ return ISC_R_SUCCESS;
}
cfg_ungettoken(pctx);
return cfg_parse_qstring(pctx, type, ret);
if (pctx->token.type == isc_tokentype_string &&
strcasecmp(TOKEN_STRING(pctx), "auto") == 0)
{
- return cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_auto, ret);
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
+ pctx->line, &cfg_type_auto, ret);
+ return ISC_R_SUCCESS;
}
cfg_ungettoken(pctx);
return cfg_parse_boolean(pctx, type, ret);
if (pctx->token.type == isc_tokentype_string &&
strcasecmp(TOKEN_STRING(pctx), "none") == 0)
{
- return cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_none, ret);
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
+ pctx->line, &cfg_type_none, ret);
+ return ISC_R_SUCCESS;
}
if (pctx->token.type == isc_tokentype_string &&
strcasecmp(TOKEN_STRING(pctx), "hostname") == 0)
{
- result = cfg_create_obj(pctx->mctx,
- cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_hostname, ret);
- if (result == ISC_R_SUCCESS) {
- (*ret)->value.boolean = true;
- }
- return result;
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
+ pctx->line, &cfg_type_hostname, ret);
+ (*ret)->value.boolean = true;
+ return ISC_R_SUCCESS;
}
cfg_ungettoken(pctx);
return cfg_parse_qstring(pctx, type, ret);
cfg_obj_t *obj = NULL;
const cfg_tuplefielddef_t *fields = type->of;
- CHECK(cfg_create_tuple(pctx, type, &obj));
+ cfg_tuple_create(pctx, type, &obj);
/* Parse the mandatory "mode" and "path" fields */
CHECK(cfg_parse_obj(pctx, fields[0].type, &obj->value.tuple[0]));
cfg_obj_t *obj = NULL;
const cfg_tuplefielddef_t *fields;
- CHECK(cfg_create_tuple(pctx, type, &obj));
+ cfg_tuple_create(pctx, type, &obj);
fields = type->of;
CHECK(cfg_parse_obj(pctx, fields[0].type, &obj->value.tuple[0]));
int fn;
isc_result_t result;
- CHECK(cfg_create_tuple(pctx, type, &obj));
+ cfg_tuple_create(pctx, type, &obj);
/*
* The zone first field is required and always first.
}
CHECK(parse_unitstring(TOKEN_STRING(pctx), &val));
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_uint64, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ &cfg_type_uint64, &obj);
obj->value.uint64 = val;
*ret = obj;
return ISC_R_SUCCESS;
percent = strtoull(TOKEN_STRING(pctx), &endp, 10);
if (*endp == '%' && *(endp + 1) == 0) {
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_percentage, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
+ pctx->line, &cfg_type_percentage, &obj);
obj->value.uint32 = (uint32_t)percent;
*ret = obj;
return ISC_R_SUCCESS;
} else {
CHECK(parse_unitstring(TOKEN_STRING(pctx), &val));
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_uint64, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
+ pctx->line, &cfg_type_uint64, &obj);
obj->value.uint64 = val;
*ret = obj;
return ISC_R_SUCCESS;
strcasecmp(TOKEN_STRING(pctx), "none") == 0)
{
CHECK(cfg_gettoken(pctx, 0));
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_none, ret));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
+ pctx->line, &cfg_type_none, ret);
} else {
CHECK(cfg_parse_sockaddr_generic(pctx, &cfg_type_querysource,
type, ret));
* This makes little sense, but we support it for
* compatibility with BIND 8.
*/
- CHECK(cfg_create_obj(
- pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_uint32, ret));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
+ pctx->line, &cfg_type_uint32, ret);
(*ret)->value.uint32 = 1;
}
(*ret)->type = &cfg_type_debuglevel; /* XXX kludge */
cfg_obj_t *obj = NULL;
const cfg_tuplefielddef_t *fields = type->of;
- CHECK(cfg_create_tuple(pctx, type, &obj));
+ cfg_tuple_create(pctx, type, &obj);
/* Parse the mandatory "file" field */
CHECK(cfg_parse_obj(pctx, fields[0].type, &obj->value.tuple[0]));
static void
free_list(cfg_obj_t *obj);
-static isc_result_t
-create_listelt(isc_mem_t *mctx, cfg_listelt_t **eltp);
+static void
+create_list(isc_mem_t *mctx, cfg_obj_t *file, size_t line,
+ const cfg_type_t *type, cfg_obj_t **obj);
+static void
+create_listelt(cfg_obj_t *list, cfg_listelt_t **eltp);
-static isc_result_t
+static void
create_string(cfg_parser_t *pctx, const char *contents, const cfg_type_t *type,
cfg_obj_t **ret);
-
static void
free_string(cfg_obj_t *obj);
static void
free_sockaddrtls(cfg_obj_t *obj);
-static isc_result_t
+static void
create_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **objp);
static void
/* Tuples. */
-isc_result_t
-cfg_create_tuple(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
- isc_result_t result;
+void
+cfg_tuple_create(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
const cfg_tuplefielddef_t *fields;
const cfg_tuplefielddef_t *f;
cfg_obj_t *obj = NULL;
nfields++;
}
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, type, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ type, &obj);
obj->value.tuple = isc_mem_cget(pctx->mctx, nfields,
sizeof(cfg_obj_t *));
for (f = fields, i = 0; f->name != NULL; f++, i++) {
obj->value.tuple[i] = NULL;
}
*ret = obj;
- return ISC_R_SUCCESS;
-
-cleanup:
- if (obj != NULL) {
- isc_mem_put(pctx->mctx, obj, sizeof(*obj));
- }
- return result;
}
isc_result_t
fields = type->of;
- CHECK(cfg_create_tuple(pctx, type, &obj));
+ cfg_tuple_create(pctx, type, &obj);
for (f = fields, i = 0; f->name != NULL; f++, i++) {
CHECK(cfg_parse_obj(pctx, f->type, &obj->value.tuple[i]));
}
print_list, NULL,
&cfg_rep_list, &cfg_type_qstring };
-static isc_result_t
+static void
parser_create(isc_mem_t *mctx, cfg_parser_t **ret) {
- isc_result_t result;
cfg_parser_t *pctx;
isc_lexspecials_t specials;
ISC_LEXCOMMENT_CPLUSPLUS |
ISC_LEXCOMMENT_SHELL);
- CHECK(cfg_create_list(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_filelist,
- &pctx->open_files));
- CHECK(cfg_create_list(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_filelist,
- &pctx->closed_files));
+ create_list(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ &cfg_type_filelist, &pctx->open_files);
+ create_list(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ &cfg_type_filelist, &pctx->closed_files);
*ret = pctx;
- return ISC_R_SUCCESS;
-
-cleanup:
- if (pctx->lexer != NULL) {
- isc_lex_destroy(&pctx->lexer);
- }
- CLEANUP_OBJ(pctx->open_files);
- CLEANUP_OBJ(pctx->closed_files);
- isc_mem_putanddetach(&pctx->mctx, pctx, sizeof(*pctx));
- return result;
}
static void
goto cleanup;
}
- CHECK(create_string(pctx, filename, &cfg_type_qstring, &stringobj));
- CHECK(create_listelt(pctx->mctx, &elt));
+ create_string(pctx, filename, &cfg_type_qstring, &stringobj);
+ create_listelt(pctx->open_files, &elt);
elt->obj = stringobj;
ISC_LIST_APPEND(pctx->open_files->value.list, elt, link);
REQUIRE(ret != NULL && *ret == NULL);
REQUIRE_PCTX_FLAGS(flags);
- CHECK(parser_create(mctx, &pctx));
+ parser_create(mctx, &pctx);
pctx->flags = flags;
CHECK(parser_openfile(pctx, filename));
REQUIRE(ret != NULL && *ret == NULL);
REQUIRE_PCTX_FLAGS(flags);
- CHECK(parser_create(mctx, &pctx));
+ parser_create(mctx, &pctx);
CHECK(isc_lex_openbuffer(pctx->lexer, buffer));
pctx->buf_name = file;
UNUSED(type);
- return cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_void, ret);
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ &cfg_type_void, ret);
+ return ISC_R_SUCCESS;
}
void
return ISC_R_UNEXPECTEDTOKEN;
}
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_percentage, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ &cfg_type_percentage, &obj);
obj->value.uint32 = (uint32_t)percent;
*ret = obj;
return ISC_R_UNEXPECTEDTOKEN;
}
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_fixedpoint, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ &cfg_type_fixedpoint, &obj);
obj->value.uint32 = strtoul(p, NULL, 10) * 100;
switch (n3) {
return ISC_R_UNEXPECTEDTOKEN;
}
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_uint32, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ &cfg_type_uint32, &obj);
obj->value.uint32 = pctx->token.value.as_ulong;
*ret = obj;
goto cleanup;
}
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_duration, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ &cfg_type_duration, &obj);
obj->value.duration = duration;
*ret = obj;
duration.iso8601 = false;
duration.unlimited = true;
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_duration, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
+ pctx->line, &cfg_type_duration, &obj);
obj->value.duration = duration;
*ret = obj;
return ISC_R_SUCCESS;
*/
/* Create a string object from a null-terminated C string. */
-static isc_result_t
+static void
create_string(cfg_parser_t *pctx, const char *contents, const cfg_type_t *type,
cfg_obj_t **ret) {
- isc_result_t result;
cfg_obj_t *obj = NULL;
int len;
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, type, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ type, &obj);
len = strlen(contents);
obj->value.string.length = len;
obj->value.string.base = isc_mem_get(pctx->mctx, len + 1);
- if (obj->value.string.base == 0) {
- isc_mem_put(pctx->mctx, obj, sizeof(*obj));
- return ISC_R_NOMEMORY;
- }
memmove(obj->value.string.base, contents, len);
obj->value.string.base[len] = '\0';
*ret = obj;
-cleanup:
- return result;
}
isc_result_t
cfg_parser_error(pctx, CFG_LOG_NEAR, "expected quoted string");
return ISC_R_UNEXPECTEDTOKEN;
}
- return create_string(pctx, TOKEN_STRING(pctx), &cfg_type_qstring, ret);
+ create_string(pctx, TOKEN_STRING(pctx), &cfg_type_qstring, ret);
+ return ISC_R_SUCCESS;
+
cleanup:
return result;
}
"expected unquoted string");
return ISC_R_UNEXPECTEDTOKEN;
}
- return create_string(pctx, TOKEN_STRING(pctx), &cfg_type_ustring, ret);
+ create_string(pctx, TOKEN_STRING(pctx), &cfg_type_ustring, ret);
+ return ISC_R_SUCCESS;
+
cleanup:
return result;
}
UNUSED(type);
CHECK(cfg_getstringtoken(pctx));
- return create_string(pctx, TOKEN_STRING(pctx), &cfg_type_qstring, ret);
+ create_string(pctx, TOKEN_STRING(pctx), &cfg_type_qstring, ret);
+ return ISC_R_SUCCESS;
+
cleanup:
return result;
}
UNUSED(type);
CHECK(cfg_getstringtoken(pctx));
- return create_string(pctx, TOKEN_STRING(pctx), &cfg_type_sstring, ret);
+ create_string(pctx, TOKEN_STRING(pctx), &cfg_type_sstring, ret);
+ return ISC_R_SUCCESS;
+
cleanup:
return result;
}
cfg_parser_error(pctx, CFG_LOG_NEAR, "expected bracketed text");
return ISC_R_UNEXPECTEDTOKEN;
}
- return create_string(pctx, TOKEN_STRING(pctx), &cfg_type_bracketed_text,
- ret);
+ create_string(pctx, TOKEN_STRING(pctx), &cfg_type_bracketed_text, ret);
+ return ISC_R_SUCCESS;
+
cleanup:
return result;
}
cfg_obj_t *obj = NULL;
const cfg_tuplefielddef_t *fields = type->of;
- CHECK(cfg_create_tuple(pctx, type, &obj));
+ cfg_tuple_create(pctx, type, &obj);
CHECK(cfg_parse_void(pctx, NULL, &obj->value.tuple[0]));
/* Parse the optional "db" field. */
goto bad_boolean;
}
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_boolean, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ &cfg_type_boolean, &obj);
obj->value.boolean = value;
*ret = obj;
- return result;
+ return ISC_R_SUCCESS;
bad_boolean:
cfg_parser_error(pctx, CFG_LOG_NEAR, "boolean expected");
return ISC_R_UNEXPECTEDTOKEN;
-
-cleanup:
- return result;
}
void
* Lists.
*/
-isc_result_t
-cfg_create_list(isc_mem_t *mctx, cfg_obj_t *file, size_t line,
- const cfg_type_t *type, cfg_obj_t **obj) {
- isc_result_t result;
-
+static void
+create_list(isc_mem_t *mctx, cfg_obj_t *file, size_t line,
+ const cfg_type_t *type, cfg_obj_t **obj) {
REQUIRE(mctx != NULL);
REQUIRE(type != NULL);
REQUIRE(obj != NULL && *obj == NULL);
- CHECK(cfg_create_obj(mctx, file, line, type, obj));
+ cfg_obj_create(mctx, file, line, type, obj);
ISC_LIST_INIT((*obj)->value.list);
-cleanup:
- return result;
}
-static isc_result_t
-create_listelt(isc_mem_t *mctx, cfg_listelt_t **eltp) {
- cfg_listelt_t *elt;
-
- elt = isc_mem_get(mctx, sizeof(*elt));
- elt->obj = NULL;
- ISC_LINK_INIT(elt, link);
+static void
+create_listelt(cfg_obj_t *list, cfg_listelt_t **eltp) {
+ cfg_listelt_t *elt = isc_mem_get(list->mctx, sizeof(*elt));
+ *elt = (cfg_listelt_t){ .link = ISC_LINK_INITIALIZER };
*eltp = elt;
- return ISC_R_SUCCESS;
}
static void
-free_listelt(isc_mem_t *mctx, cfg_listelt_t *elt) {
+free_listelt(cfg_obj_t *list, cfg_listelt_t **eltp) {
+ cfg_listelt_t *elt = *eltp;
+ *eltp = NULL;
+
if (elt->obj != NULL) {
cfg_obj_detach(&elt->obj);
}
- isc_mem_put(mctx, elt, sizeof(*elt));
+ isc_mem_put(list->mctx, elt, sizeof(*elt));
}
static void
free_list(cfg_obj_t *obj) {
ISC_LIST_FOREACH(obj->value.list, elt, link) {
- free_listelt(obj->mctx, elt);
+ free_listelt(obj, &elt);
}
}
isc_result_t
-cfg_parse_listelt(cfg_parser_t *pctx, const cfg_type_t *elttype,
- cfg_listelt_t **ret) {
+cfg_parse_listelt(cfg_parser_t *pctx, cfg_obj_t *list,
+ const cfg_type_t *elttype, cfg_listelt_t **ret) {
isc_result_t result;
cfg_listelt_t *elt = NULL;
cfg_obj_t *value = NULL;
REQUIRE(pctx != NULL);
+ REQUIRE(list != NULL);
REQUIRE(elttype != NULL);
REQUIRE(ret != NULL && *ret == NULL);
- CHECK(create_listelt(pctx->mctx, &elt));
-
result = cfg_parse_obj(pctx, elttype, &value);
if (result != ISC_R_SUCCESS) {
- goto cleanup;
+ return result;
}
+ create_listelt(list, &elt);
elt->obj = value;
-
*ret = elt;
- return ISC_R_SUCCESS;
-cleanup:
- isc_mem_put(pctx->mctx, elt, sizeof(*elt));
- return result;
+ return ISC_R_SUCCESS;
}
/*
isc_result_t result;
cfg_listelt_t *elt = NULL;
- CHECK(cfg_create_list(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, listtype, &listobj));
+ create_list(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ listtype, &listobj);
for (;;) {
CHECK(cfg_peektoken(pctx, 0));
{
break;
}
- CHECK(cfg_parse_listelt(pctx, listof, &elt));
+ CHECK(cfg_parse_listelt(pctx, listobj, listof, &elt));
CHECK(parse_semicolon(pctx));
ISC_LIST_APPEND(listobj->value.list, elt, link);
elt = NULL;
cleanup:
if (elt != NULL) {
- free_listelt(pctx->mctx, elt);
+ free_listelt(listobj, &elt);
}
CLEANUP_OBJ(listobj);
return result;
listof = listtype->of;
- CHECK(cfg_create_list(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, listtype, &listobj));
+ create_list(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ listtype, &listobj);
for (;;) {
cfg_listelt_t *elt = NULL;
{
break;
}
- CHECK(cfg_parse_listelt(pctx, listof, &elt));
+ CHECK(cfg_parse_listelt(pctx, listobj, listof, &elt));
ISC_LIST_APPEND(listobj->value.list, elt, link);
}
*ret = listobj;
return ISC_LIST_NEXT(elt, link);
}
+void
+cfg_list_unlink(cfg_obj_t *list, cfg_listelt_t *elt) {
+ ISC_LIST_UNLINK(list->value.list, elt, link);
+ free_listelt(list, &elt);
+}
+
/*
* Return the length of a list object. If obj is NULL or is not
* a list, return 0.
clausesets = type->of;
- CHECK(create_map(pctx, type, &obj));
+ create_map(pctx, type, &obj);
obj->value.map.clausesets = clausesets;
for (;;) {
- cfg_listelt_t *elt;
-
- redo:
/*
* Parse the option name and see if it is known.
*/
cfg_obj_detach(&includename);
globfree(&g);
- goto redo;
+ continue;
}
clause = NULL;
if ((clause->flags & CFG_CLAUSEFLAG_MULTI) != 0) {
/* Multivalued clause */
cfg_obj_t *listobj = NULL;
+ cfg_listelt_t *elt = NULL;
- CHECK(cfg_create_list(
- pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_implicitlist, &listobj));
+ create_list(pctx->mctx, cfg_parser_currentfile(pctx),
+ pctx->line, &cfg_type_implicitlist,
+ &listobj);
symval.as_pointer = listobj;
result = isc_symtab_define_and_return(
obj->value.map.symtab, clause->name,
SYMTAB_DUMMY_TYPE, symval, isc_symexists_reject,
&symval);
-
if (result == ISC_R_EXISTS) {
CLEANUP_OBJ(listobj);
listobj = symval.as_pointer;
}
- elt = NULL;
- CHECK(cfg_parse_listelt(pctx, clause->type, &elt));
- CHECK(parse_semicolon(pctx));
-
+ CHECK(cfg_parse_listelt(pctx, listobj, clause->type,
+ &elt));
ISC_LIST_APPEND(listobj->value.list, elt, link);
+ CHECK(parse_semicolon(pctx));
} else {
/* Single-valued clause */
bool chdir = ((clause->flags & CFG_CLAUSEFLAG_CHDIR) !=
UNUSED(type);
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_token, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ &cfg_type_token, &obj);
CHECK(cfg_gettoken(pctx, CFG_LEXOPT_QSTRING));
if (pctx->token.type == isc_tokentype_eof) {
cfg_ungettoken(pctx);
isc_result_t result;
int braces = 0;
- CHECK(cfg_create_list(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, type, &listobj));
+ create_list(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line, type,
+ &listobj);
for (;;) {
cfg_listelt_t *elt = NULL;
goto cleanup;
}
- CHECK(cfg_parse_listelt(pctx, &cfg_type_token, &elt));
+ CHECK(cfg_parse_listelt(pctx, listobj, &cfg_type_token, &elt));
ISC_LIST_APPEND(listobj->value.list, elt, link);
}
INSIST(braces == 0);
isc_netaddr_t netaddr;
unsigned int flags = *(const unsigned int *)type->of;
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, type, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ type, &obj);
CHECK(cfg_parse_rawaddr(pctx, flags, &netaddr));
isc_sockaddr_fromnetaddr(&obj->value.sockaddr, &netaddr, 0);
*ret = obj;
}
prefixlen = addrlen;
}
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, &cfg_type_netprefix, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ &cfg_type_netprefix, &obj);
obj->value.netprefix.address = netaddr;
obj->value.netprefix.prefixlen = prefixlen;
*ret = obj;
goto cleanup;
}
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, type, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ type, &obj);
if (have_tls == 1) {
obj->value.sockaddrtls.tls = tls;
}
return obj->line;
}
-isc_result_t
-cfg_create_obj(isc_mem_t *mctx, cfg_obj_t *file, size_t line,
+void
+cfg_obj_create(isc_mem_t *mctx, cfg_obj_t *file, size_t line,
const cfg_type_t *type, cfg_obj_t **ret) {
cfg_obj_t *obj;
}
*ret = obj;
-
- return ISC_R_SUCCESS;
}
static void
cfg_obj_detach(&obj);
}
-static isc_result_t
+static void
create_map(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
- isc_result_t result;
isc_symtab_t *symtab = NULL;
cfg_obj_t *obj = NULL;
- CHECK(cfg_create_obj(pctx->mctx, cfg_parser_currentfile(pctx),
- pctx->line, type, &obj));
+ cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
+ type, &obj);
isc_symtab_create(pctx->mctx, map_symtabitem_destroy, pctx, false,
&symtab);
obj->value.map.symtab = symtab;
obj->value.map.id = NULL;
*ret = obj;
- return ISC_R_SUCCESS;
-
-cleanup:
- if (obj != NULL) {
- isc_mem_put(pctx->mctx, obj, sizeof(*obj));
- }
- return result;
}
static void
}
/*
- * Destroy 'obj', a configuration object created in 'pctx'.
+ * Destroy 'obj'.
*/
static void
cfg__obj_destroy(cfg_obj_t *obj) {
isc_result_t result = ISC_R_SUCCESS;
const cfg_map_t *map = NULL;
isc_symvalue_t symval;
- cfg_obj_t *destobj = NULL;
- cfg_listelt_t *elt = NULL;
const cfg_clausedef_t *const *clauseset = NULL;
const cfg_clausedef_t *clause = NULL;
&symval);
if (result == ISC_R_NOTFOUND) {
if ((clause->flags & CFG_CLAUSEFLAG_MULTI) != 0) {
- CHECK(cfg_create_list(mapobj->mctx, obj->file,
- obj->line, &cfg_type_implicitlist,
- &destobj));
- CHECK(create_listelt(mapobj->mctx, &elt));
+ cfg_obj_t *destobj = NULL;
+ cfg_listelt_t *elt = NULL;
+
+ create_list(mapobj->mctx, obj->file, obj->line,
+ &cfg_type_implicitlist, &destobj);
+ create_listelt(destobj, &elt);
cfg_obj_attach(obj, &elt->obj);
ISC_LIST_APPEND(destobj->value.list, elt, link);
symval.as_pointer = destobj;
isc_symexists_reject);
INSIST(result == ISC_R_SUCCESS);
} else {
- cfg_obj_t *destobj2 = symval.as_pointer;
+ cfg_obj_t *destobj = symval.as_pointer;
+ cfg_listelt_t *elt = NULL;
INSIST(result == ISC_R_SUCCESS);
- if (destobj2->type == &cfg_type_implicitlist) {
- CHECK(create_listelt(mapobj->mctx, &elt));
+ if (destobj->type == &cfg_type_implicitlist) {
+ create_listelt(destobj, &elt);
cfg_obj_attach(obj, &elt->obj);
- ISC_LIST_APPEND(destobj2->value.list, elt, link);
+ ISC_LIST_APPEND(destobj->value.list, elt, link);
} else {
result = ISC_R_EXISTS;
}
}
- destobj = NULL;
- elt = NULL;
-
-cleanup:
- if (elt != NULL) {
- free_listelt(mapobj->mctx, elt);
- }
- CLEANUP_OBJ(destobj);
-
return result;
}