xref: /freebsd/sys/sys/nv.h (revision 95ee2897)
14d6a976eSRyan Stone /*-
29b10f59aSPedro F. Giffuni  * SPDX-License-Identifier: BSD-2-Clause
39b10f59aSPedro F. Giffuni  *
44d6a976eSRyan Stone  * Copyright (c) 2009-2013 The FreeBSD Foundation
5347a39b4SMariusz Zaborski  * Copyright (c) 2013-2015 Mariusz Zaborski <oshogbo@FreeBSD.org>
64d6a976eSRyan Stone  * All rights reserved.
74d6a976eSRyan Stone  *
84d6a976eSRyan Stone  * This software was developed by Pawel Jakub Dawidek under sponsorship from
94d6a976eSRyan Stone  * the FreeBSD Foundation.
104d6a976eSRyan Stone  *
114d6a976eSRyan Stone  * Redistribution and use in source and binary forms, with or without
124d6a976eSRyan Stone  * modification, are permitted provided that the following conditions
134d6a976eSRyan Stone  * are met:
144d6a976eSRyan Stone  * 1. Redistributions of source code must retain the above copyright
154d6a976eSRyan Stone  *    notice, this list of conditions and the following disclaimer.
164d6a976eSRyan Stone  * 2. Redistributions in binary form must reproduce the above copyright
174d6a976eSRyan Stone  *    notice, this list of conditions and the following disclaimer in the
184d6a976eSRyan Stone  *    documentation and/or other materials provided with the distribution.
194d6a976eSRyan Stone  *
204d6a976eSRyan Stone  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
214d6a976eSRyan Stone  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
224d6a976eSRyan Stone  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
234d6a976eSRyan Stone  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
244d6a976eSRyan Stone  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
254d6a976eSRyan Stone  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
264d6a976eSRyan Stone  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
274d6a976eSRyan Stone  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
284d6a976eSRyan Stone  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
294d6a976eSRyan Stone  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
304d6a976eSRyan Stone  * SUCH DAMAGE.
314d6a976eSRyan Stone  */
324d6a976eSRyan Stone 
334d6a976eSRyan Stone #ifndef	_NV_H_
344d6a976eSRyan Stone #define	_NV_H_
354d6a976eSRyan Stone 
364d6a976eSRyan Stone #include <sys/cdefs.h>
374d6a976eSRyan Stone 
384d6a976eSRyan Stone #ifndef _KERNEL
394d6a976eSRyan Stone #include <stdarg.h>
404d6a976eSRyan Stone #include <stdbool.h>
414d6a976eSRyan Stone #include <stdint.h>
424d6a976eSRyan Stone #include <stdio.h>
43000321baSReid Linnemann #include <sys/nv_namespace.h>
444d6a976eSRyan Stone #endif
454d6a976eSRyan Stone 
464d6a976eSRyan Stone #ifndef	_NVLIST_T_DECLARED
474d6a976eSRyan Stone #define	_NVLIST_T_DECLARED
484d6a976eSRyan Stone struct nvlist;
494d6a976eSRyan Stone 
504d6a976eSRyan Stone typedef struct nvlist nvlist_t;
514d6a976eSRyan Stone #endif
524d6a976eSRyan Stone 
534d6a976eSRyan Stone #define	NV_NAME_MAX	2048
544d6a976eSRyan Stone 
554d6a976eSRyan Stone #define	NV_TYPE_NONE			0
564d6a976eSRyan Stone 
574d6a976eSRyan Stone #define	NV_TYPE_NULL			1
584d6a976eSRyan Stone #define	NV_TYPE_BOOL			2
594d6a976eSRyan Stone #define	NV_TYPE_NUMBER			3
604d6a976eSRyan Stone #define	NV_TYPE_STRING			4
614d6a976eSRyan Stone #define	NV_TYPE_NVLIST			5
624d6a976eSRyan Stone #define	NV_TYPE_DESCRIPTOR		6
634d6a976eSRyan Stone #define	NV_TYPE_BINARY			7
64347a39b4SMariusz Zaborski #define	NV_TYPE_BOOL_ARRAY		8
65347a39b4SMariusz Zaborski #define	NV_TYPE_NUMBER_ARRAY		9
66347a39b4SMariusz Zaborski #define	NV_TYPE_STRING_ARRAY		10
67347a39b4SMariusz Zaborski #define	NV_TYPE_NVLIST_ARRAY		11
68347a39b4SMariusz Zaborski #define	NV_TYPE_DESCRIPTOR_ARRAY	12
694d6a976eSRyan Stone 
704d6a976eSRyan Stone /*
714d6a976eSRyan Stone  * Perform case-insensitive lookups of provided names.
724d6a976eSRyan Stone  */
734d6a976eSRyan Stone #define	NV_FLAG_IGNORE_CASE		0x01
74169c153bSMariusz Zaborski /*
75169c153bSMariusz Zaborski  * Names don't have to be unique.
76169c153bSMariusz Zaborski  */
77169c153bSMariusz Zaborski #define	NV_FLAG_NO_UNIQUE		0x02
784d6a976eSRyan Stone 
794d6a976eSRyan Stone #if defined(_KERNEL) && defined(MALLOC_DECLARE)
804d6a976eSRyan Stone MALLOC_DECLARE(M_NVLIST);
814d6a976eSRyan Stone #endif
824d6a976eSRyan Stone 
834d6a976eSRyan Stone __BEGIN_DECLS
844d6a976eSRyan Stone 
854d6a976eSRyan Stone nvlist_t	*nvlist_create(int flags);
864d6a976eSRyan Stone void		 nvlist_destroy(nvlist_t *nvl);
874d6a976eSRyan Stone int		 nvlist_error(const nvlist_t *nvl);
884d6a976eSRyan Stone bool		 nvlist_empty(const nvlist_t *nvl);
8924f93ee7SMariusz Zaborski int		 nvlist_flags(const nvlist_t *nvl);
904d6a976eSRyan Stone void		 nvlist_set_error(nvlist_t *nvl, int error);
914d6a976eSRyan Stone 
924d6a976eSRyan Stone nvlist_t *nvlist_clone(const nvlist_t *nvl);
934d6a976eSRyan Stone 
944d6a976eSRyan Stone #ifndef _KERNEL
954d6a976eSRyan Stone void nvlist_dump(const nvlist_t *nvl, int fd);
964d6a976eSRyan Stone void nvlist_fdump(const nvlist_t *nvl, FILE *fp);
974d6a976eSRyan Stone #endif
984d6a976eSRyan Stone 
994d6a976eSRyan Stone size_t		 nvlist_size(const nvlist_t *nvl);
1004d6a976eSRyan Stone void		*nvlist_pack(const nvlist_t *nvl, size_t *sizep);
101bd1da0a0SMariusz Zaborski nvlist_t	*nvlist_unpack(const void *buf, size_t size, int flags);
1024d6a976eSRyan Stone 
1034d6a976eSRyan Stone int nvlist_send(int sock, const nvlist_t *nvl);
104bd1da0a0SMariusz Zaborski nvlist_t *nvlist_recv(int sock, int flags);
105bd1da0a0SMariusz Zaborski nvlist_t *nvlist_xfer(int sock, nvlist_t *nvl, int flags);
1064d6a976eSRyan Stone 
1074d6a976eSRyan Stone const char *nvlist_next(const nvlist_t *nvl, int *typep, void **cookiep);
1084d6a976eSRyan Stone 
1094d6a976eSRyan Stone const nvlist_t *nvlist_get_parent(const nvlist_t *nvl, void **cookiep);
1104d6a976eSRyan Stone 
111347a39b4SMariusz Zaborski const nvlist_t *nvlist_get_array_next(const nvlist_t *nvl);
112347a39b4SMariusz Zaborski bool nvlist_in_array(const nvlist_t *nvl);
113347a39b4SMariusz Zaborski 
114347a39b4SMariusz Zaborski const nvlist_t *nvlist_get_pararr(const nvlist_t *nvl, void **cookiep);
115347a39b4SMariusz Zaborski 
1164d6a976eSRyan Stone /*
1174d6a976eSRyan Stone  * The nvlist_exists functions check if the given name (optionally of the given
1184d6a976eSRyan Stone  * type) exists on nvlist.
1194d6a976eSRyan Stone  */
1204d6a976eSRyan Stone 
1214d6a976eSRyan Stone bool nvlist_exists(const nvlist_t *nvl, const char *name);
1224d6a976eSRyan Stone bool nvlist_exists_type(const nvlist_t *nvl, const char *name, int type);
1234d6a976eSRyan Stone 
1244d6a976eSRyan Stone bool nvlist_exists_null(const nvlist_t *nvl, const char *name);
1254d6a976eSRyan Stone bool nvlist_exists_bool(const nvlist_t *nvl, const char *name);
1264d6a976eSRyan Stone bool nvlist_exists_number(const nvlist_t *nvl, const char *name);
1274d6a976eSRyan Stone bool nvlist_exists_string(const nvlist_t *nvl, const char *name);
1284d6a976eSRyan Stone bool nvlist_exists_nvlist(const nvlist_t *nvl, const char *name);
129347a39b4SMariusz Zaborski bool nvlist_exists_binary(const nvlist_t *nvl, const char *name);
130347a39b4SMariusz Zaborski bool nvlist_exists_bool_array(const nvlist_t *nvl, const char *name);
131347a39b4SMariusz Zaborski bool nvlist_exists_number_array(const nvlist_t *nvl, const char *name);
132347a39b4SMariusz Zaborski bool nvlist_exists_string_array(const nvlist_t *nvl, const char *name);
133347a39b4SMariusz Zaborski bool nvlist_exists_nvlist_array(const nvlist_t *nvl, const char *name);
1344d6a976eSRyan Stone #ifndef _KERNEL
1354d6a976eSRyan Stone bool nvlist_exists_descriptor(const nvlist_t *nvl, const char *name);
136347a39b4SMariusz Zaborski bool nvlist_exists_descriptor_array(const nvlist_t *nvl, const char *name);
1374d6a976eSRyan Stone #endif
1384d6a976eSRyan Stone 
1394d6a976eSRyan Stone /*
1404d6a976eSRyan Stone  * The nvlist_add functions add the given name/value pair.
1414d6a976eSRyan Stone  * If a pointer is provided, nvlist_add will internally allocate memory for the
1424d6a976eSRyan Stone  * given data (in other words it won't consume provided buffer).
1434d6a976eSRyan Stone  */
1444d6a976eSRyan Stone 
1454d6a976eSRyan Stone void nvlist_add_null(nvlist_t *nvl, const char *name);
1464d6a976eSRyan Stone void nvlist_add_bool(nvlist_t *nvl, const char *name, bool value);
1474d6a976eSRyan Stone void nvlist_add_number(nvlist_t *nvl, const char *name, uint64_t value);
1484d6a976eSRyan Stone void nvlist_add_string(nvlist_t *nvl, const char *name, const char *value);
1494d6a976eSRyan Stone void nvlist_add_stringf(nvlist_t *nvl, const char *name, const char *valuefmt, ...) __printflike(3, 4);
1501f2c9264SBryan Drewery #if !defined(_KERNEL) || defined(_VA_LIST_DECLARED)
1514d6a976eSRyan Stone void nvlist_add_stringv(nvlist_t *nvl, const char *name, const char *valuefmt, va_list valueap) __printflike(3, 0);
1524d6a976eSRyan Stone #endif
1534d6a976eSRyan Stone void nvlist_add_nvlist(nvlist_t *nvl, const char *name, const nvlist_t *value);
154347a39b4SMariusz Zaborski void nvlist_add_binary(nvlist_t *nvl, const char *name, const void *value, size_t size);
155347a39b4SMariusz Zaborski void nvlist_add_bool_array(nvlist_t *nvl, const char *name, const bool *value, size_t nitems);
156347a39b4SMariusz Zaborski void nvlist_add_number_array(nvlist_t *nvl, const char *name, const uint64_t *value, size_t nitems);
157347a39b4SMariusz Zaborski void nvlist_add_string_array(nvlist_t *nvl, const char *name, const char * const *value, size_t nitems);
158347a39b4SMariusz Zaborski void nvlist_add_nvlist_array(nvlist_t *nvl, const char *name, const nvlist_t * const *value, size_t nitems);
1594d6a976eSRyan Stone #ifndef _KERNEL
1604d6a976eSRyan Stone void nvlist_add_descriptor(nvlist_t *nvl, const char *name, int value);
161347a39b4SMariusz Zaborski void nvlist_add_descriptor_array(nvlist_t *nvl, const char *name, const int *value, size_t nitems);
1624d6a976eSRyan Stone #endif
1634d6a976eSRyan Stone 
16424881c06SMariusz Zaborski void nvlist_append_bool_array(nvlist_t *nvl, const char *name, const bool value);
16524881c06SMariusz Zaborski void nvlist_append_number_array(nvlist_t *nvl, const char *name, const uint64_t value);
16624881c06SMariusz Zaborski void nvlist_append_string_array(nvlist_t *nvl, const char *name, const char * const value);
16724881c06SMariusz Zaborski void nvlist_append_nvlist_array(nvlist_t *nvl, const char *name, const nvlist_t * const value);
16824881c06SMariusz Zaborski #ifndef _KERNEL
16924881c06SMariusz Zaborski void nvlist_append_descriptor_array(nvlist_t *nvl, const char *name, int value);
17024881c06SMariusz Zaborski #endif
17124881c06SMariusz Zaborski 
1724d6a976eSRyan Stone /*
1734d6a976eSRyan Stone  * The nvlist_move functions add the given name/value pair.
1744d6a976eSRyan Stone  * The functions consumes provided buffer.
1754d6a976eSRyan Stone  */
1764d6a976eSRyan Stone 
1774d6a976eSRyan Stone void nvlist_move_string(nvlist_t *nvl, const char *name, char *value);
1784d6a976eSRyan Stone void nvlist_move_nvlist(nvlist_t *nvl, const char *name, nvlist_t *value);
179347a39b4SMariusz Zaborski void nvlist_move_binary(nvlist_t *nvl, const char *name, void *value, size_t size);
180347a39b4SMariusz Zaborski void nvlist_move_bool_array(nvlist_t *nvl, const char *name, bool *value, size_t nitems);
181347a39b4SMariusz Zaborski void nvlist_move_string_array(nvlist_t *nvl, const char *name, char **value, size_t nitems);
182347a39b4SMariusz Zaborski void nvlist_move_nvlist_array(nvlist_t *nvl, const char *name, nvlist_t **value, size_t nitems);
183347a39b4SMariusz Zaborski void nvlist_move_number_array(nvlist_t *nvl, const char *name, uint64_t *value, size_t nitems);
1844d6a976eSRyan Stone #ifndef _KERNEL
1854d6a976eSRyan Stone void nvlist_move_descriptor(nvlist_t *nvl, const char *name, int value);
186347a39b4SMariusz Zaborski void nvlist_move_descriptor_array(nvlist_t *nvl, const char *name, int *value, size_t nitems);
1874d6a976eSRyan Stone #endif
1884d6a976eSRyan Stone 
1894d6a976eSRyan Stone /*
1904d6a976eSRyan Stone  * The nvlist_get functions returns value associated with the given name.
1914d6a976eSRyan Stone  * If it returns a pointer, the pointer represents internal buffer and should
1924d6a976eSRyan Stone  * not be freed by the caller.
1934d6a976eSRyan Stone  */
1944d6a976eSRyan Stone 
1954d6a976eSRyan Stone bool			 nvlist_get_bool(const nvlist_t *nvl, const char *name);
1964d6a976eSRyan Stone uint64_t		 nvlist_get_number(const nvlist_t *nvl, const char *name);
1974d6a976eSRyan Stone const char		*nvlist_get_string(const nvlist_t *nvl, const char *name);
1984d6a976eSRyan Stone const nvlist_t		*nvlist_get_nvlist(const nvlist_t *nvl, const char *name);
199347a39b4SMariusz Zaborski const void		*nvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep);
200347a39b4SMariusz Zaborski const bool		*nvlist_get_bool_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
201347a39b4SMariusz Zaborski const uint64_t		*nvlist_get_number_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
202347a39b4SMariusz Zaborski const char * const	*nvlist_get_string_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
203347a39b4SMariusz Zaborski const nvlist_t * const	*nvlist_get_nvlist_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
2044d6a976eSRyan Stone #ifndef _KERNEL
2054d6a976eSRyan Stone int			 nvlist_get_descriptor(const nvlist_t *nvl, const char *name);
206347a39b4SMariusz Zaborski const int		*nvlist_get_descriptor_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
2074d6a976eSRyan Stone #endif
2084d6a976eSRyan Stone 
2094d6a976eSRyan Stone /*
2104d6a976eSRyan Stone  * The nvlist_take functions returns value associated with the given name and
2114d6a976eSRyan Stone  * remove the given entry from the nvlist.
2124d6a976eSRyan Stone  * The caller is responsible for freeing received data.
2134d6a976eSRyan Stone  */
2144d6a976eSRyan Stone 
2154d6a976eSRyan Stone bool		  nvlist_take_bool(nvlist_t *nvl, const char *name);
2164d6a976eSRyan Stone uint64_t	  nvlist_take_number(nvlist_t *nvl, const char *name);
2174d6a976eSRyan Stone char		 *nvlist_take_string(nvlist_t *nvl, const char *name);
2184d6a976eSRyan Stone nvlist_t	 *nvlist_take_nvlist(nvlist_t *nvl, const char *name);
219347a39b4SMariusz Zaborski void		 *nvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep);
220347a39b4SMariusz Zaborski bool		 *nvlist_take_bool_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
221347a39b4SMariusz Zaborski uint64_t	 *nvlist_take_number_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
222347a39b4SMariusz Zaborski char		**nvlist_take_string_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
223347a39b4SMariusz Zaborski nvlist_t	**nvlist_take_nvlist_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
2244d6a976eSRyan Stone #ifndef _KERNEL
2254d6a976eSRyan Stone int		 nvlist_take_descriptor(nvlist_t *nvl, const char *name);
226347a39b4SMariusz Zaborski int		 *nvlist_take_descriptor_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
2274d6a976eSRyan Stone #endif
2284d6a976eSRyan Stone 
2294d6a976eSRyan Stone /*
2304d6a976eSRyan Stone  * The nvlist_free functions removes the given name/value pair from the nvlist
2314d6a976eSRyan Stone  * and frees memory associated with it.
2324d6a976eSRyan Stone  */
2334d6a976eSRyan Stone 
2344d6a976eSRyan Stone void nvlist_free(nvlist_t *nvl, const char *name);
2354d6a976eSRyan Stone void nvlist_free_type(nvlist_t *nvl, const char *name, int type);
2364d6a976eSRyan Stone 
2374d6a976eSRyan Stone void nvlist_free_null(nvlist_t *nvl, const char *name);
2384d6a976eSRyan Stone void nvlist_free_bool(nvlist_t *nvl, const char *name);
2394d6a976eSRyan Stone void nvlist_free_number(nvlist_t *nvl, const char *name);
2404d6a976eSRyan Stone void nvlist_free_string(nvlist_t *nvl, const char *name);
2414d6a976eSRyan Stone void nvlist_free_nvlist(nvlist_t *nvl, const char *name);
242347a39b4SMariusz Zaborski void nvlist_free_binary(nvlist_t *nvl, const char *name);
243347a39b4SMariusz Zaborski void nvlist_free_bool_array(nvlist_t *nvl, const char *name);
244347a39b4SMariusz Zaborski void nvlist_free_number_array(nvlist_t *nvl, const char *name);
245347a39b4SMariusz Zaborski void nvlist_free_string_array(nvlist_t *nvl, const char *name);
246347a39b4SMariusz Zaborski void nvlist_free_nvlist_array(nvlist_t *nvl, const char *name);
247347a39b4SMariusz Zaborski void nvlist_free_binary_array(nvlist_t *nvl, const char *name);
2484d6a976eSRyan Stone #ifndef _KERNEL
2494d6a976eSRyan Stone void nvlist_free_descriptor(nvlist_t *nvl, const char *name);
250347a39b4SMariusz Zaborski void nvlist_free_descriptor_array(nvlist_t *nvl, const char *name);
2514d6a976eSRyan Stone #endif
2524d6a976eSRyan Stone 
2534d6a976eSRyan Stone __END_DECLS
2544d6a976eSRyan Stone 
2554d6a976eSRyan Stone #endif	/* !_NV_H_ */
256