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