xref: /illumos-gate/usr/src/cmd/bhyve/common/config.h (revision 5c4a5fe16715fb423db76577a6883b5bbecdbe45)
1*5c4a5fe1SAndy Fiddaman /*-
2*5c4a5fe1SAndy Fiddaman  * SPDX-License-Identifier: BSD-2-Clause
3*5c4a5fe1SAndy Fiddaman  *
4*5c4a5fe1SAndy Fiddaman  * Copyright (c) 2021 John H. Baldwin <jhb@FreeBSD.org>
5*5c4a5fe1SAndy Fiddaman  *
6*5c4a5fe1SAndy Fiddaman  * Redistribution and use in source and binary forms, with or without
7*5c4a5fe1SAndy Fiddaman  * modification, are permitted provided that the following conditions
8*5c4a5fe1SAndy Fiddaman  * are met:
9*5c4a5fe1SAndy Fiddaman  * 1. Redistributions of source code must retain the above copyright
10*5c4a5fe1SAndy Fiddaman  *    notice, this list of conditions and the following disclaimer.
11*5c4a5fe1SAndy Fiddaman  * 2. Redistributions in binary form must reproduce the above copyright
12*5c4a5fe1SAndy Fiddaman  *    notice, this list of conditions and the following disclaimer in the
13*5c4a5fe1SAndy Fiddaman  *    documentation and/or other materials provided with the distribution.
14*5c4a5fe1SAndy Fiddaman  *
15*5c4a5fe1SAndy Fiddaman  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*5c4a5fe1SAndy Fiddaman  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*5c4a5fe1SAndy Fiddaman  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*5c4a5fe1SAndy Fiddaman  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*5c4a5fe1SAndy Fiddaman  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*5c4a5fe1SAndy Fiddaman  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*5c4a5fe1SAndy Fiddaman  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*5c4a5fe1SAndy Fiddaman  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*5c4a5fe1SAndy Fiddaman  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*5c4a5fe1SAndy Fiddaman  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*5c4a5fe1SAndy Fiddaman  * SUCH DAMAGE.
26*5c4a5fe1SAndy Fiddaman  */
27*5c4a5fe1SAndy Fiddaman 
28*5c4a5fe1SAndy Fiddaman #ifndef __CONFIG_H__
29*5c4a5fe1SAndy Fiddaman #define	__CONFIG_H__
30*5c4a5fe1SAndy Fiddaman 
31*5c4a5fe1SAndy Fiddaman #include <sys/nv.h>
32*5c4a5fe1SAndy Fiddaman 
33*5c4a5fe1SAndy Fiddaman /*-
34*5c4a5fe1SAndy Fiddaman  * Manages a configuration database backed by an nv(9) list.
35*5c4a5fe1SAndy Fiddaman  *
36*5c4a5fe1SAndy Fiddaman  * The database only stores string values.  Callers should parse
37*5c4a5fe1SAndy Fiddaman  * values into other types if needed.  String values can reference
38*5c4a5fe1SAndy Fiddaman  * other configuration variables using a '%(name)' syntax.  In this
39*5c4a5fe1SAndy Fiddaman  * case, the name must be the full path of the configuration
40*5c4a5fe1SAndy Fiddaman  * variable.  The % character can be escaped with a preceding \ to
41*5c4a5fe1SAndy Fiddaman  * avoid expansion.  Any \ characters must be escaped.
42*5c4a5fe1SAndy Fiddaman  *
43*5c4a5fe1SAndy Fiddaman  * Configuration variables are stored in a tree.  The full path of a
44*5c4a5fe1SAndy Fiddaman  * variable is specified as a dot-separated name similar to sysctl(8)
45*5c4a5fe1SAndy Fiddaman  * OIDs.
46*5c4a5fe1SAndy Fiddaman  */
47*5c4a5fe1SAndy Fiddaman 
48*5c4a5fe1SAndy Fiddaman /*
49*5c4a5fe1SAndy Fiddaman  * Fetches the value of a configuration variable.  If the "raw" value
50*5c4a5fe1SAndy Fiddaman  * contains references to other configuration variables, this function
51*5c4a5fe1SAndy Fiddaman  * expands those references and returns a pointer to the parsed
52*5c4a5fe1SAndy Fiddaman  * string.  The string's storage is only stable until the next call to
53*5c4a5fe1SAndy Fiddaman  * this function.
54*5c4a5fe1SAndy Fiddaman  *
55*5c4a5fe1SAndy Fiddaman  * If no node is found, returns NULL.
56*5c4a5fe1SAndy Fiddaman  *
57*5c4a5fe1SAndy Fiddaman  * If 'parent' is NULL, 'name' is assumed to be a top-level variable.
58*5c4a5fe1SAndy Fiddaman  */
59*5c4a5fe1SAndy Fiddaman const char *get_config_value_node(const nvlist_t *parent, const char *name);
60*5c4a5fe1SAndy Fiddaman 
61*5c4a5fe1SAndy Fiddaman /*
62*5c4a5fe1SAndy Fiddaman  * Similar to get_config_value_node but expects a full path to the
63*5c4a5fe1SAndy Fiddaman  * leaf node.
64*5c4a5fe1SAndy Fiddaman  */
65*5c4a5fe1SAndy Fiddaman const char *get_config_value(const char *path);
66*5c4a5fe1SAndy Fiddaman 
67*5c4a5fe1SAndy Fiddaman /* Initializes the tree to an empty state. */
68*5c4a5fe1SAndy Fiddaman void	init_config(void);
69*5c4a5fe1SAndy Fiddaman 
70*5c4a5fe1SAndy Fiddaman /*
71*5c4a5fe1SAndy Fiddaman  * Creates an existing configuration node via a dot-separated OID
72*5c4a5fe1SAndy Fiddaman  * path.  Will fail if the path names an existing leaf configuration
73*5c4a5fe1SAndy Fiddaman  * variable.  If the node already exists, this returns a pointer to
74*5c4a5fe1SAndy Fiddaman  * the existing node.
75*5c4a5fe1SAndy Fiddaman  */
76*5c4a5fe1SAndy Fiddaman nvlist_t *create_config_node(const char *path);
77*5c4a5fe1SAndy Fiddaman 
78*5c4a5fe1SAndy Fiddaman /*
79*5c4a5fe1SAndy Fiddaman  * Looks for an existing configuration node via a dot-separated OID
80*5c4a5fe1SAndy Fiddaman  * path.  Will fail if the path names an existing leaf configuration
81*5c4a5fe1SAndy Fiddaman  * variable.
82*5c4a5fe1SAndy Fiddaman  */
83*5c4a5fe1SAndy Fiddaman nvlist_t *find_config_node(const char *path);
84*5c4a5fe1SAndy Fiddaman 
85*5c4a5fe1SAndy Fiddaman /*
86*5c4a5fe1SAndy Fiddaman  * Similar to the above, but treats the path relative to an existing
87*5c4a5fe1SAndy Fiddaman  * 'parent' node rather than as an absolute path.
88*5c4a5fe1SAndy Fiddaman  */
89*5c4a5fe1SAndy Fiddaman nvlist_t *create_relative_config_node(nvlist_t *parent, const char *path);
90*5c4a5fe1SAndy Fiddaman nvlist_t *find_relative_config_node(nvlist_t *parent, const char *path);
91*5c4a5fe1SAndy Fiddaman 
92*5c4a5fe1SAndy Fiddaman /*
93*5c4a5fe1SAndy Fiddaman  * Adds or replaces the value of the specified variable.
94*5c4a5fe1SAndy Fiddaman  *
95*5c4a5fe1SAndy Fiddaman  * If 'parent' is NULL, 'name' is assumed to be a top-level variable.
96*5c4a5fe1SAndy Fiddaman  */
97*5c4a5fe1SAndy Fiddaman void	set_config_value_node(nvlist_t *parent, const char *name,
98*5c4a5fe1SAndy Fiddaman     const char *value);
99*5c4a5fe1SAndy Fiddaman 
100*5c4a5fe1SAndy Fiddaman /*
101*5c4a5fe1SAndy Fiddaman  * Similar to set_config_value_node but only sets value if it's unset yet.
102*5c4a5fe1SAndy Fiddaman  */
103*5c4a5fe1SAndy Fiddaman void 	set_config_value_node_if_unset(nvlist_t *const parent,
104*5c4a5fe1SAndy Fiddaman     const char *const name, const char *const value);
105*5c4a5fe1SAndy Fiddaman 
106*5c4a5fe1SAndy Fiddaman /*
107*5c4a5fe1SAndy Fiddaman  * Similar to set_config_value_node but expects a full path to the
108*5c4a5fe1SAndy Fiddaman  * leaf node.
109*5c4a5fe1SAndy Fiddaman  */
110*5c4a5fe1SAndy Fiddaman void	set_config_value(const char *path, const char *value);
111*5c4a5fe1SAndy Fiddaman 
112*5c4a5fe1SAndy Fiddaman /*
113*5c4a5fe1SAndy Fiddaman  * Similar to set_config_value but only sets the value if it's unset yet.
114*5c4a5fe1SAndy Fiddaman  */
115*5c4a5fe1SAndy Fiddaman void 	set_config_value_if_unset(const char *const path,
116*5c4a5fe1SAndy Fiddaman     const char *const value);
117*5c4a5fe1SAndy Fiddaman 
118*5c4a5fe1SAndy Fiddaman /* Convenience wrappers for boolean variables. */
119*5c4a5fe1SAndy Fiddaman bool	get_config_bool(const char *path);
120*5c4a5fe1SAndy Fiddaman bool	get_config_bool_node(const nvlist_t *parent, const char *name);
121*5c4a5fe1SAndy Fiddaman bool	get_config_bool_default(const char *path, bool def);
122*5c4a5fe1SAndy Fiddaman bool	get_config_bool_node_default(const nvlist_t *parent, const char *name,
123*5c4a5fe1SAndy Fiddaman     bool def);
124*5c4a5fe1SAndy Fiddaman void	set_config_bool(const char *path, bool value);
125*5c4a5fe1SAndy Fiddaman void	set_config_bool_node(nvlist_t *parent, const char *name, bool value);
126*5c4a5fe1SAndy Fiddaman 
127*5c4a5fe1SAndy Fiddaman void	dump_config(void);
128*5c4a5fe1SAndy Fiddaman 
129*5c4a5fe1SAndy Fiddaman #endif /* !__CONFIG_H__ */
130