bhyve: Want walk_config_nodes

Add a function to all nodes under a config option node. This allows
parsing an arbitrary number of similarly structured configuration
options in a config option group.

Reviewed by:	corvink, markj
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D51551
This commit is contained in:
Hans Rosenfeld
2026-01-16 10:43:44 -04:00
committed by Joseph Mingrone
parent 87c4d6555b
commit e2d7bec6bc
2 changed files with 42 additions and 16 deletions
+33 -16
View File
@@ -2,6 +2,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2021 John H. Baldwin <jhb@FreeBSD.org>
* Copyright 2026 Hans Rosenfeld
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -434,31 +435,47 @@ set_config_bool_node(nvlist_t *parent, const char *name, bool value)
set_config_value_node(parent, name, value ? "true" : "false");
}
static void
dump_tree(const char *prefix, const nvlist_t *nvl)
int
walk_config_nodes(const char *prefix, const nvlist_t *parent, void *arg,
int (*cb)(const char *, const nvlist_t *, const char *, int, void *))
{
void *cookie = NULL;
const char *name;
void *cookie;
int type;
cookie = NULL;
while ((name = nvlist_next(nvl, &type, &cookie)) != NULL) {
if (type == NV_TYPE_NVLIST) {
char *new_prefix;
while ((name = nvlist_next(parent, &type, &cookie)) != NULL) {
int ret;
asprintf(&new_prefix, "%s%s.", prefix, name);
dump_tree(new_prefix, nvlist_get_nvlist(nvl, name));
free(new_prefix);
} else {
assert(type == NV_TYPE_STRING);
printf("%s%s=%s\n", prefix, name,
nvlist_get_string(nvl, name));
}
ret = cb(prefix, parent, name, type, arg);
if (ret != 0)
return (ret);
}
return (0);
}
static int
dump_node_cb(const char *prefix, const nvlist_t *parent, const char *name,
int type, void *arg)
{
if (type == NV_TYPE_NVLIST) {
char *new_prefix;
int ret;
asprintf(&new_prefix, "%s%s.", prefix, name);
ret = walk_config_nodes(new_prefix,
nvlist_get_nvlist(parent, name), arg, dump_node_cb);
free(new_prefix);
return (ret);
}
assert(type == NV_TYPE_STRING);
printf("%s%s=%s\n", prefix, name, nvlist_get_string(parent, name));
return (0);
}
void
dump_config(void)
{
dump_tree("", config_root);
(void)walk_config_nodes("", config_root, NULL, dump_node_cb);
}
+9
View File
@@ -2,6 +2,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2021 John H. Baldwin <jhb@FreeBSD.org>
* Copyright 2026 Hans Rosenfeld
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -45,6 +46,14 @@
* OIDs.
*/
/*
* Walk the nodes under a parent nvlist. For each node found, call the given
* callback function passing the current prefix, nvlist, node name and type,
* and the given argument.
*/
int walk_config_nodes(const char *, const nvlist_t *, void *,
int (*cb)(const char *, const nvlist_t *, const char *, int, void *));
/*
* Fetches the value of a configuration variable. If the "raw" value
* contains references to other configuration variables, this function