xref: /f-stack/freebsd/sys/nv.h (revision 22ce4aff)
1a9643ea8Slogwang /*-
2*22ce4affSfengbojiang  * SPDX-License-Identifier: BSD-2-Clause
3*22ce4affSfengbojiang  *
4a9643ea8Slogwang  * Copyright (c) 2009-2013 The FreeBSD Foundation
5a9643ea8Slogwang  * Copyright (c) 2013-2015 Mariusz Zaborski <[email protected]>
6a9643ea8Slogwang  * All rights reserved.
7a9643ea8Slogwang  *
8a9643ea8Slogwang  * This software was developed by Pawel Jakub Dawidek under sponsorship from
9a9643ea8Slogwang  * the FreeBSD Foundation.
10a9643ea8Slogwang  *
11a9643ea8Slogwang  * Redistribution and use in source and binary forms, with or without
12a9643ea8Slogwang  * modification, are permitted provided that the following conditions
13a9643ea8Slogwang  * are met:
14a9643ea8Slogwang  * 1. Redistributions of source code must retain the above copyright
15a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer.
16a9643ea8Slogwang  * 2. Redistributions in binary form must reproduce the above copyright
17a9643ea8Slogwang  *    notice, this list of conditions and the following disclaimer in the
18a9643ea8Slogwang  *    documentation and/or other materials provided with the distribution.
19a9643ea8Slogwang  *
20a9643ea8Slogwang  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
21a9643ea8Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22a9643ea8Slogwang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23a9643ea8Slogwang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
24a9643ea8Slogwang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25a9643ea8Slogwang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26a9643ea8Slogwang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27a9643ea8Slogwang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28a9643ea8Slogwang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29a9643ea8Slogwang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30a9643ea8Slogwang  * SUCH DAMAGE.
31a9643ea8Slogwang  *
32a9643ea8Slogwang  * $FreeBSD$
33a9643ea8Slogwang  */
34a9643ea8Slogwang 
35a9643ea8Slogwang #ifndef	_NV_H_
36a9643ea8Slogwang #define	_NV_H_
37a9643ea8Slogwang 
38a9643ea8Slogwang #include <sys/cdefs.h>
39a9643ea8Slogwang 
40a9643ea8Slogwang #ifndef _KERNEL
41a9643ea8Slogwang #include <stdarg.h>
42a9643ea8Slogwang #include <stdbool.h>
43a9643ea8Slogwang #include <stdint.h>
44a9643ea8Slogwang #include <stdio.h>
45a9643ea8Slogwang #endif
46a9643ea8Slogwang 
47a9643ea8Slogwang #ifndef	_NVLIST_T_DECLARED
48a9643ea8Slogwang #define	_NVLIST_T_DECLARED
49a9643ea8Slogwang struct nvlist;
50a9643ea8Slogwang 
51a9643ea8Slogwang typedef struct nvlist nvlist_t;
52a9643ea8Slogwang #endif
53a9643ea8Slogwang 
54a9643ea8Slogwang #define	NV_NAME_MAX	2048
55a9643ea8Slogwang 
56a9643ea8Slogwang #define	NV_TYPE_NONE			0
57a9643ea8Slogwang 
58a9643ea8Slogwang #define	NV_TYPE_NULL			1
59a9643ea8Slogwang #define	NV_TYPE_BOOL			2
60a9643ea8Slogwang #define	NV_TYPE_NUMBER			3
61a9643ea8Slogwang #define	NV_TYPE_STRING			4
62a9643ea8Slogwang #define	NV_TYPE_NVLIST			5
63a9643ea8Slogwang #define	NV_TYPE_DESCRIPTOR		6
64a9643ea8Slogwang #define	NV_TYPE_BINARY			7
65a9643ea8Slogwang #define	NV_TYPE_BOOL_ARRAY		8
66a9643ea8Slogwang #define	NV_TYPE_NUMBER_ARRAY		9
67a9643ea8Slogwang #define	NV_TYPE_STRING_ARRAY		10
68a9643ea8Slogwang #define	NV_TYPE_NVLIST_ARRAY		11
69a9643ea8Slogwang #define	NV_TYPE_DESCRIPTOR_ARRAY	12
70a9643ea8Slogwang 
71a9643ea8Slogwang /*
72a9643ea8Slogwang  * Perform case-insensitive lookups of provided names.
73a9643ea8Slogwang  */
74a9643ea8Slogwang #define	NV_FLAG_IGNORE_CASE		0x01
75a9643ea8Slogwang /*
76a9643ea8Slogwang  * Names don't have to be unique.
77a9643ea8Slogwang  */
78a9643ea8Slogwang #define	NV_FLAG_NO_UNIQUE		0x02
79a9643ea8Slogwang 
80a9643ea8Slogwang #if defined(_KERNEL) && defined(MALLOC_DECLARE)
81a9643ea8Slogwang MALLOC_DECLARE(M_NVLIST);
82a9643ea8Slogwang #endif
83a9643ea8Slogwang 
84a9643ea8Slogwang __BEGIN_DECLS
85a9643ea8Slogwang 
86a9643ea8Slogwang nvlist_t	*nvlist_create(int flags);
87a9643ea8Slogwang void		 nvlist_destroy(nvlist_t *nvl);
88a9643ea8Slogwang int		 nvlist_error(const nvlist_t *nvl);
89a9643ea8Slogwang bool		 nvlist_empty(const nvlist_t *nvl);
90a9643ea8Slogwang int		 nvlist_flags(const nvlist_t *nvl);
91a9643ea8Slogwang void		 nvlist_set_error(nvlist_t *nvl, int error);
92a9643ea8Slogwang 
93a9643ea8Slogwang nvlist_t *nvlist_clone(const nvlist_t *nvl);
94a9643ea8Slogwang 
95a9643ea8Slogwang #ifndef _KERNEL
96a9643ea8Slogwang void nvlist_dump(const nvlist_t *nvl, int fd);
97a9643ea8Slogwang void nvlist_fdump(const nvlist_t *nvl, FILE *fp);
98a9643ea8Slogwang #endif
99a9643ea8Slogwang 
100a9643ea8Slogwang size_t		 nvlist_size(const nvlist_t *nvl);
101a9643ea8Slogwang void		*nvlist_pack(const nvlist_t *nvl, size_t *sizep);
102a9643ea8Slogwang nvlist_t	*nvlist_unpack(const void *buf, size_t size, int flags);
103a9643ea8Slogwang 
104a9643ea8Slogwang int nvlist_send(int sock, const nvlist_t *nvl);
105a9643ea8Slogwang nvlist_t *nvlist_recv(int sock, int flags);
106a9643ea8Slogwang nvlist_t *nvlist_xfer(int sock, nvlist_t *nvl, int flags);
107a9643ea8Slogwang 
108a9643ea8Slogwang const char *nvlist_next(const nvlist_t *nvl, int *typep, void **cookiep);
109a9643ea8Slogwang 
110a9643ea8Slogwang const nvlist_t *nvlist_get_parent(const nvlist_t *nvl, void **cookiep);
111a9643ea8Slogwang 
112a9643ea8Slogwang const nvlist_t *nvlist_get_array_next(const nvlist_t *nvl);
113a9643ea8Slogwang bool nvlist_in_array(const nvlist_t *nvl);
114a9643ea8Slogwang 
115a9643ea8Slogwang const nvlist_t *nvlist_get_pararr(const nvlist_t *nvl, void **cookiep);
116a9643ea8Slogwang 
117a9643ea8Slogwang /*
118a9643ea8Slogwang  * The nvlist_exists functions check if the given name (optionally of the given
119a9643ea8Slogwang  * type) exists on nvlist.
120a9643ea8Slogwang  */
121a9643ea8Slogwang 
122a9643ea8Slogwang bool nvlist_exists(const nvlist_t *nvl, const char *name);
123a9643ea8Slogwang bool nvlist_exists_type(const nvlist_t *nvl, const char *name, int type);
124a9643ea8Slogwang 
125a9643ea8Slogwang bool nvlist_exists_null(const nvlist_t *nvl, const char *name);
126a9643ea8Slogwang bool nvlist_exists_bool(const nvlist_t *nvl, const char *name);
127a9643ea8Slogwang bool nvlist_exists_number(const nvlist_t *nvl, const char *name);
128a9643ea8Slogwang bool nvlist_exists_string(const nvlist_t *nvl, const char *name);
129a9643ea8Slogwang bool nvlist_exists_nvlist(const nvlist_t *nvl, const char *name);
130a9643ea8Slogwang bool nvlist_exists_binary(const nvlist_t *nvl, const char *name);
131a9643ea8Slogwang bool nvlist_exists_bool_array(const nvlist_t *nvl, const char *name);
132a9643ea8Slogwang bool nvlist_exists_number_array(const nvlist_t *nvl, const char *name);
133a9643ea8Slogwang bool nvlist_exists_string_array(const nvlist_t *nvl, const char *name);
134a9643ea8Slogwang bool nvlist_exists_nvlist_array(const nvlist_t *nvl, const char *name);
135a9643ea8Slogwang #ifndef _KERNEL
136a9643ea8Slogwang bool nvlist_exists_descriptor(const nvlist_t *nvl, const char *name);
137a9643ea8Slogwang bool nvlist_exists_descriptor_array(const nvlist_t *nvl, const char *name);
138a9643ea8Slogwang #endif
139a9643ea8Slogwang 
140a9643ea8Slogwang /*
141a9643ea8Slogwang  * The nvlist_add functions add the given name/value pair.
142a9643ea8Slogwang  * If a pointer is provided, nvlist_add will internally allocate memory for the
143a9643ea8Slogwang  * given data (in other words it won't consume provided buffer).
144a9643ea8Slogwang  */
145a9643ea8Slogwang 
146a9643ea8Slogwang void nvlist_add_null(nvlist_t *nvl, const char *name);
147a9643ea8Slogwang void nvlist_add_bool(nvlist_t *nvl, const char *name, bool value);
148a9643ea8Slogwang void nvlist_add_number(nvlist_t *nvl, const char *name, uint64_t value);
149a9643ea8Slogwang void nvlist_add_string(nvlist_t *nvl, const char *name, const char *value);
150a9643ea8Slogwang void nvlist_add_stringf(nvlist_t *nvl, const char *name, const char *valuefmt, ...) __printflike(3, 4);
151a9643ea8Slogwang #if !defined(_KERNEL) || defined(_VA_LIST_DECLARED)
152a9643ea8Slogwang void nvlist_add_stringv(nvlist_t *nvl, const char *name, const char *valuefmt, va_list valueap) __printflike(3, 0);
153a9643ea8Slogwang #endif
154a9643ea8Slogwang void nvlist_add_nvlist(nvlist_t *nvl, const char *name, const nvlist_t *value);
155a9643ea8Slogwang void nvlist_add_binary(nvlist_t *nvl, const char *name, const void *value, size_t size);
156a9643ea8Slogwang void nvlist_add_bool_array(nvlist_t *nvl, const char *name, const bool *value, size_t nitems);
157a9643ea8Slogwang void nvlist_add_number_array(nvlist_t *nvl, const char *name, const uint64_t *value, size_t nitems);
158a9643ea8Slogwang void nvlist_add_string_array(nvlist_t *nvl, const char *name, const char * const *value, size_t nitems);
159a9643ea8Slogwang void nvlist_add_nvlist_array(nvlist_t *nvl, const char *name, const nvlist_t * const *value, size_t nitems);
160a9643ea8Slogwang #ifndef _KERNEL
161a9643ea8Slogwang void nvlist_add_descriptor(nvlist_t *nvl, const char *name, int value);
162a9643ea8Slogwang void nvlist_add_descriptor_array(nvlist_t *nvl, const char *name, const int *value, size_t nitems);
163a9643ea8Slogwang #endif
164a9643ea8Slogwang 
165*22ce4affSfengbojiang void nvlist_append_bool_array(nvlist_t *nvl, const char *name, const bool value);
166*22ce4affSfengbojiang void nvlist_append_number_array(nvlist_t *nvl, const char *name, const uint64_t value);
167*22ce4affSfengbojiang void nvlist_append_string_array(nvlist_t *nvl, const char *name, const char * const value);
168*22ce4affSfengbojiang void nvlist_append_nvlist_array(nvlist_t *nvl, const char *name, const nvlist_t * const value);
169*22ce4affSfengbojiang #ifndef _KERNEL
170*22ce4affSfengbojiang void nvlist_append_descriptor_array(nvlist_t *nvl, const char *name, int value);
171*22ce4affSfengbojiang #endif
172*22ce4affSfengbojiang 
173a9643ea8Slogwang /*
174a9643ea8Slogwang  * The nvlist_move functions add the given name/value pair.
175a9643ea8Slogwang  * The functions consumes provided buffer.
176a9643ea8Slogwang  */
177a9643ea8Slogwang 
178a9643ea8Slogwang void nvlist_move_string(nvlist_t *nvl, const char *name, char *value);
179a9643ea8Slogwang void nvlist_move_nvlist(nvlist_t *nvl, const char *name, nvlist_t *value);
180a9643ea8Slogwang void nvlist_move_binary(nvlist_t *nvl, const char *name, void *value, size_t size);
181a9643ea8Slogwang void nvlist_move_bool_array(nvlist_t *nvl, const char *name, bool *value, size_t nitems);
182a9643ea8Slogwang void nvlist_move_string_array(nvlist_t *nvl, const char *name, char **value, size_t nitems);
183a9643ea8Slogwang void nvlist_move_nvlist_array(nvlist_t *nvl, const char *name, nvlist_t **value, size_t nitems);
184a9643ea8Slogwang void nvlist_move_number_array(nvlist_t *nvl, const char *name, uint64_t *value, size_t nitems);
185a9643ea8Slogwang #ifndef _KERNEL
186a9643ea8Slogwang void nvlist_move_descriptor(nvlist_t *nvl, const char *name, int value);
187a9643ea8Slogwang void nvlist_move_descriptor_array(nvlist_t *nvl, const char *name, int *value, size_t nitems);
188a9643ea8Slogwang #endif
189a9643ea8Slogwang 
190a9643ea8Slogwang /*
191a9643ea8Slogwang  * The nvlist_get functions returns value associated with the given name.
192a9643ea8Slogwang  * If it returns a pointer, the pointer represents internal buffer and should
193a9643ea8Slogwang  * not be freed by the caller.
194a9643ea8Slogwang  */
195a9643ea8Slogwang 
196a9643ea8Slogwang bool			 nvlist_get_bool(const nvlist_t *nvl, const char *name);
197a9643ea8Slogwang uint64_t		 nvlist_get_number(const nvlist_t *nvl, const char *name);
198a9643ea8Slogwang const char		*nvlist_get_string(const nvlist_t *nvl, const char *name);
199a9643ea8Slogwang const nvlist_t		*nvlist_get_nvlist(const nvlist_t *nvl, const char *name);
200a9643ea8Slogwang const void		*nvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep);
201a9643ea8Slogwang const bool		*nvlist_get_bool_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
202a9643ea8Slogwang const uint64_t		*nvlist_get_number_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
203a9643ea8Slogwang const char * const	*nvlist_get_string_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
204a9643ea8Slogwang const nvlist_t * const	*nvlist_get_nvlist_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
205a9643ea8Slogwang #ifndef _KERNEL
206a9643ea8Slogwang int			 nvlist_get_descriptor(const nvlist_t *nvl, const char *name);
207a9643ea8Slogwang const int		*nvlist_get_descriptor_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
208a9643ea8Slogwang #endif
209a9643ea8Slogwang 
210a9643ea8Slogwang /*
211a9643ea8Slogwang  * The nvlist_take functions returns value associated with the given name and
212a9643ea8Slogwang  * remove the given entry from the nvlist.
213a9643ea8Slogwang  * The caller is responsible for freeing received data.
214a9643ea8Slogwang  */
215a9643ea8Slogwang 
216a9643ea8Slogwang bool		  nvlist_take_bool(nvlist_t *nvl, const char *name);
217a9643ea8Slogwang uint64_t	  nvlist_take_number(nvlist_t *nvl, const char *name);
218a9643ea8Slogwang char		 *nvlist_take_string(nvlist_t *nvl, const char *name);
219a9643ea8Slogwang nvlist_t	 *nvlist_take_nvlist(nvlist_t *nvl, const char *name);
220a9643ea8Slogwang void		 *nvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep);
221a9643ea8Slogwang bool		 *nvlist_take_bool_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
222a9643ea8Slogwang uint64_t	 *nvlist_take_number_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
223a9643ea8Slogwang char		**nvlist_take_string_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
224a9643ea8Slogwang nvlist_t	**nvlist_take_nvlist_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
225a9643ea8Slogwang #ifndef _KERNEL
226a9643ea8Slogwang int		 nvlist_take_descriptor(nvlist_t *nvl, const char *name);
227a9643ea8Slogwang int		 *nvlist_take_descriptor_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
228a9643ea8Slogwang #endif
229a9643ea8Slogwang 
230a9643ea8Slogwang /*
231a9643ea8Slogwang  * The nvlist_free functions removes the given name/value pair from the nvlist
232a9643ea8Slogwang  * and frees memory associated with it.
233a9643ea8Slogwang  */
234a9643ea8Slogwang 
235a9643ea8Slogwang void nvlist_free(nvlist_t *nvl, const char *name);
236a9643ea8Slogwang void nvlist_free_type(nvlist_t *nvl, const char *name, int type);
237a9643ea8Slogwang 
238a9643ea8Slogwang void nvlist_free_null(nvlist_t *nvl, const char *name);
239a9643ea8Slogwang void nvlist_free_bool(nvlist_t *nvl, const char *name);
240a9643ea8Slogwang void nvlist_free_number(nvlist_t *nvl, const char *name);
241a9643ea8Slogwang void nvlist_free_string(nvlist_t *nvl, const char *name);
242a9643ea8Slogwang void nvlist_free_nvlist(nvlist_t *nvl, const char *name);
243a9643ea8Slogwang void nvlist_free_binary(nvlist_t *nvl, const char *name);
244a9643ea8Slogwang void nvlist_free_bool_array(nvlist_t *nvl, const char *name);
245a9643ea8Slogwang void nvlist_free_number_array(nvlist_t *nvl, const char *name);
246a9643ea8Slogwang void nvlist_free_string_array(nvlist_t *nvl, const char *name);
247a9643ea8Slogwang void nvlist_free_nvlist_array(nvlist_t *nvl, const char *name);
248a9643ea8Slogwang void nvlist_free_binary_array(nvlist_t *nvl, const char *name);
249a9643ea8Slogwang #ifndef _KERNEL
250a9643ea8Slogwang void nvlist_free_descriptor(nvlist_t *nvl, const char *name);
251a9643ea8Slogwang void nvlist_free_descriptor_array(nvlist_t *nvl, const char *name);
252a9643ea8Slogwang #endif
253a9643ea8Slogwang 
254a9643ea8Slogwang __END_DECLS
255a9643ea8Slogwang 
256a9643ea8Slogwang #endif	/* !_NV_H_ */
257