xref: /freebsd/share/man/man9/nv.9 (revision a1b5ae332663bcb0d0e9cfd368f2558f563aa028)
158c86148SMariusz Zaborski.\"
258c86148SMariusz Zaborski.\" Copyright (c) 2013 The FreeBSD Foundation
3347a39b4SMariusz Zaborski.\" Copyright (c) 2013-2015 Mariusz Zaborski <oshogbo@FreeBSD.org>
458c86148SMariusz Zaborski.\" All rights reserved.
558c86148SMariusz Zaborski.\"
658c86148SMariusz Zaborski.\" This documentation was written by Pawel Jakub Dawidek under sponsorship
758c86148SMariusz Zaborski.\" the FreeBSD Foundation.
858c86148SMariusz Zaborski.\"
958c86148SMariusz Zaborski.\" Redistribution and use in source and binary forms, with or without
1058c86148SMariusz Zaborski.\" modification, are permitted provided that the following conditions
1158c86148SMariusz Zaborski.\" are met:
1258c86148SMariusz Zaborski.\" 1. Redistributions of source code must retain the above copyright
1358c86148SMariusz Zaborski.\"    notice, this list of conditions and the following disclaimer.
1458c86148SMariusz Zaborski.\" 2. Redistributions in binary form must reproduce the above copyright
1558c86148SMariusz Zaborski.\"    notice, this list of conditions and the following disclaimer in the
1658c86148SMariusz Zaborski.\"    documentation and/or other materials provided with the distribution.
1758c86148SMariusz Zaborski.\"
1858c86148SMariusz Zaborski.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1958c86148SMariusz Zaborski.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2058c86148SMariusz Zaborski.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2158c86148SMariusz Zaborski.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2258c86148SMariusz Zaborski.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2358c86148SMariusz Zaborski.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2458c86148SMariusz Zaborski.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2558c86148SMariusz Zaborski.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2658c86148SMariusz Zaborski.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2758c86148SMariusz Zaborski.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2858c86148SMariusz Zaborski.\" SUCH DAMAGE.
2958c86148SMariusz Zaborski.\"
3058c86148SMariusz Zaborski.\" $FreeBSD$
3158c86148SMariusz Zaborski.\"
32*a1b5ae33SMariusz Zaborski.Dd September 16, 2017
3358c86148SMariusz Zaborski.Dt NV 9
3458c86148SMariusz Zaborski.Os
3558c86148SMariusz Zaborski.Sh NAME
3658c86148SMariusz Zaborski.Nm nvlist_create ,
3758c86148SMariusz Zaborski.Nm nvlist_destroy ,
3858c86148SMariusz Zaborski.Nm nvlist_error ,
3958c86148SMariusz Zaborski.Nm nvlist_set_error ,
4058c86148SMariusz Zaborski.Nm nvlist_empty ,
4158c86148SMariusz Zaborski.Nm nvlist_flags ,
4258c86148SMariusz Zaborski.Nm nvlist_exists ,
4358c86148SMariusz Zaborski.Nm nvlist_free ,
4458c86148SMariusz Zaborski.Nm nvlist_clone ,
4558c86148SMariusz Zaborski.Nm nvlist_dump ,
4658c86148SMariusz Zaborski.Nm nvlist_fdump ,
4758c86148SMariusz Zaborski.Nm nvlist_size ,
4858c86148SMariusz Zaborski.Nm nvlist_pack ,
4958c86148SMariusz Zaborski.Nm nvlist_unpack ,
5058c86148SMariusz Zaborski.Nm nvlist_send ,
5158c86148SMariusz Zaborski.Nm nvlist_recv ,
5258c86148SMariusz Zaborski.Nm nvlist_xfer ,
53347a39b4SMariusz Zaborski.Nm nvlist_in_array ,
5458c86148SMariusz Zaborski.Nm nvlist_next ,
5558c86148SMariusz Zaborski.Nm nvlist_add ,
5658c86148SMariusz Zaborski.Nm nvlist_move ,
5758c86148SMariusz Zaborski.Nm nvlist_get ,
5858c86148SMariusz Zaborski.Nm nvlist_take
5958c86148SMariusz Zaborski.Nd "library for name/value pairs"
6058c86148SMariusz Zaborski.Sh LIBRARY
6158c86148SMariusz Zaborski.Lb libnv
6258c86148SMariusz Zaborski.Sh SYNOPSIS
63e98a6727SMark Johnston.In sys/nv.h
6458c86148SMariusz Zaborski.Ft "nvlist_t *"
6558c86148SMariusz Zaborski.Fn nvlist_create "int flags"
6658c86148SMariusz Zaborski.Ft void
6758c86148SMariusz Zaborski.Fn nvlist_destroy "nvlist_t *nvl"
6858c86148SMariusz Zaborski.Ft int
6958c86148SMariusz Zaborski.Fn nvlist_error "const nvlist_t *nvl"
7058c86148SMariusz Zaborski.Ft void
7198701874SChristian Brueffer.Fn nvlist_set_error "nvlist_t *nvl" "int error"
7258c86148SMariusz Zaborski.Ft bool
7358c86148SMariusz Zaborski.Fn nvlist_empty "const nvlist_t *nvl"
7458c86148SMariusz Zaborski.Ft int
7558c86148SMariusz Zaborski.Fn nvlist_flags "const nvlist_t *nvl"
76347a39b4SMariusz Zaborski.Ft bool
77347a39b4SMariusz Zaborski.Fn nvlist_in_array "const nvlist_t *nvl"
7858c86148SMariusz Zaborski.\"
7958c86148SMariusz Zaborski.Ft "nvlist_t *"
8058c86148SMariusz Zaborski.Fn nvlist_clone "const nvlist_t *nvl"
8158c86148SMariusz Zaborski.\"
8258c86148SMariusz Zaborski.Ft void
8398701874SChristian Brueffer.Fn nvlist_dump "const nvlist_t *nvl" "int fd"
8458c86148SMariusz Zaborski.Ft void
8598701874SChristian Brueffer.Fn nvlist_fdump "const nvlist_t *nvl" "FILE *fp"
8658c86148SMariusz Zaborski.\"
8758c86148SMariusz Zaborski.Ft size_t
8858c86148SMariusz Zaborski.Fn nvlist_size "const nvlist_t *nvl"
8958c86148SMariusz Zaborski.Ft "void *"
9058c86148SMariusz Zaborski.Fn nvlist_pack "const nvlist_t *nvl" "size_t *sizep"
9158c86148SMariusz Zaborski.Ft "nvlist_t *"
9258c86148SMariusz Zaborski.Fn nvlist_unpack "const void *buf" "size_t size" "int flags"
9358c86148SMariusz Zaborski.\"
9458c86148SMariusz Zaborski.Ft int
9558c86148SMariusz Zaborski.Fn nvlist_send "int sock" "const nvlist_t *nvl"
9658c86148SMariusz Zaborski.Ft "nvlist_t *"
9758c86148SMariusz Zaborski.Fn nvlist_recv "int sock" "int flags"
9858c86148SMariusz Zaborski.Ft "nvlist_t *"
9958c86148SMariusz Zaborski.Fn nvlist_xfer "int sock" "nvlist_t *nvl" "int flags"
10058c86148SMariusz Zaborski.\"
10158c86148SMariusz Zaborski.Ft "const char *"
10258c86148SMariusz Zaborski.Fn nvlist_next "const nvlist_t *nvl" "int *typep" "void **cookiep"
10358c86148SMariusz Zaborski.\"
10458c86148SMariusz Zaborski.Ft bool
10558c86148SMariusz Zaborski.Fn nvlist_exists "const nvlist_t *nvl" "const char *name"
10658c86148SMariusz Zaborski.Ft bool
10758c86148SMariusz Zaborski.Fn nvlist_exists_type "const nvlist_t *nvl" "const char *name" "int type"
10858c86148SMariusz Zaborski.Ft bool
10958c86148SMariusz Zaborski.Fn nvlist_exists_null "const nvlist_t *nvl" "const char *name"
11058c86148SMariusz Zaborski.Ft bool
11158c86148SMariusz Zaborski.Fn nvlist_exists_bool "const nvlist_t *nvl" "const char *name"
11258c86148SMariusz Zaborski.Ft bool
11358c86148SMariusz Zaborski.Fn nvlist_exists_number "const nvlist_t *nvl" "const char *name"
11458c86148SMariusz Zaborski.Ft bool
11558c86148SMariusz Zaborski.Fn nvlist_exists_string "const nvlist_t *nvl" "const char *name"
11658c86148SMariusz Zaborski.Ft bool
11758c86148SMariusz Zaborski.Fn nvlist_exists_nvlist "const nvlist_t *nvl" "const char *name"
11858c86148SMariusz Zaborski.Ft bool
11958c86148SMariusz Zaborski.Fn nvlist_exists_descriptor "const nvlist_t *nvl" "const char *name"
12058c86148SMariusz Zaborski.Ft bool
12158c86148SMariusz Zaborski.Fn nvlist_exists_binary "const nvlist_t *nvl" "const char *name"
122347a39b4SMariusz Zaborski.Ft bool
123347a39b4SMariusz Zaborski.Fn nvlist_exists_bool_array "const nvlist_t *nvl" "const char *name"
124347a39b4SMariusz Zaborski.Ft bool
125347a39b4SMariusz Zaborski.Fn nvlist_exists_number_array "const nvlist_t *nvl" "const char *name"
126347a39b4SMariusz Zaborski.Ft bool
127347a39b4SMariusz Zaborski.Fn nvlist_exists_string_array "const nvlist_t *nvl" "const char *name"
128347a39b4SMariusz Zaborski.Ft bool
129347a39b4SMariusz Zaborski.Fn nvlist_exists_nvlist_array "const nvlist_t *nvl" "const char *name"
130347a39b4SMariusz Zaborski.Ft bool
131347a39b4SMariusz Zaborski.Fn nvlist_exists_descriptor_array "const nvlist_t *nvl" "const char *name"
13258c86148SMariusz Zaborski.\"
13358c86148SMariusz Zaborski.Ft void
13458c86148SMariusz Zaborski.Fn nvlist_add_null "nvlist_t *nvl" "const char *name"
13558c86148SMariusz Zaborski.Ft void
13658c86148SMariusz Zaborski.Fn nvlist_add_bool "nvlist_t *nvl" "const char *name" "bool value"
13758c86148SMariusz Zaborski.Ft void
13858c86148SMariusz Zaborski.Fn nvlist_add_number "nvlist_t *nvl" "const char *name" "uint64_t value"
13958c86148SMariusz Zaborski.Ft void
14058c86148SMariusz Zaborski.Fn nvlist_add_string "nvlist_t *nvl" "const char *name" "const char *value"
14158c86148SMariusz Zaborski.Ft void
14258c86148SMariusz Zaborski.Fn nvlist_add_stringf "nvlist_t *nvl" "const char *name" "const char *valuefmt" "..."
14358c86148SMariusz Zaborski.Ft void
14458c86148SMariusz Zaborski.Fn nvlist_add_stringv "nvlist_t *nvl" "const char *name" "const char *valuefmt" "va_list valueap"
14558c86148SMariusz Zaborski.Ft void
14658c86148SMariusz Zaborski.Fn nvlist_add_nvlist "nvlist_t *nvl" "const char *name" "const nvlist_t *value"
14758c86148SMariusz Zaborski.Ft void
14858c86148SMariusz Zaborski.Fn nvlist_add_descriptor "nvlist_t *nvl" "const char *name" "int value"
14958c86148SMariusz Zaborski.Ft void
15058c86148SMariusz Zaborski.Fn nvlist_add_binary "nvlist_t *nvl" "const char *name" "const void *value" "size_t size"
151347a39b4SMariusz Zaborski.Ft void
152347a39b4SMariusz Zaborski.Fn nvlist_add_bool_array "nvlist_t *nvl" "const char *name" "const bool *value" "size_t nitems"
153347a39b4SMariusz Zaborski.
154347a39b4SMariusz Zaborski.Ft void
155347a39b4SMariusz Zaborski.Fn nvlist_add_number_array "nvlist_t *nvl" "const char *name" "const uint64_t *value" "size_t nitems"
156347a39b4SMariusz Zaborski.
157347a39b4SMariusz Zaborski.Ft void
158347a39b4SMariusz Zaborski.Fn nvlist_add_string_array "nvlist_t *nvl" "const char *name" "const char * const * value" "size_t nitems"
159347a39b4SMariusz Zaborski.
160347a39b4SMariusz Zaborski.Ft void
161347a39b4SMariusz Zaborski.Fn nvlist_add_nvlist_array "nvlist_t *nvl" "const char *name" "const nvlist_t * const * value" "size_t nitems"
162347a39b4SMariusz Zaborski.
163347a39b4SMariusz Zaborski.Ft void
164347a39b4SMariusz Zaborski.Fn nvlist_add_descriptor_array "nvlist_t *nvl" "const char *name" "const int *value" "size_t nitems"
16558c86148SMariusz Zaborski.\"
16658c86148SMariusz Zaborski.Ft void
16758c86148SMariusz Zaborski.Fn nvlist_move_string "nvlist_t *nvl" "const char *name" "char *value"
16858c86148SMariusz Zaborski.Ft void
16958c86148SMariusz Zaborski.Fn nvlist_move_nvlist "nvlist_t *nvl" "const char *name" "nvlist_t *value"
17058c86148SMariusz Zaborski.Ft void
17158c86148SMariusz Zaborski.Fn nvlist_move_descriptor "nvlist_t *nvl" "const char *name" "int value"
17258c86148SMariusz Zaborski.Ft void
17358c86148SMariusz Zaborski.Fn nvlist_move_binary "nvlist_t *nvl" "const char *name" "void *value" "size_t size"
174347a39b4SMariusz Zaborski.Ft void
175347a39b4SMariusz Zaborski.Fn nvlist_move_bool_array "nvlist_t *nvl" "const char *name" "bool *value" "size_t nitems"
176347a39b4SMariusz Zaborski.
177347a39b4SMariusz Zaborski.Ft void
178347a39b4SMariusz Zaborski.Fn nvlist_move_number_array "nvlist_t *nvl" "const char *name" "uint64_t *value" "size_t nitems"
179347a39b4SMariusz Zaborski.
180347a39b4SMariusz Zaborski.Ft void
181347a39b4SMariusz Zaborski.Fn nvlist_move_string_array "nvlist_t *nvl" "const char *name" "char **value" "size_t nitems"
182347a39b4SMariusz Zaborski.
183347a39b4SMariusz Zaborski.Ft void
184347a39b4SMariusz Zaborski.Fn nvlist_move_nvlist_array "nvlist_t *nvl" "const char *name" "nvlist_t **value" "size_t nitems"
185347a39b4SMariusz Zaborski.
186347a39b4SMariusz Zaborski.Ft void
187347a39b4SMariusz Zaborski.Fn nvlist_move_descriptor_array "nvlist_t *nvl" "const char *name" "int *value" "size_t nitems"
18858c86148SMariusz Zaborski.\"
18958c86148SMariusz Zaborski.Ft bool
19058c86148SMariusz Zaborski.Fn nvlist_get_bool "const nvlist_t *nvl" "const char *name"
19158c86148SMariusz Zaborski.Ft uint64_t
19258c86148SMariusz Zaborski.Fn nvlist_get_number "const nvlist_t *nvl" "const char *name"
19358c86148SMariusz Zaborski.Ft "const char *"
19458c86148SMariusz Zaborski.Fn nvlist_get_string "const nvlist_t *nvl" "const char *name"
19558c86148SMariusz Zaborski.Ft "const nvlist_t *"
19658c86148SMariusz Zaborski.Fn nvlist_get_nvlist "const nvlist_t *nvl" "const char *name"
19758c86148SMariusz Zaborski.Ft int
19858c86148SMariusz Zaborski.Fn nvlist_get_descriptor "const nvlist_t *nvl" "const char *name"
19958c86148SMariusz Zaborski.Ft "const void *"
20058c86148SMariusz Zaborski.Fn nvlist_get_binary "const nvlist_t *nvl" "const char *name" "size_t *sizep"
201347a39b4SMariusz Zaborski.Ft "const bool *"
202347a39b4SMariusz Zaborski.Fn nvlist_get_bool_array "const nvlist_t *nvl" "const char *name" "size_t *nitems"
203347a39b4SMariusz Zaborski.Ft "const uint64_t *"
204*a1b5ae33SMariusz Zaborski.Fn nvlist_get_number_array "const nvlist_t *nvl" "const char *name" "size_t *nitems"
205347a39b4SMariusz Zaborski.Ft "const char * const *"
206*a1b5ae33SMariusz Zaborski.Fn nvlist_get_string_array "const nvlist_t *nvl" "const char *name" "size_t *nitems"
207347a39b4SMariusz Zaborski.Ft "const nvlist_t * const *"
208*a1b5ae33SMariusz Zaborski.Fn nvlist_get_nvlist_array "const nvlist_t *nvl" "const char *name" "size_t *nitems"
209347a39b4SMariusz Zaborski.Ft "const int *"
210347a39b4SMariusz Zaborski.Fn nvlist_get_descriptor_array "const nvlist_t *nvl" "const char *name" "size_t *nitems"
21158c86148SMariusz Zaborski.Ft "const nvlist_t *"
21258c86148SMariusz Zaborski.Fn nvlist_get_parent "const nvlist_t *nvl" "void **cookiep"
213347a39b4SMariusz Zaborski.Ft "const nvlist_t *"
214347a39b4SMariusz Zaborski.Fn nvlist_get_array_next "const nvlist_t *nvl"
215347a39b4SMariusz Zaborski.Ft "const nvlist_t *"
216347a39b4SMariusz Zaborski.Fn nvlist_get_pararr "const nvlist_t *nvl" "void **cookiep"
21758c86148SMariusz Zaborski.\"
21858c86148SMariusz Zaborski.Ft bool
21958c86148SMariusz Zaborski.Fn nvlist_take_bool "nvlist_t *nvl" "const char *name"
22058c86148SMariusz Zaborski.Ft uint64_t
22158c86148SMariusz Zaborski.Fn nvlist_take_number "nvlist_t *nvl" "const char *name"
22258c86148SMariusz Zaborski.Ft "char *"
22358c86148SMariusz Zaborski.Fn nvlist_take_string "nvlist_t *nvl" "const char *name"
22458c86148SMariusz Zaborski.Ft "nvlist_t *"
22558c86148SMariusz Zaborski.Fn nvlist_take_nvlist "nvlist_t *nvl" "const char *name"
22658c86148SMariusz Zaborski.Ft int
22758c86148SMariusz Zaborski.Fn nvlist_take_descriptor "nvlist_t *nvl" "const char *name"
22858c86148SMariusz Zaborski.Ft "void *"
22958c86148SMariusz Zaborski.Fn nvlist_take_binary "nvlist_t *nvl" "const char *name" "size_t *sizep"
230347a39b4SMariusz Zaborski.Ft "bool *"
231347a39b4SMariusz Zaborski.Fn nvlist_take_bool_array "nvlist_t *nvl" "const char *name" "size_t *nitems"
232347a39b4SMariusz Zaborski.Ft "uint64_t **"
233*a1b5ae33SMariusz Zaborski.Fn nvlist_take_number_array "nvlist_t *nvl" "const char *name" "size_t *nitems"
234347a39b4SMariusz Zaborski.Ft "char **"
235*a1b5ae33SMariusz Zaborski.Fn nvlist_take_string_array "nvlist_t *nvl" "const char *name" "size_t *nitems"
236347a39b4SMariusz Zaborski.Ft "nvlist_t **"
237*a1b5ae33SMariusz Zaborski.Fn nvlist_take_nvlist_array "nvlist_t *nvl" "const char *name" "size_t *nitems"
238347a39b4SMariusz Zaborski.Ft "int *"
239*a1b5ae33SMariusz Zaborski.Fn nvlist_take_descriptor_array "nvlist_t *nvl" "const char *name" "size_t *nitems"
24058c86148SMariusz Zaborski.\"
24158c86148SMariusz Zaborski.Ft void
24258c86148SMariusz Zaborski.Fn nvlist_free "nvlist_t *nvl" "const char *name"
24358c86148SMariusz Zaborski.Ft void
24458c86148SMariusz Zaborski.Fn nvlist_free_type "nvlist_t *nvl" "const char *name" "int type"
24558c86148SMariusz Zaborski.\"
24658c86148SMariusz Zaborski.Ft void
24758c86148SMariusz Zaborski.Fn nvlist_free_null "nvlist_t *nvl" "const char *name"
24858c86148SMariusz Zaborski.Ft void
24958c86148SMariusz Zaborski.Fn nvlist_free_bool "nvlist_t *nvl" "const char *name"
25058c86148SMariusz Zaborski.Ft void
25158c86148SMariusz Zaborski.Fn nvlist_free_number "nvlist_t *nvl" "const char *name"
25258c86148SMariusz Zaborski.Ft void
25358c86148SMariusz Zaborski.Fn nvlist_free_string "nvlist_t *nvl" "const char *name"
25458c86148SMariusz Zaborski.Ft void
25558c86148SMariusz Zaborski.Fn nvlist_free_nvlist "nvlist_t *nvl" "const char *name"
25658c86148SMariusz Zaborski.Ft void
25758c86148SMariusz Zaborski.Fn nvlist_free_descriptor "nvlist_t *nvl" "const char *name"
25858c86148SMariusz Zaborski.Ft void
25958c86148SMariusz Zaborski.Fn nvlist_free_binary "nvlist_t *nvl" "const char *name"
260347a39b4SMariusz Zaborski.Ft void
261347a39b4SMariusz Zaborski.Fn nvlist_free_bool_array "nvlist_t *nvl" "const char *name"
262347a39b4SMariusz Zaborski.Ft void
263347a39b4SMariusz Zaborski.Fn nvlist_free_number_array "nvlist_t *nvl" "const char *name"
264347a39b4SMariusz Zaborski.Ft void
265347a39b4SMariusz Zaborski.Fn nvlist_free_string_array "nvlist_t *nvl" "const char *name"
266347a39b4SMariusz Zaborski.Ft void
267347a39b4SMariusz Zaborski.Fn nvlist_free_nvlist_array "nvlist_t *nvl" "const char *name"
268347a39b4SMariusz Zaborski.Ft void
269347a39b4SMariusz Zaborski.Fn nvlist_free_descriptor_array "nvlist_t *nvl" "const char *name"
27058c86148SMariusz Zaborski.Sh DESCRIPTION
27158c86148SMariusz ZaborskiThe
27258c86148SMariusz Zaborski.Nm libnv
27358c86148SMariusz Zaborskilibrary allows to easily manage name value pairs as well as send and receive
27458c86148SMariusz Zaborskithem over sockets.
27558c86148SMariusz ZaborskiA group (list) of name value pairs is called an
27658c86148SMariusz Zaborski.Nm nvlist .
27758c86148SMariusz ZaborskiThe API supports the following data types:
27858c86148SMariusz Zaborski.Bl -ohang -offset indent
27958c86148SMariusz Zaborski.It Sy null ( NV_TYPE_NULL )
28058c86148SMariusz ZaborskiThere is no data associated with the name.
28158c86148SMariusz Zaborski.It Sy bool ( NV_TYPE_BOOL )
28258c86148SMariusz ZaborskiThe value can be either
28358c86148SMariusz Zaborski.Dv true
28458c86148SMariusz Zaborskior
28558c86148SMariusz Zaborski.Dv false .
28658c86148SMariusz Zaborski.It Sy number ( NV_TYPE_NUMBER )
28758c86148SMariusz ZaborskiThe value is a number stored as
28858c86148SMariusz Zaborski.Vt uint64_t .
28958c86148SMariusz Zaborski.It Sy string ( NV_TYPE_STRING )
29058c86148SMariusz ZaborskiThe value is a C string.
29158c86148SMariusz Zaborski.It Sy nvlist ( NV_TYPE_NVLIST )
29258c86148SMariusz ZaborskiThe value is a nested nvlist.
29358c86148SMariusz Zaborski.It Sy descriptor ( NV_TYPE_DESCRIPTOR )
29458c86148SMariusz ZaborskiThe value is a file descriptor.
29558c86148SMariusz ZaborskiNote that file descriptors can be sent only over
29658c86148SMariusz Zaborski.Xr unix 4
29758c86148SMariusz Zaborskidomain sockets.
29858c86148SMariusz Zaborski.It Sy binary ( NV_TYPE_BINARY )
29958c86148SMariusz ZaborskiThe value is a binary buffer.
300347a39b4SMariusz Zaborski.It Sy bool array ( NV_TYPE_BOOL_ARRAY )
301347a39b4SMariusz ZaborskiThe value is an array of boolean values.
302347a39b4SMariusz Zaborski.It Sy number array ( NV_TYPE_NUMBER_ARRAY )
303347a39b4SMariusz ZaborskiThe value is an array of numbers, each stored as
304347a39b4SMariusz Zaborski.Vt uint64_t .
305347a39b4SMariusz Zaborski.It Sy string array ( NV_TYPE_STRING_ARRAY )
306347a39b4SMariusz ZaborskiThe value is an array of C strings.
307347a39b4SMariusz Zaborski.It Sy nvlist array  ( NV_TYPE_NVLIST_ARRAY )
308347a39b4SMariusz ZaborskiThe value is an array of nvlists.
309347a39b4SMariusz ZaborskiWhen an nvlist is added to an array, it becomes part of the primary nvlist.
310347a39b4SMariusz ZaborskiTraversing these arrays can be done using the
311347a39b4SMariusz Zaborski.Fn nvlist_get_array_next
312347a39b4SMariusz Zaborskiand
313347a39b4SMariusz Zaborski.Fn nvlist_get_pararr
314347a39b4SMariusz Zaborskifunctions.
315347a39b4SMariusz Zaborski.It Sy descriptor array ( NV_TYPE_DESCRIPTOR_ARRAY )
316347a39b4SMariusz ZaborskiThe value is an array of files descriptors.
31758c86148SMariusz Zaborski.El
31858c86148SMariusz Zaborski.Pp
31958c86148SMariusz ZaborskiThe
32058c86148SMariusz Zaborski.Fn nvlist_create
32158c86148SMariusz Zaborskifunction allocates memory and initializes an nvlist.
32258c86148SMariusz Zaborski.Pp
32358c86148SMariusz ZaborskiThe following flag can be provided:
32458c86148SMariusz Zaborski.Pp
32558c86148SMariusz Zaborski.Bl -tag -width "NV_FLAG_IGNORE_CASE" -compact -offset indent
32658c86148SMariusz Zaborski.It Dv NV_FLAG_IGNORE_CASE
32758c86148SMariusz ZaborskiPerform case-insensitive lookups of provided names.
32858c86148SMariusz Zaborski.It Dv NV_FLAG_NO_UNIQUE
32958c86148SMariusz ZaborskiNames in the nvlist do not have to be unique.
33058c86148SMariusz Zaborski.El
33158c86148SMariusz Zaborski.Pp
33258c86148SMariusz ZaborskiThe
33358c86148SMariusz Zaborski.Fn nvlist_destroy
33458c86148SMariusz Zaborskifunction destroys the given nvlist.
33558c86148SMariusz ZaborskiFunction does nothing if
33658c86148SMariusz Zaborski.Dv NULL
33758c86148SMariusz Zaborskinvlist is provided.
33858c86148SMariusz ZaborskiFunction never modifies the
33958c86148SMariusz Zaborski.Va errno
34058c86148SMariusz Zaborskiglobal variable.
34158c86148SMariusz Zaborski.Pp
34258c86148SMariusz ZaborskiThe
34358c86148SMariusz Zaborski.Fn nvlist_error
34458c86148SMariusz Zaborskifunction returns any error value that the nvlist accumulated.
34558c86148SMariusz ZaborskiIf the given nvlist is
34658c86148SMariusz Zaborski.Dv NULL
34758c86148SMariusz Zaborskithe
34858c86148SMariusz Zaborski.Er ENOMEM
34958c86148SMariusz Zaborskierror will be returned.
35058c86148SMariusz Zaborski.Pp
35158c86148SMariusz ZaborskiThe
35258c86148SMariusz Zaborski.Fn nvlist_set_error
35358c86148SMariusz Zaborskifunction sets an nvlist to be in the error state.
35458c86148SMariusz ZaborskiSubsequent calls to
35558c86148SMariusz Zaborski.Fn nvlist_error
35658c86148SMariusz Zaborskiwill return the given error value.
35758c86148SMariusz ZaborskiThis function cannot be used to clear the error state from an nvlist.
35858c86148SMariusz ZaborskiThis function does nothing if the nvlist is already in the error state.
35958c86148SMariusz Zaborski.Pp
36058c86148SMariusz ZaborskiThe
36158c86148SMariusz Zaborski.Fn nvlist_empty
36258c86148SMariusz Zaborskifunction returns
36358c86148SMariusz Zaborski.Dv true
36458c86148SMariusz Zaborskiif the given nvlist is empty and
36558c86148SMariusz Zaborski.Dv false
36658c86148SMariusz Zaborskiotherwise.
36758c86148SMariusz ZaborskiThe nvlist must not be in error state.
36858c86148SMariusz Zaborski.Pp
36958c86148SMariusz ZaborskiThe
37058c86148SMariusz Zaborski.Fn nvlist_flags
37158c86148SMariusz Zaborskifunction returns flags used to create the nvlist with the
37258c86148SMariusz Zaborski.Fn nvlist_create
37358c86148SMariusz Zaborskifunction.
37458c86148SMariusz Zaborski.Pp
37558c86148SMariusz ZaborskiThe
376347a39b4SMariusz Zaborski.Fn nvlist_in_array
377347a39b4SMariusz Zaborskifunction returns
378347a39b4SMariusz Zaborski.Dv true
379347a39b4SMariusz Zaborskiif
380347a39b4SMariusz Zaborski.Fa nvl
381347a39b4SMariusz Zaborskiis part of an array that is a member of another nvlist.
382347a39b4SMariusz Zaborski.Pp
383347a39b4SMariusz ZaborskiThe
38458c86148SMariusz Zaborski.Fn nvlist_clone
38558c86148SMariusz Zaborskifunctions clones the given nvlist.
38658c86148SMariusz ZaborskiThe clone shares no resources with its origin.
38758c86148SMariusz ZaborskiThis also means that all file descriptors that are part of the nvlist will be
38858c86148SMariusz Zaborskiduplicated with the
38958c86148SMariusz Zaborski.Xr dup 2
39058c86148SMariusz Zaborskisystem call before placing them in the clone.
39158c86148SMariusz Zaborski.Pp
39258c86148SMariusz ZaborskiThe
39358c86148SMariusz Zaborski.Fn nvlist_dump
39458c86148SMariusz Zaborskidumps nvlist content for debugging purposes to the given file descriptor
39558c86148SMariusz Zaborski.Fa fd .
39658c86148SMariusz Zaborski.Pp
39758c86148SMariusz ZaborskiThe
39858c86148SMariusz Zaborski.Fn nvlist_fdump
39958c86148SMariusz Zaborskidumps nvlist content for debugging purposes to the given file stream
40058c86148SMariusz Zaborski.Fa fp .
40158c86148SMariusz Zaborski.Pp
40258c86148SMariusz ZaborskiThe
40358c86148SMariusz Zaborski.Fn nvlist_size
40458c86148SMariusz Zaborskifunction returns the size of the given nvlist after converting it to binary
40558c86148SMariusz Zaborskibuffer with the
40658c86148SMariusz Zaborski.Fn nvlist_pack
40758c86148SMariusz Zaborskifunction.
40858c86148SMariusz Zaborski.Pp
40958c86148SMariusz ZaborskiThe
41058c86148SMariusz Zaborski.Fn nvlist_pack
41158c86148SMariusz Zaborskifunction converts the given nvlist to a binary buffer.
41258c86148SMariusz ZaborskiThe function allocates memory for the buffer, which should be freed with the
41358c86148SMariusz Zaborski.Xr free 3
41458c86148SMariusz Zaborskifunction.
41558c86148SMariusz ZaborskiIf the
41658c86148SMariusz Zaborski.Fa sizep
41758c86148SMariusz Zaborskiargument is not
41858c86148SMariusz Zaborski.Dv NULL ,
41958c86148SMariusz Zaborskithe size of the buffer will be stored there.
42058c86148SMariusz ZaborskiThe function returns
42158c86148SMariusz Zaborski.Dv NULL
42258c86148SMariusz Zaborskiin case of an error (allocation failure).
42358c86148SMariusz ZaborskiIf the nvlist contains any file descriptors
42458c86148SMariusz Zaborski.Dv NULL
42558c86148SMariusz Zaborskiwill be returned.
42658c86148SMariusz ZaborskiThe nvlist must not be in error state.
42758c86148SMariusz Zaborski.Pp
42858c86148SMariusz ZaborskiThe
42958c86148SMariusz Zaborski.Fn nvlist_unpack
43058c86148SMariusz Zaborskifunction converts the given buffer to the nvlist.
43158c86148SMariusz ZaborskiThe
43258c86148SMariusz Zaborski.Fa flags
43358c86148SMariusz Zaborskiargument defines what type of the top level nvlist is expected to be.
43458c86148SMariusz ZaborskiFlags are set up using the
43558c86148SMariusz Zaborski.Fn nvlist_create
43658c86148SMariusz Zaborskifunction.
43758c86148SMariusz ZaborskiIf the nvlist flags do not match the flags passed to
43858c86148SMariusz Zaborski.Fn nvlist_unpack ,
43958c86148SMariusz Zaborskithe nvlist will not be returned.
44058c86148SMariusz ZaborskiEvery nested nvlist list should be checked using
44158c86148SMariusz Zaborski.Fn nvlist_flags
44258c86148SMariusz Zaborskifunction.
44358c86148SMariusz ZaborskiThe function returns
44458c86148SMariusz Zaborski.Dv NULL
44558c86148SMariusz Zaborskiin case of an error.
44658c86148SMariusz Zaborski.Pp
44758c86148SMariusz ZaborskiThe
44858c86148SMariusz Zaborski.Fn nvlist_send
44958c86148SMariusz Zaborskifunction sends the given nvlist over the socket given by the
45058c86148SMariusz Zaborski.Fa sock
45158c86148SMariusz Zaborskiargument.
45258c86148SMariusz ZaborskiNote that nvlist that contains file descriptors can only be send over
45358c86148SMariusz Zaborski.Xr unix 4
45458c86148SMariusz Zaborskidomain sockets.
45558c86148SMariusz Zaborski.Pp
45658c86148SMariusz ZaborskiThe
45758c86148SMariusz Zaborski.Fn nvlist_recv
45858c86148SMariusz Zaborskifunction receives nvlist over the socket given by the
45958c86148SMariusz Zaborski.Fa sock
46058c86148SMariusz Zaborskiargument.
46158c86148SMariusz ZaborskiThe
46258c86148SMariusz Zaborski.Fa flags
46358c86148SMariusz Zaborskiargument defines what type of the top level nvlist is expected to be.
46458c86148SMariusz ZaborskiFlags are set up using the
46558c86148SMariusz Zaborski.Fn nvlist_create
46658c86148SMariusz Zaborskifunction.
46758c86148SMariusz ZaborskiIf the nvlist flags do not match the flags passed to
46858c86148SMariusz Zaborski.Fn nvlist_recv ,
46958c86148SMariusz Zaborskithe nvlist will not be returned.
47058c86148SMariusz ZaborskiEvery nested nvlist list should be checked using
47158c86148SMariusz Zaborski.Fn nvlist_flags
47258c86148SMariusz Zaborskifunction.
47358c86148SMariusz Zaborski.Pp
47458c86148SMariusz ZaborskiThe
47558c86148SMariusz Zaborski.Fn nvlist_xfer
47658c86148SMariusz Zaborskifunction sends the given nvlist over the socket given by the
47758c86148SMariusz Zaborski.Fa sock
47858c86148SMariusz Zaborskiargument and receives nvlist over the same socket.
47958c86148SMariusz ZaborskiThe
48058c86148SMariusz Zaborski.Fa flags
48158c86148SMariusz Zaborskiargument defines what type of the top level nvlist is expected to be.
48258c86148SMariusz ZaborskiFlags are set up using the
48358c86148SMariusz Zaborski.Fn nvlist_create
48458c86148SMariusz Zaborskifunction.
48558c86148SMariusz ZaborskiIf the nvlist flags do not match the flags passed to
48658c86148SMariusz Zaborski.Fn nvlist_xfer ,
48758c86148SMariusz Zaborskithe nvlist will not be returned.
48858c86148SMariusz ZaborskiEvery nested nvlist list should be checked using
48958c86148SMariusz Zaborski.Fn nvlist_flags
49058c86148SMariusz Zaborskifunction.
49158c86148SMariusz ZaborskiThe given nvlist is always destroyed.
49258c86148SMariusz Zaborski.Pp
49358c86148SMariusz ZaborskiThe
49458c86148SMariusz Zaborski.Fn nvlist_next
49558c86148SMariusz Zaborskifunction iterates over the given nvlist returning names and types of subsequent
49658c86148SMariusz Zaborskielements.
49758c86148SMariusz ZaborskiThe
49858c86148SMariusz Zaborski.Fa cookiep
49958c86148SMariusz Zaborskiargument allows the function to figure out which element should be returned
50058c86148SMariusz Zaborskinext.
50158c86148SMariusz ZaborskiThe
50258c86148SMariusz Zaborski.Va *cookiep
50358c86148SMariusz Zaborskishould be set to
50458c86148SMariusz Zaborski.Dv NULL
50558c86148SMariusz Zaborskifor the first call and should not be changed later.
50658c86148SMariusz ZaborskiReturning
50758c86148SMariusz Zaborski.Dv NULL
50858c86148SMariusz Zaborskimeans there are no more elements on the nvlist.
50958c86148SMariusz ZaborskiThe
51058c86148SMariusz Zaborski.Fa typep
51158c86148SMariusz Zaborskiargument can be NULL.
51258c86148SMariusz ZaborskiElements may not be removed from the nvlist while traversing it.
51358c86148SMariusz ZaborskiThe nvlist must not be in error state.
51489ca10c6SMariusz ZaborskiNote that
51589ca10c6SMariusz Zaborski.Fn nvlist_next
51689ca10c6SMariusz Zaborskiwill handle
51789ca10c6SMariusz Zaborski.Va cookiep
51889ca10c6SMariusz Zaborskibeing set to
51989ca10c6SMariusz Zaborski.Dv NULL .
52089ca10c6SMariusz ZaborskiIn this case first element is returned or
52189ca10c6SMariusz Zaborski.Dv NULL
52289ca10c6SMariusz Zaborskiif nvlist is empty.
52389ca10c6SMariusz ZaborskiThis behavior simplifies removing the first element from the list.
52458c86148SMariusz Zaborski.Pp
52558c86148SMariusz ZaborskiThe
52658c86148SMariusz Zaborski.Fn nvlist_exists
52758c86148SMariusz Zaborskifunction returns
52858c86148SMariusz Zaborski.Dv true
52958c86148SMariusz Zaborskiif element of the given name exists (besides of its type) or
53058c86148SMariusz Zaborski.Dv false
53158c86148SMariusz Zaborskiotherwise.
53258c86148SMariusz ZaborskiThe nvlist must not be in error state.
53358c86148SMariusz Zaborski.Pp
53458c86148SMariusz ZaborskiThe
53558c86148SMariusz Zaborski.Fn nvlist_exists_type
53658c86148SMariusz Zaborskifunction returns
53758c86148SMariusz Zaborski.Dv true
53858c86148SMariusz Zaborskiif element of the given name and the given type exists or
53958c86148SMariusz Zaborski.Dv false
54058c86148SMariusz Zaborskiotherwise.
54158c86148SMariusz ZaborskiThe nvlist must not be in error state.
54258c86148SMariusz Zaborski.Pp
54358c86148SMariusz ZaborskiThe
54458c86148SMariusz Zaborski.Fn nvlist_exists_null ,
54558c86148SMariusz Zaborski.Fn nvlist_exists_bool ,
54658c86148SMariusz Zaborski.Fn nvlist_exists_number ,
54758c86148SMariusz Zaborski.Fn nvlist_exists_string ,
54858c86148SMariusz Zaborski.Fn nvlist_exists_nvlist ,
54958c86148SMariusz Zaborski.Fn nvlist_exists_descriptor ,
550347a39b4SMariusz Zaborski.Fn nvlist_exists_binary ,
551347a39b4SMariusz Zaborski.Fn nvlist_exists_bool_array ,
552347a39b4SMariusz Zaborski.Fn nvlist_exists_number_array ,
553347a39b4SMariusz Zaborski.Fn nvlist_exists_string_array ,
554347a39b4SMariusz Zaborski.Fn nvlist_exists_nvlist_array ,
555347a39b4SMariusz Zaborski.Fn nvlist_exists_descriptor_array
55658c86148SMariusz Zaborskifunctions return
55758c86148SMariusz Zaborski.Dv true
55858c86148SMariusz Zaborskiif element of the given name and the given type determined by the function name
55958c86148SMariusz Zaborskiexists or
56058c86148SMariusz Zaborski.Dv false
56158c86148SMariusz Zaborskiotherwise.
56258c86148SMariusz ZaborskiThe nvlist must not be in error state.
56358c86148SMariusz Zaborski.Pp
56458c86148SMariusz ZaborskiThe
56558c86148SMariusz Zaborski.Fn nvlist_add_null ,
56658c86148SMariusz Zaborski.Fn nvlist_add_bool ,
56758c86148SMariusz Zaborski.Fn nvlist_add_number ,
56858c86148SMariusz Zaborski.Fn nvlist_add_string ,
56958c86148SMariusz Zaborski.Fn nvlist_add_stringf ,
57058c86148SMariusz Zaborski.Fn nvlist_add_stringv ,
57158c86148SMariusz Zaborski.Fn nvlist_add_nvlist ,
57258c86148SMariusz Zaborski.Fn nvlist_add_descriptor ,
573347a39b4SMariusz Zaborski.Fn nvlist_add_binary ,
574347a39b4SMariusz Zaborski.Fn nvlist_add_bool_array ,
575347a39b4SMariusz Zaborski.Fn nvlist_add_number_array ,
576347a39b4SMariusz Zaborski.Fn nvlist_add_string_array ,
577347a39b4SMariusz Zaborski.Fn nvlist_add_nvlist_array ,
578347a39b4SMariusz Zaborski.Fn nvlist_add_descriptor_array
57958c86148SMariusz Zaborskifunctions add element to the given nvlist.
58058c86148SMariusz ZaborskiWhen adding string or binary buffor the functions will allocate memory
58158c86148SMariusz Zaborskiand copy the data over.
58258c86148SMariusz ZaborskiWhen adding nvlist, the nvlist will be cloned and clone will be added.
58358c86148SMariusz ZaborskiWhen adding descriptor, the descriptor will be duplicated using the
58458c86148SMariusz Zaborski.Xr dup 2
58558c86148SMariusz Zaborskisystem call and the new descriptor will be added.
586347a39b4SMariusz ZaborskiThe array functions will fail if there are any
587347a39b4SMariusz Zaborski.Dv NULL
588347a39b4SMariusz Zaborskielements in the array, or if the array pointer is
589347a39b4SMariusz Zaborski.Dv NULL .
59058c86148SMariusz ZaborskiIf an error occurs while adding new element, internal error is set which can be
59158c86148SMariusz Zaborskiexamined using the
59258c86148SMariusz Zaborski.Fn nvlist_error
59358c86148SMariusz Zaborskifunction.
59458c86148SMariusz Zaborski.Pp
59558c86148SMariusz ZaborskiThe
59658c86148SMariusz Zaborski.Fn nvlist_move_string ,
59758c86148SMariusz Zaborski.Fn nvlist_move_nvlist ,
59858c86148SMariusz Zaborski.Fn nvlist_move_descriptor ,
599347a39b4SMariusz Zaborski.Fn nvlist_move_binary ,
600347a39b4SMariusz Zaborski.Fn nvlist_move_bool_array ,
601347a39b4SMariusz Zaborski.Fn nvlist_move_number_array ,
602347a39b4SMariusz Zaborski.Fn nvlist_move_string_array ,
603347a39b4SMariusz Zaborski.Fn nvlist_move_nvlist_array ,
604347a39b4SMariusz Zaborski.Fn nvlist_move_descriptor_array
60558c86148SMariusz Zaborskifunctions add new element to the given nvlist, but unlike
60658c86148SMariusz Zaborski.Fn nvlist_add_<type>
60758c86148SMariusz Zaborskifunctions they will consume the given resource.
608347a39b4SMariusz ZaborskiIn the case of strings, descriptors, or nvlists every elements must be
609347a39b4SMariusz Zaborskiunique, or it could cause a double free.
610347a39b4SMariusz ZaborskiThe array functions will fail if there are any
611347a39b4SMariusz Zaborski.Dv NULL
612347a39b4SMariusz Zaborskielements, or if the array pointer is
613347a39b4SMariusz Zaborski.Dv NULL .
61458c86148SMariusz ZaborskiIf an error occurs while adding new element, the resource is destroyed and
61558c86148SMariusz Zaborskiinternal error is set which can be examined using the
61658c86148SMariusz Zaborski.Fn nvlist_error
61758c86148SMariusz Zaborskifunction.
61858c86148SMariusz Zaborski.Pp
61958c86148SMariusz ZaborskiThe
62058c86148SMariusz Zaborski.Fn nvlist_get_bool ,
62158c86148SMariusz Zaborski.Fn nvlist_get_number ,
62258c86148SMariusz Zaborski.Fn nvlist_get_string ,
62358c86148SMariusz Zaborski.Fn nvlist_get_nvlist ,
62458c86148SMariusz Zaborski.Fn nvlist_get_descriptor ,
625347a39b4SMariusz Zaborski.Fn nvlist_get_binary ,
626347a39b4SMariusz Zaborski.Fn nvlist_get_bool_array ,
627347a39b4SMariusz Zaborski.Fn nvlist_get_number_array ,
628347a39b4SMariusz Zaborski.Fn nvlist_get_string_array ,
629347a39b4SMariusz Zaborski.Fn nvlist_get_nvlist_array ,
630347a39b4SMariusz Zaborski.Fn nvlist_get_descriptor_array
631347a39b4SMariusz Zaborskifunctions return the value that corresponds to the given key name.
632347a39b4SMariusz ZaborskiIn the case of strings, nvlists, descriptors, binary, or arrays, the returned
633347a39b4SMariusz Zaborskiresource should not be modified - they still belong to the nvlist.
634347a39b4SMariusz ZaborskiIf an element of the given name does not exist, the program will be aborted.
635347a39b4SMariusz ZaborskiTo avoid this, the caller should check for the existence of the name before
636347a39b4SMariusz Zaborskitrying to obtain the value, or use the
63758c86148SMariusz Zaborski.Xr dnvlist 3
638347a39b4SMariusz Zaborskiextension, which can provide a default value in the case of a missing element.
63958c86148SMariusz ZaborskiThe nvlist must not be in error state.
64058c86148SMariusz Zaborski.Pp
64158c86148SMariusz ZaborskiThe
64258c86148SMariusz Zaborski.Fn nvlist_get_parent
643347a39b4SMariusz Zaborskifunction returns the parent nvlist of the nested nvlist.
644347a39b4SMariusz Zaborski.Pp
645347a39b4SMariusz ZaborskiThe
646347a39b4SMariusz Zaborski.Fn nvlist_get_array_next
647347a39b4SMariusz Zaborskifunction returns the next element from the array or
648347a39b4SMariusz Zaborski.Dv NULL
649347a39b4SMariusz Zaborskiif the nvlist is not in array or it is the last element.
650347a39b4SMariusz ZaborskiNote that
651347a39b4SMariusz Zaborski.Fn nvlist_get_array_next
652347a39b4SMariusz Zaborskionly works if you added the nvlist array using the
653347a39b4SMariusz Zaborski.Fn nvlist_move_nvlist_array
654347a39b4SMariusz Zaborskior
655347a39b4SMariusz Zaborski.Fn nvlist_add_nvlist_array
656347a39b4SMariusz Zaborskifunctions.
657347a39b4SMariusz Zaborski.Pp
658347a39b4SMariusz ZaborskiThe
659347a39b4SMariusz Zaborski.Fn nvlist_get_pararr
660347a39b4SMariusz Zaborskifunction returns the next element in the array, or if not available
661347a39b4SMariusz Zaborskithe parent of the nested nvlist.
66258c86148SMariusz Zaborski.Pp
66358c86148SMariusz ZaborskiThe
66458c86148SMariusz Zaborski.Fn nvlist_take_bool ,
66558c86148SMariusz Zaborski.Fn nvlist_take_number ,
66658c86148SMariusz Zaborski.Fn nvlist_take_string ,
66758c86148SMariusz Zaborski.Fn nvlist_take_nvlist ,
66858c86148SMariusz Zaborski.Fn nvlist_take_descriptor ,
669347a39b4SMariusz Zaborski.Fn nvlist_take_binary ,
670347a39b4SMariusz Zaborski.Fn nvlist_take_bool_array ,
671347a39b4SMariusz Zaborski.Fn nvlist_take_number_array ,
672347a39b4SMariusz Zaborski.Fn nvlist_take_string_array ,
673347a39b4SMariusz Zaborski.Fn nvlist_take_nvlist_array ,
674347a39b4SMariusz Zaborski.Fn nvlist_take_descriptor_array
67558c86148SMariusz Zaborskifunctions return value associated with the given name and remove the element
67658c86148SMariusz Zaborskifrom the nvlist.
67758c86148SMariusz ZaborskiIn case of string and binary values, the caller is responsible for free returned
67858c86148SMariusz Zaborskimemory using the
67958c86148SMariusz Zaborski.Xr free 3
68058c86148SMariusz Zaborskifunction.
68158c86148SMariusz ZaborskiIn case of nvlist, the caller is responsible for destroying returned nvlist
68258c86148SMariusz Zaborskiusing the
68358c86148SMariusz Zaborski.Fn nvlist_destroy
68458c86148SMariusz Zaborskifunction.
68558c86148SMariusz ZaborskiIn case of descriptor, the caller is responsible for closing returned descriptor
68658c86148SMariusz Zaborskiusing the
68758c86148SMariusz Zaborski.Fn close 2
68858c86148SMariusz Zaborskisystem call.
689347a39b4SMariusz ZaborskiIf an element of the given name does not exist, the program will be aborted.
690347a39b4SMariusz ZaborskiTo avoid that the caller should check for the existence of the given name
691347a39b4SMariusz Zaborskibefore trying to obtain the value, or use the
69258c86148SMariusz Zaborski.Xr dnvlist 3
693347a39b4SMariusz Zaborskiextension, which can provide a default value in the case of a missing element.
694347a39b4SMariusz ZaborskiIn the case of an array of strings or binary values, the caller is responsible
695347a39b4SMariusz Zaborskifor freeing every element of the array using the
696347a39b4SMariusz Zaborski.Xr free 3
697347a39b4SMariusz Zaborskifunction.
698347a39b4SMariusz ZaborskiIn the case of an array of nvlists, the caller is responsible for destroying
699347a39b4SMariusz Zaborskievery element of array using the
700347a39b4SMariusz Zaborski.Fn nvlist_destroy
701347a39b4SMariusz Zaborskifunction.
702347a39b4SMariusz ZaborskiIn the case of descriptors, the caller is responsible for closing every
703347a39b4SMariusz Zaborskielement of array using the
704347a39b4SMariusz Zaborski.Fn close 2
705347a39b4SMariusz Zaborskisystem call.
706347a39b4SMariusz ZaborskiIn every case involving an array, the caller must also free the pointer to
707347a39b4SMariusz Zaborskithe array using the
708347a39b4SMariusz Zaborski.Xr free 3
709347a39b4SMariusz Zaborskifunction.
71058c86148SMariusz ZaborskiThe nvlist must not be in error state.
71158c86148SMariusz Zaborski.Pp
71258c86148SMariusz ZaborskiThe
71358c86148SMariusz Zaborski.Fn nvlist_free
71458c86148SMariusz Zaborskifunction removes element of the given name from the nvlist (besides of its type)
71558c86148SMariusz Zaborskiand frees all resources associated with it.
71658c86148SMariusz ZaborskiIf element of the given name does not exist, the program will be aborted.
71758c86148SMariusz ZaborskiThe nvlist must not be in error state.
71858c86148SMariusz Zaborski.Pp
71958c86148SMariusz ZaborskiThe
72058c86148SMariusz Zaborski.Fn nvlist_free_type
72158c86148SMariusz Zaborskifunction removes element of the given name and the given type from the nvlist
72258c86148SMariusz Zaborskiand frees all resources associated with it.
72358c86148SMariusz ZaborskiIf element of the given name and the given type does not exist, the program
72458c86148SMariusz Zaborskiwill be aborted.
72558c86148SMariusz ZaborskiThe nvlist must not be in error state.
72658c86148SMariusz Zaborski.Pp
72758c86148SMariusz ZaborskiThe
72858c86148SMariusz Zaborski.Fn nvlist_free_null ,
72958c86148SMariusz Zaborski.Fn nvlist_free_bool ,
73058c86148SMariusz Zaborski.Fn nvlist_free_number ,
73158c86148SMariusz Zaborski.Fn nvlist_free_string ,
73258c86148SMariusz Zaborski.Fn nvlist_free_nvlist ,
73358c86148SMariusz Zaborski.Fn nvlist_free_descriptor ,
734347a39b4SMariusz Zaborski.Fn nvlist_free_binary ,
735347a39b4SMariusz Zaborski.Fn nvlist_free_bool_array ,
736347a39b4SMariusz Zaborski.Fn nvlist_free_number_array ,
737347a39b4SMariusz Zaborski.Fn nvlist_free_string_array ,
738347a39b4SMariusz Zaborski.Fn nvlist_free_nvlist_array ,
739347a39b4SMariusz Zaborski.Fn nvlist_free_descriptor_array
74058c86148SMariusz Zaborskifunctions remove element of the given name and the given type determined by the
74158c86148SMariusz Zaborskifunction name from the nvlist and free all resources associated with it.
74258c86148SMariusz ZaborskiIf element of the given name and the given type does not exist, the program
74358c86148SMariusz Zaborskiwill be aborted.
74458c86148SMariusz ZaborskiThe nvlist must not be in error state.
74558c86148SMariusz Zaborski.Sh EXAMPLES
74658c86148SMariusz ZaborskiThe following example demonstrates how to prepare an nvlist and send it over
74758c86148SMariusz Zaborski.Xr unix 4
74858c86148SMariusz Zaborskidomain socket.
74958c86148SMariusz Zaborski.Bd -literal
75058c86148SMariusz Zaborskinvlist_t *nvl;
75158c86148SMariusz Zaborskiint fd;
75258c86148SMariusz Zaborski
75358c86148SMariusz Zaborskifd = open("/tmp/foo", O_RDONLY);
75458c86148SMariusz Zaborskiif (fd < 0)
75558c86148SMariusz Zaborski        err(1, "open(\\"/tmp/foo\\") failed");
75658c86148SMariusz Zaborski
75758c86148SMariusz Zaborskinvl = nvlist_create(0);
75858c86148SMariusz Zaborski/*
75958c86148SMariusz Zaborski * There is no need to check if nvlist_create() succeeded,
76058c86148SMariusz Zaborski * as the nvlist_add_<type>() functions can cope.
76158c86148SMariusz Zaborski * If it failed, nvlist_send() will fail.
76258c86148SMariusz Zaborski */
76358c86148SMariusz Zaborskinvlist_add_string(nvl, "filename", "/tmp/foo");
76458c86148SMariusz Zaborskinvlist_add_number(nvl, "flags", O_RDONLY);
76558c86148SMariusz Zaborski/*
76658c86148SMariusz Zaborski * We just want to send the descriptor, so we can give it
76758c86148SMariusz Zaborski * for the nvlist to consume (that's why we use nvlist_move
76858c86148SMariusz Zaborski * not nvlist_add).
76958c86148SMariusz Zaborski */
77058c86148SMariusz Zaborskinvlist_move_descriptor(nvl, "fd", fd);
77158c86148SMariusz Zaborskiif (nvlist_send(sock, nvl) < 0) {
77258c86148SMariusz Zaborski	nvlist_destroy(nvl);
77358c86148SMariusz Zaborski	err(1, "nvlist_send() failed");
77458c86148SMariusz Zaborski}
77558c86148SMariusz Zaborskinvlist_destroy(nvl);
77658c86148SMariusz Zaborski.Ed
77758c86148SMariusz Zaborski.Pp
77858c86148SMariusz ZaborskiReceiving nvlist and getting data:
77958c86148SMariusz Zaborski.Bd -literal
78058c86148SMariusz Zaborskinvlist_t *nvl;
78158c86148SMariusz Zaborskiconst char *command;
78258c86148SMariusz Zaborskichar *filename;
78358c86148SMariusz Zaborskiint fd;
78458c86148SMariusz Zaborski
78558c86148SMariusz Zaborskinvl = nvlist_recv(sock, 0);
78658c86148SMariusz Zaborskiif (nvl == NULL)
78758c86148SMariusz Zaborski	err(1, "nvlist_recv() failed");
78858c86148SMariusz Zaborski
78958c86148SMariusz Zaborski/* For command we take pointer to nvlist's buffer. */
79058c86148SMariusz Zaborskicommand = nvlist_get_string(nvl, "command");
79158c86148SMariusz Zaborski/*
79258c86148SMariusz Zaborski * For filename we remove it from the nvlist and take
79358c86148SMariusz Zaborski * ownership of the buffer.
79458c86148SMariusz Zaborski */
79558c86148SMariusz Zaborskifilename = nvlist_take_string(nvl, "filename");
79658c86148SMariusz Zaborski/* The same for the descriptor. */
79758c86148SMariusz Zaborskifd = nvlist_take_descriptor(nvl, "fd");
79858c86148SMariusz Zaborski
79958c86148SMariusz Zaborskiprintf("command=%s filename=%s fd=%d\n", command, filename, fd);
80058c86148SMariusz Zaborski
80158c86148SMariusz Zaborskinvlist_destroy(nvl);
80258c86148SMariusz Zaborskifree(filename);
80358c86148SMariusz Zaborskiclose(fd);
80458c86148SMariusz Zaborski/* command was freed by nvlist_destroy() */
80558c86148SMariusz Zaborski.Ed
80658c86148SMariusz Zaborski.Pp
80758c86148SMariusz ZaborskiIterating over nvlist:
80858c86148SMariusz Zaborski.Bd -literal
80958c86148SMariusz Zaborskinvlist_t *nvl;
81058c86148SMariusz Zaborskiconst char *name;
81158c86148SMariusz Zaborskivoid *cookie;
81258c86148SMariusz Zaborskiint type;
81358c86148SMariusz Zaborski
81458c86148SMariusz Zaborskinvl = nvlist_recv(sock, 0);
81558c86148SMariusz Zaborskiif (nvl == NULL)
81658c86148SMariusz Zaborski	err(1, "nvlist_recv() failed");
81758c86148SMariusz Zaborski
81858c86148SMariusz Zaborskicookie = NULL;
81958c86148SMariusz Zaborskiwhile ((name = nvlist_next(nvl, &type, &cookie)) != NULL) {
82058c86148SMariusz Zaborski	printf("%s=", name);
82158c86148SMariusz Zaborski	switch (type) {
82258c86148SMariusz Zaborski	case NV_TYPE_NUMBER:
82358c86148SMariusz Zaborski		printf("%ju", (uintmax_t)nvlist_get_number(nvl, name));
82458c86148SMariusz Zaborski		break;
82558c86148SMariusz Zaborski	case NV_TYPE_STRING:
82658c86148SMariusz Zaborski		printf("%s", nvlist_get_string(nvl, name));
82758c86148SMariusz Zaborski		break;
82858c86148SMariusz Zaborski	default:
82958c86148SMariusz Zaborski		printf("N/A");
83058c86148SMariusz Zaborski		break;
83158c86148SMariusz Zaborski	}
83258c86148SMariusz Zaborski	printf("\\n");
83358c86148SMariusz Zaborski}
83458c86148SMariusz Zaborski.Ed
83558c86148SMariusz Zaborski.Pp
83658c86148SMariusz ZaborskiIterating over every nested nvlist:
83758c86148SMariusz Zaborski.Bd -literal
83858c86148SMariusz Zaborskinvlist_t *nvl;
83958c86148SMariusz Zaborskiconst char *name;
84058c86148SMariusz Zaborskivoid *cookie;
84158c86148SMariusz Zaborskiint type;
84258c86148SMariusz Zaborski
84358c86148SMariusz Zaborskinvl = nvlist_recv(sock, 0);
84458c86148SMariusz Zaborskiif (nvl == NULL)
84558c86148SMariusz Zaborski	err(1, "nvlist_recv() failed");
84658c86148SMariusz Zaborski
84758c86148SMariusz Zaborskicookie = NULL;
84858c86148SMariusz Zaborskido {
84958c86148SMariusz Zaborski	while ((name = nvlist_next(nvl, &type, &cookie)) != NULL) {
85058c86148SMariusz Zaborski		if (type == NV_TYPE_NVLIST) {
85158c86148SMariusz Zaborski			nvl = nvlist_get_nvlist(nvl, name);
85258c86148SMariusz Zaborski			cookie = NULL;
85358c86148SMariusz Zaborski		}
85458c86148SMariusz Zaborski	}
85558c86148SMariusz Zaborski} while ((nvl = nvlist_get_parent(nvl, &cookie)) != NULL);
85658c86148SMariusz Zaborski.Ed
857347a39b4SMariusz Zaborski.Pp
858347a39b4SMariusz ZaborskiIterating over every nested nvlist and every nvlist element:
859347a39b4SMariusz Zaborski.Bd -literal
860347a39b4SMariusz Zaborskinvlist_t *nvl;
861347a39b4SMariusz Zaborskiconst nvlist_t * const *array;
862347a39b4SMariusz Zaborskiconst char *name;
863347a39b4SMariusz Zaborskivoid *cookie;
864347a39b4SMariusz Zaborskiint type;
865347a39b4SMariusz Zaborski
866347a39b4SMariusz Zaborskinvl = nvlist_recv(sock, 0);
867347a39b4SMariusz Zaborskiif (nvl == null)
868347a39b4SMariusz Zaborski	err(1, "nvlist_recv() failed");
869347a39b4SMariusz Zaborski
870347a39b4SMariusz Zaborskicookie = null;
871347a39b4SMariusz Zaborskido {
872347a39b4SMariusz Zaborski	while ((name = nvlist_next(nvl, &type, &cookie)) != NULL) {
873347a39b4SMariusz Zaborski		if (type == NV_TYPE_NVLIST) {
874347a39b4SMariusz Zaborski			nvl = nvlist_get_nvlist(nvl, name);
875347a39b4SMariusz Zaborski			cookie = NULL;
876347a39b4SMariusz Zaborski		} else if (type == NV_TYPE_NVLIST_ARRAY) {
877347a39b4SMariusz Zaborski			nvl = nvlist_get_nvlist_array(nvl, name, NULL)[0];
878347a39b4SMariusz Zaborski			cookie = NULL;
879347a39b4SMariusz Zaborski		}
880347a39b4SMariusz Zaborski	}
881347a39b4SMariusz Zaborski} while ((nvl = nvlist_get_pararr(nvl, &cookie)) != NULL);
882347a39b4SMariusz Zaborski.Ed
883347a39b4SMariusz Zaborski.Pp
884347a39b4SMariusz ZaborskiOr alternatively:
885347a39b4SMariusz Zaborski.Bd -literal
886347a39b4SMariusz Zaborskinvlist_t *nvl, *tmp;
887347a39b4SMariusz Zaborskiconst nvlist_t * const *array;
888347a39b4SMariusz Zaborskiconst char *name;
889347a39b4SMariusz Zaborskivoid *cookie;
890347a39b4SMariusz Zaborskiint type;
891347a39b4SMariusz Zaborski
892347a39b4SMariusz Zaborskinvl = nvlist_recv(sock, 0);
893347a39b4SMariusz Zaborskiif (nvl == null)
894347a39b4SMariusz Zaborski	err(1, "nvlist_recv() failed");
895347a39b4SMariusz Zaborski
896347a39b4SMariusz Zaborskicooke = NULL;
897347a39b4SMariusz Zaborskitmp = nvl;
898347a39b4SMariusz Zaborskido {
899347a39b4SMariusz Zaborski	do {
900347a39b4SMariusz Zaborski		nvl = tmp;
901347a39b4SMariusz Zaborski		while ((name = nvlist_next(nvl, &type, &cookie)) != NULL) {
902347a39b4SMariusz Zaborski			if (type == NV_TYPE_NVLIST) {
903347a39b4SMariusz Zaborski				nvl = nvlist_get_nvlist(nvl,
904347a39b4SMariusz Zaborski				    name);
905347a39b4SMariusz Zaborski				cookie = NULL;
906347a39b4SMariusz Zaborski			} else if (type == NV_TYPE_NVLIST_ARRAY) {
907347a39b4SMariusz Zaborski				nvl = nvlist_get_nvlist_array(nvl, name,
908347a39b4SMariusz Zaborski				    NULL)[0];
909347a39b4SMariusz Zaborski				cookie = NULL;
910347a39b4SMariusz Zaborski			}
911347a39b4SMariusz Zaborski		}
912347a39b4SMariusz Zaborski		cookie = NULL;
913347a39b4SMariusz Zaborski	} while ((tmp = nvlist_get_array_next(nvl)) != NULL);
914347a39b4SMariusz Zaborski} while ((tmp = nvlist_get_parent(nvl, &cookie)) != NULL);
915347a39b4SMariusz Zaborski.Ed
91658c86148SMariusz Zaborski.Sh SEE ALSO
91758c86148SMariusz Zaborski.Xr close 2 ,
91858c86148SMariusz Zaborski.Xr dup 2 ,
91958c86148SMariusz Zaborski.Xr open 2 ,
92058c86148SMariusz Zaborski.Xr err 3 ,
92158c86148SMariusz Zaborski.Xr free 3 ,
92258c86148SMariusz Zaborski.Xr printf 3 ,
92358c86148SMariusz Zaborski.Xr unix 4
92458c86148SMariusz Zaborski.Sh HISTORY
92558c86148SMariusz ZaborskiThe
92658c86148SMariusz Zaborski.Nm libnv
92758c86148SMariusz Zaborskilibrary appeared in
92858c86148SMariusz Zaborski.Fx 11.0 .
92958c86148SMariusz Zaborski.Sh AUTHORS
93058c86148SMariusz Zaborski.An -nosplit
93158c86148SMariusz ZaborskiThe
93258c86148SMariusz Zaborski.Nm libnv
93358c86148SMariusz Zaborskilibrary was implemented by
93458c86148SMariusz Zaborski.An Pawel Jakub Dawidek Aq Mt pawel@dawidek.net
93558c86148SMariusz Zaborskiunder sponsorship from the FreeBSD Foundation.
936