xref: /illumos-gate/usr/src/cmd/bhyve/config.h (revision 32640292339b07090f10ce34d455f98711077343)
12b948146SAndy Fiddaman /*-
2*32640292SAndy Fiddaman  * SPDX-License-Identifier: BSD-2-Clause
32b948146SAndy Fiddaman  *
42b948146SAndy Fiddaman  * Copyright (c) 2021 John H. Baldwin <jhb@FreeBSD.org>
52b948146SAndy Fiddaman  *
62b948146SAndy Fiddaman  * Redistribution and use in source and binary forms, with or without
72b948146SAndy Fiddaman  * modification, are permitted provided that the following conditions
82b948146SAndy Fiddaman  * are met:
92b948146SAndy Fiddaman  * 1. Redistributions of source code must retain the above copyright
102b948146SAndy Fiddaman  *    notice, this list of conditions and the following disclaimer.
112b948146SAndy Fiddaman  * 2. Redistributions in binary form must reproduce the above copyright
122b948146SAndy Fiddaman  *    notice, this list of conditions and the following disclaimer in the
132b948146SAndy Fiddaman  *    documentation and/or other materials provided with the distribution.
142b948146SAndy Fiddaman  *
152b948146SAndy Fiddaman  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
162b948146SAndy Fiddaman  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
172b948146SAndy Fiddaman  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
182b948146SAndy Fiddaman  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
192b948146SAndy Fiddaman  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
202b948146SAndy Fiddaman  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
212b948146SAndy Fiddaman  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
222b948146SAndy Fiddaman  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
232b948146SAndy Fiddaman  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
242b948146SAndy Fiddaman  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
252b948146SAndy Fiddaman  * SUCH DAMAGE.
262b948146SAndy Fiddaman  */
272b948146SAndy Fiddaman 
282b948146SAndy Fiddaman #ifndef __CONFIG_H__
292b948146SAndy Fiddaman #define	__CONFIG_H__
302b948146SAndy Fiddaman 
312b948146SAndy Fiddaman #include <sys/nv.h>
322b948146SAndy Fiddaman 
332b948146SAndy Fiddaman /*-
342b948146SAndy Fiddaman  * Manages a configuration database backed by an nv(9) list.
352b948146SAndy Fiddaman  *
362b948146SAndy Fiddaman  * The database only stores string values.  Callers should parse
372b948146SAndy Fiddaman  * values into other types if needed.  String values can reference
382b948146SAndy Fiddaman  * other configuration variables using a '%(name)' syntax.  In this
3959d65d31SAndy Fiddaman  * case, the name must be the full path of the configuration
402b948146SAndy Fiddaman  * variable.  The % character can be escaped with a preceding \ to
412b948146SAndy Fiddaman  * avoid expansion.  Any \ characters must be escaped.
422b948146SAndy Fiddaman  *
432b948146SAndy Fiddaman  * Configuration variables are stored in a tree.  The full path of a
442b948146SAndy Fiddaman  * variable is specified as a dot-separated name similar to sysctl(8)
452b948146SAndy Fiddaman  * OIDs.
462b948146SAndy Fiddaman  */
472b948146SAndy Fiddaman 
482b948146SAndy Fiddaman /*
492b948146SAndy Fiddaman  * Fetches the value of a configuration variable.  If the "raw" value
502b948146SAndy Fiddaman  * contains references to other configuration variables, this function
512b948146SAndy Fiddaman  * expands those references and returns a pointer to the parsed
522b948146SAndy Fiddaman  * string.  The string's storage is only stable until the next call to
532b948146SAndy Fiddaman  * this function.
542b948146SAndy Fiddaman  *
552b948146SAndy Fiddaman  * If no node is found, returns NULL.
562b948146SAndy Fiddaman  *
572b948146SAndy Fiddaman  * If 'parent' is NULL, 'name' is assumed to be a top-level variable.
582b948146SAndy Fiddaman  */
592b948146SAndy Fiddaman const char *get_config_value_node(const nvlist_t *parent, const char *name);
602b948146SAndy Fiddaman 
612b948146SAndy Fiddaman /*
622b948146SAndy Fiddaman  * Similar to get_config_value_node but expects a full path to the
632b948146SAndy Fiddaman  * leaf node.
642b948146SAndy Fiddaman  */
652b948146SAndy Fiddaman const char *get_config_value(const char *path);
662b948146SAndy Fiddaman 
672b948146SAndy Fiddaman /* Initializes the tree to an empty state. */
682b948146SAndy Fiddaman void	init_config(void);
692b948146SAndy Fiddaman 
702b948146SAndy Fiddaman /*
712b948146SAndy Fiddaman  * Creates an existing configuration node via a dot-separated OID
722b948146SAndy Fiddaman  * path.  Will fail if the path names an existing leaf configuration
732b948146SAndy Fiddaman  * variable.  If the node already exists, this returns a pointer to
742b948146SAndy Fiddaman  * the existing node.
752b948146SAndy Fiddaman  */
762b948146SAndy Fiddaman nvlist_t *create_config_node(const char *path);
772b948146SAndy Fiddaman 
782b948146SAndy Fiddaman /*
792b948146SAndy Fiddaman  * Looks for an existing configuration node via a dot-separated OID
802b948146SAndy Fiddaman  * path.  Will fail if the path names an existing leaf configuration
812b948146SAndy Fiddaman  * variable.
822b948146SAndy Fiddaman  */
832b948146SAndy Fiddaman nvlist_t *find_config_node(const char *path);
842b948146SAndy Fiddaman 
852b948146SAndy Fiddaman /*
862b948146SAndy Fiddaman  * Similar to the above, but treats the path relative to an existing
872b948146SAndy Fiddaman  * 'parent' node rather than as an absolute path.
882b948146SAndy Fiddaman  */
892b948146SAndy Fiddaman nvlist_t *create_relative_config_node(nvlist_t *parent, const char *path);
902b948146SAndy Fiddaman nvlist_t *find_relative_config_node(nvlist_t *parent, const char *path);
912b948146SAndy Fiddaman 
922b948146SAndy Fiddaman /*
932b948146SAndy Fiddaman  * Adds or replaces the value of the specified variable.
942b948146SAndy Fiddaman  *
952b948146SAndy Fiddaman  * If 'parent' is NULL, 'name' is assumed to be a top-level variable.
962b948146SAndy Fiddaman  */
972b948146SAndy Fiddaman void	set_config_value_node(nvlist_t *parent, const char *name,
982b948146SAndy Fiddaman     const char *value);
992b948146SAndy Fiddaman 
1002b948146SAndy Fiddaman /*
101d7b72f7bSAndy Fiddaman  * Similar to set_config_value_node but only sets value if it's unset yet.
102d7b72f7bSAndy Fiddaman  */
103d7b72f7bSAndy Fiddaman void 	set_config_value_node_if_unset(nvlist_t *const parent,
104d7b72f7bSAndy Fiddaman     const char *const name, const char *const value);
105d7b72f7bSAndy Fiddaman 
106d7b72f7bSAndy Fiddaman /*
1072b948146SAndy Fiddaman  * Similar to set_config_value_node but expects a full path to the
1082b948146SAndy Fiddaman  * leaf node.
1092b948146SAndy Fiddaman  */
1102b948146SAndy Fiddaman void	set_config_value(const char *path, const char *value);
1112b948146SAndy Fiddaman 
112d7b72f7bSAndy Fiddaman /*
113d7b72f7bSAndy Fiddaman  * Similar to set_config_value but only sets the value if it's unset yet.
114d7b72f7bSAndy Fiddaman  */
115d7b72f7bSAndy Fiddaman void 	set_config_value_if_unset(const char *const path,
116d7b72f7bSAndy Fiddaman     const char *const value);
117d7b72f7bSAndy Fiddaman 
1182b948146SAndy Fiddaman /* Convenience wrappers for boolean variables. */
1192b948146SAndy Fiddaman bool	get_config_bool(const char *path);
1202b948146SAndy Fiddaman bool	get_config_bool_node(const nvlist_t *parent, const char *name);
1212b948146SAndy Fiddaman bool	get_config_bool_default(const char *path, bool def);
1222b948146SAndy Fiddaman bool	get_config_bool_node_default(const nvlist_t *parent, const char *name,
1232b948146SAndy Fiddaman     bool def);
1242b948146SAndy Fiddaman void	set_config_bool(const char *path, bool value);
1252b948146SAndy Fiddaman void	set_config_bool_node(nvlist_t *parent, const char *name, bool value);
1262b948146SAndy Fiddaman 
1272b948146SAndy Fiddaman void	dump_config(void);
1282b948146SAndy Fiddaman 
1292b948146SAndy Fiddaman #endif /* !__CONFIG_H__ */
130