xref: /freebsd/share/man/man9/nv.9 (revision 89ca10c6e26987bcbc0bbc162887fb5409e3441b)
158c86148SMariusz Zaborski.\"
258c86148SMariusz Zaborski.\" Copyright (c) 2013 The FreeBSD Foundation
358c86148SMariusz Zaborski.\" All rights reserved.
458c86148SMariusz Zaborski.\"
558c86148SMariusz Zaborski.\" This documentation was written by Pawel Jakub Dawidek under sponsorship
658c86148SMariusz Zaborski.\" the FreeBSD Foundation.
758c86148SMariusz Zaborski.\"
858c86148SMariusz Zaborski.\" Redistribution and use in source and binary forms, with or without
958c86148SMariusz Zaborski.\" modification, are permitted provided that the following conditions
1058c86148SMariusz Zaborski.\" are met:
1158c86148SMariusz Zaborski.\" 1. Redistributions of source code must retain the above copyright
1258c86148SMariusz Zaborski.\"    notice, this list of conditions and the following disclaimer.
1358c86148SMariusz Zaborski.\" 2. Redistributions in binary form must reproduce the above copyright
1458c86148SMariusz Zaborski.\"    notice, this list of conditions and the following disclaimer in the
1558c86148SMariusz Zaborski.\"    documentation and/or other materials provided with the distribution.
1658c86148SMariusz Zaborski.\"
1758c86148SMariusz Zaborski.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1858c86148SMariusz Zaborski.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1958c86148SMariusz Zaborski.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2058c86148SMariusz Zaborski.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2158c86148SMariusz Zaborski.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2258c86148SMariusz Zaborski.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2358c86148SMariusz Zaborski.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2458c86148SMariusz Zaborski.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2558c86148SMariusz Zaborski.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2658c86148SMariusz Zaborski.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2758c86148SMariusz Zaborski.\" SUCH DAMAGE.
2858c86148SMariusz Zaborski.\"
2958c86148SMariusz Zaborski.\" $FreeBSD$
3058c86148SMariusz Zaborski.\"
31*89ca10c6SMariusz Zaborski.Dd Aug 11, 2015
3258c86148SMariusz Zaborski.Dt NV 9
3358c86148SMariusz Zaborski.Os
3458c86148SMariusz Zaborski.Sh NAME
3558c86148SMariusz Zaborski.Nm nvlist_create ,
3658c86148SMariusz Zaborski.Nm nvlist_destroy ,
3758c86148SMariusz Zaborski.Nm nvlist_error ,
3858c86148SMariusz Zaborski.Nm nvlist_set_error ,
3958c86148SMariusz Zaborski.Nm nvlist_empty ,
4058c86148SMariusz Zaborski.Nm nvlist_flags ,
4158c86148SMariusz Zaborski.Nm nvlist_exists ,
4258c86148SMariusz Zaborski.Nm nvlist_free ,
4358c86148SMariusz Zaborski.Nm nvlist_clone ,
4458c86148SMariusz Zaborski.Nm nvlist_dump ,
4558c86148SMariusz Zaborski.Nm nvlist_fdump ,
4658c86148SMariusz Zaborski.Nm nvlist_size ,
4758c86148SMariusz Zaborski.Nm nvlist_pack ,
4858c86148SMariusz Zaborski.Nm nvlist_unpack ,
4958c86148SMariusz Zaborski.Nm nvlist_send ,
5058c86148SMariusz Zaborski.Nm nvlist_recv ,
5158c86148SMariusz Zaborski.Nm nvlist_xfer ,
5258c86148SMariusz Zaborski.Nm nvlist_next ,
5358c86148SMariusz Zaborski.Nm nvlist_add ,
5458c86148SMariusz Zaborski.Nm nvlist_move ,
5558c86148SMariusz Zaborski.Nm nvlist_get ,
5658c86148SMariusz Zaborski.Nm nvlist_take
5758c86148SMariusz Zaborski.Nd "library for name/value pairs"
5858c86148SMariusz Zaborski.Sh LIBRARY
5958c86148SMariusz Zaborski.Lb libnv
6058c86148SMariusz Zaborski.Sh SYNOPSIS
6158c86148SMariusz Zaborski.In nv.h
6258c86148SMariusz Zaborski.Ft "nvlist_t *"
6358c86148SMariusz Zaborski.Fn nvlist_create "int flags"
6458c86148SMariusz Zaborski.Ft void
6558c86148SMariusz Zaborski.Fn nvlist_destroy "nvlist_t *nvl"
6658c86148SMariusz Zaborski.Ft int
6758c86148SMariusz Zaborski.Fn nvlist_error "const nvlist_t *nvl"
6858c86148SMariusz Zaborski.Ft void
6998701874SChristian Brueffer.Fn nvlist_set_error "nvlist_t *nvl" "int error"
7058c86148SMariusz Zaborski.Ft bool
7158c86148SMariusz Zaborski.Fn nvlist_empty "const nvlist_t *nvl"
7258c86148SMariusz Zaborski.Ft int
7358c86148SMariusz Zaborski.Fn nvlist_flags "const nvlist_t *nvl"
7458c86148SMariusz Zaborski.\"
7558c86148SMariusz Zaborski.Ft "nvlist_t *"
7658c86148SMariusz Zaborski.Fn nvlist_clone "const nvlist_t *nvl"
7758c86148SMariusz Zaborski.\"
7858c86148SMariusz Zaborski.Ft void
7998701874SChristian Brueffer.Fn nvlist_dump "const nvlist_t *nvl" "int fd"
8058c86148SMariusz Zaborski.Ft void
8198701874SChristian Brueffer.Fn nvlist_fdump "const nvlist_t *nvl" "FILE *fp"
8258c86148SMariusz Zaborski.\"
8358c86148SMariusz Zaborski.Ft size_t
8458c86148SMariusz Zaborski.Fn nvlist_size "const nvlist_t *nvl"
8558c86148SMariusz Zaborski.Ft "void *"
8658c86148SMariusz Zaborski.Fn nvlist_pack "const nvlist_t *nvl" "size_t *sizep"
8758c86148SMariusz Zaborski.Ft "nvlist_t *"
8858c86148SMariusz Zaborski.Fn nvlist_unpack "const void *buf" "size_t size" "int flags"
8958c86148SMariusz Zaborski.\"
9058c86148SMariusz Zaborski.Ft int
9158c86148SMariusz Zaborski.Fn nvlist_send "int sock" "const nvlist_t *nvl"
9258c86148SMariusz Zaborski.Ft "nvlist_t *"
9358c86148SMariusz Zaborski.Fn nvlist_recv "int sock" "int flags"
9458c86148SMariusz Zaborski.Ft "nvlist_t *"
9558c86148SMariusz Zaborski.Fn nvlist_xfer "int sock" "nvlist_t *nvl" "int flags"
9658c86148SMariusz Zaborski.\"
9758c86148SMariusz Zaborski.Ft "const char *"
9858c86148SMariusz Zaborski.Fn nvlist_next "const nvlist_t *nvl" "int *typep" "void **cookiep"
9958c86148SMariusz Zaborski.\"
10058c86148SMariusz Zaborski.Ft bool
10158c86148SMariusz Zaborski.Fn nvlist_exists "const nvlist_t *nvl" "const char *name"
10258c86148SMariusz Zaborski.Ft bool
10358c86148SMariusz Zaborski.Fn nvlist_exists_type "const nvlist_t *nvl" "const char *name" "int type"
10458c86148SMariusz Zaborski.Ft bool
10558c86148SMariusz Zaborski.Fn nvlist_exists_null "const nvlist_t *nvl" "const char *name"
10658c86148SMariusz Zaborski.Ft bool
10758c86148SMariusz Zaborski.Fn nvlist_exists_bool "const nvlist_t *nvl" "const char *name"
10858c86148SMariusz Zaborski.Ft bool
10958c86148SMariusz Zaborski.Fn nvlist_exists_number "const nvlist_t *nvl" "const char *name"
11058c86148SMariusz Zaborski.Ft bool
11158c86148SMariusz Zaborski.Fn nvlist_exists_string "const nvlist_t *nvl" "const char *name"
11258c86148SMariusz Zaborski.Ft bool
11358c86148SMariusz Zaborski.Fn nvlist_exists_nvlist "const nvlist_t *nvl" "const char *name"
11458c86148SMariusz Zaborski.Ft bool
11558c86148SMariusz Zaborski.Fn nvlist_exists_descriptor "const nvlist_t *nvl" "const char *name"
11658c86148SMariusz Zaborski.Ft bool
11758c86148SMariusz Zaborski.Fn nvlist_exists_binary "const nvlist_t *nvl" "const char *name"
11858c86148SMariusz Zaborski.\"
11958c86148SMariusz Zaborski.Ft void
12058c86148SMariusz Zaborski.Fn nvlist_add_null "nvlist_t *nvl" "const char *name"
12158c86148SMariusz Zaborski.Ft void
12258c86148SMariusz Zaborski.Fn nvlist_add_bool "nvlist_t *nvl" "const char *name" "bool value"
12358c86148SMariusz Zaborski.Ft void
12458c86148SMariusz Zaborski.Fn nvlist_add_number "nvlist_t *nvl" "const char *name" "uint64_t value"
12558c86148SMariusz Zaborski.Ft void
12658c86148SMariusz Zaborski.Fn nvlist_add_string "nvlist_t *nvl" "const char *name" "const char *value"
12758c86148SMariusz Zaborski.Ft void
12858c86148SMariusz Zaborski.Fn nvlist_add_stringf "nvlist_t *nvl" "const char *name" "const char *valuefmt" "..."
12958c86148SMariusz Zaborski.Ft void
13058c86148SMariusz Zaborski.Fn nvlist_add_stringv "nvlist_t *nvl" "const char *name" "const char *valuefmt" "va_list valueap"
13158c86148SMariusz Zaborski.Ft void
13258c86148SMariusz Zaborski.Fn nvlist_add_nvlist "nvlist_t *nvl" "const char *name" "const nvlist_t *value"
13358c86148SMariusz Zaborski.Ft void
13458c86148SMariusz Zaborski.Fn nvlist_add_descriptor "nvlist_t *nvl" "const char *name" "int value"
13558c86148SMariusz Zaborski.Ft void
13658c86148SMariusz Zaborski.Fn nvlist_add_binary "nvlist_t *nvl" "const char *name" "const void *value" "size_t size"
13758c86148SMariusz Zaborski.\"
13858c86148SMariusz Zaborski.Ft void
13958c86148SMariusz Zaborski.Fn nvlist_move_string "nvlist_t *nvl" "const char *name" "char *value"
14058c86148SMariusz Zaborski.Ft void
14158c86148SMariusz Zaborski.Fn nvlist_move_nvlist "nvlist_t *nvl" "const char *name" "nvlist_t *value"
14258c86148SMariusz Zaborski.Ft void
14358c86148SMariusz Zaborski.Fn nvlist_move_descriptor "nvlist_t *nvl" "const char *name" "int value"
14458c86148SMariusz Zaborski.Ft void
14558c86148SMariusz Zaborski.Fn nvlist_move_binary "nvlist_t *nvl" "const char *name" "void *value" "size_t size"
14658c86148SMariusz Zaborski.\"
14758c86148SMariusz Zaborski.Ft bool
14858c86148SMariusz Zaborski.Fn nvlist_get_bool "const nvlist_t *nvl" "const char *name"
14958c86148SMariusz Zaborski.Ft uint64_t
15058c86148SMariusz Zaborski.Fn nvlist_get_number "const nvlist_t *nvl" "const char *name"
15158c86148SMariusz Zaborski.Ft "const char *"
15258c86148SMariusz Zaborski.Fn nvlist_get_string "const nvlist_t *nvl" "const char *name"
15358c86148SMariusz Zaborski.Ft "const nvlist_t *"
15458c86148SMariusz Zaborski.Fn nvlist_get_nvlist "const nvlist_t *nvl" "const char *name"
15558c86148SMariusz Zaborski.Ft int
15658c86148SMariusz Zaborski.Fn nvlist_get_descriptor "const nvlist_t *nvl" "const char *name"
15758c86148SMariusz Zaborski.Ft "const void *"
15858c86148SMariusz Zaborski.Fn nvlist_get_binary "const nvlist_t *nvl" "const char *name" "size_t *sizep"
15958c86148SMariusz Zaborski.Ft "const nvlist_t *"
16058c86148SMariusz Zaborski.Fn nvlist_get_parent "const nvlist_t *nvl" "void **cookiep"
16158c86148SMariusz Zaborski.\"
16258c86148SMariusz Zaborski.Ft bool
16358c86148SMariusz Zaborski.Fn nvlist_take_bool "nvlist_t *nvl" "const char *name"
16458c86148SMariusz Zaborski.Ft uint64_t
16558c86148SMariusz Zaborski.Fn nvlist_take_number "nvlist_t *nvl" "const char *name"
16658c86148SMariusz Zaborski.Ft "char *"
16758c86148SMariusz Zaborski.Fn nvlist_take_string "nvlist_t *nvl" "const char *name"
16858c86148SMariusz Zaborski.Ft "nvlist_t *"
16958c86148SMariusz Zaborski.Fn nvlist_take_nvlist "nvlist_t *nvl" "const char *name"
17058c86148SMariusz Zaborski.Ft int
17158c86148SMariusz Zaborski.Fn nvlist_take_descriptor "nvlist_t *nvl" "const char *name"
17258c86148SMariusz Zaborski.Ft "void *"
17358c86148SMariusz Zaborski.Fn nvlist_take_binary "nvlist_t *nvl" "const char *name" "size_t *sizep"
17458c86148SMariusz Zaborski.\"
17558c86148SMariusz Zaborski.Ft void
17658c86148SMariusz Zaborski.Fn nvlist_free "nvlist_t *nvl" "const char *name"
17758c86148SMariusz Zaborski.Ft void
17858c86148SMariusz Zaborski.Fn nvlist_free_type "nvlist_t *nvl" "const char *name" "int type"
17958c86148SMariusz Zaborski.\"
18058c86148SMariusz Zaborski.Ft void
18158c86148SMariusz Zaborski.Fn nvlist_free_null "nvlist_t *nvl" "const char *name"
18258c86148SMariusz Zaborski.Ft void
18358c86148SMariusz Zaborski.Fn nvlist_free_bool "nvlist_t *nvl" "const char *name"
18458c86148SMariusz Zaborski.Ft void
18558c86148SMariusz Zaborski.Fn nvlist_free_number "nvlist_t *nvl" "const char *name"
18658c86148SMariusz Zaborski.Ft void
18758c86148SMariusz Zaborski.Fn nvlist_free_string "nvlist_t *nvl" "const char *name"
18858c86148SMariusz Zaborski.Ft void
18958c86148SMariusz Zaborski.Fn nvlist_free_nvlist "nvlist_t *nvl" "const char *name"
19058c86148SMariusz Zaborski.Ft void
19158c86148SMariusz Zaborski.Fn nvlist_free_descriptor "nvlist_t *nvl" "const char *name"
19258c86148SMariusz Zaborski.Ft void
19358c86148SMariusz Zaborski.Fn nvlist_free_binary "nvlist_t *nvl" "const char *name"
19458c86148SMariusz Zaborski.Sh DESCRIPTION
19558c86148SMariusz ZaborskiThe
19658c86148SMariusz Zaborski.Nm libnv
19758c86148SMariusz Zaborskilibrary allows to easily manage name value pairs as well as send and receive
19858c86148SMariusz Zaborskithem over sockets.
19958c86148SMariusz ZaborskiA group (list) of name value pairs is called an
20058c86148SMariusz Zaborski.Nm nvlist .
20158c86148SMariusz ZaborskiThe API supports the following data types:
20258c86148SMariusz Zaborski.Bl -ohang -offset indent
20358c86148SMariusz Zaborski.It Sy null ( NV_TYPE_NULL )
20458c86148SMariusz ZaborskiThere is no data associated with the name.
20558c86148SMariusz Zaborski.It Sy bool ( NV_TYPE_BOOL )
20658c86148SMariusz ZaborskiThe value can be either
20758c86148SMariusz Zaborski.Dv true
20858c86148SMariusz Zaborskior
20958c86148SMariusz Zaborski.Dv false .
21058c86148SMariusz Zaborski.It Sy number ( NV_TYPE_NUMBER )
21158c86148SMariusz ZaborskiThe value is a number stored as
21258c86148SMariusz Zaborski.Vt uint64_t .
21358c86148SMariusz Zaborski.It Sy string ( NV_TYPE_STRING )
21458c86148SMariusz ZaborskiThe value is a C string.
21558c86148SMariusz Zaborski.It Sy nvlist ( NV_TYPE_NVLIST )
21658c86148SMariusz ZaborskiThe value is a nested nvlist.
21758c86148SMariusz Zaborski.It Sy descriptor ( NV_TYPE_DESCRIPTOR )
21858c86148SMariusz ZaborskiThe value is a file descriptor.
21958c86148SMariusz ZaborskiNote that file descriptors can be sent only over
22058c86148SMariusz Zaborski.Xr unix 4
22158c86148SMariusz Zaborskidomain sockets.
22258c86148SMariusz Zaborski.It Sy binary ( NV_TYPE_BINARY )
22358c86148SMariusz ZaborskiThe value is a binary buffer.
22458c86148SMariusz Zaborski.El
22558c86148SMariusz Zaborski.Pp
22658c86148SMariusz ZaborskiThe
22758c86148SMariusz Zaborski.Fn nvlist_create
22858c86148SMariusz Zaborskifunction allocates memory and initializes an nvlist.
22958c86148SMariusz Zaborski.Pp
23058c86148SMariusz ZaborskiThe following flag can be provided:
23158c86148SMariusz Zaborski.Pp
23258c86148SMariusz Zaborski.Bl -tag -width "NV_FLAG_IGNORE_CASE" -compact -offset indent
23358c86148SMariusz Zaborski.It Dv NV_FLAG_IGNORE_CASE
23458c86148SMariusz ZaborskiPerform case-insensitive lookups of provided names.
23558c86148SMariusz Zaborski.It Dv NV_FLAG_NO_UNIQUE
23658c86148SMariusz ZaborskiNames in the nvlist do not have to be unique.
23758c86148SMariusz Zaborski.El
23858c86148SMariusz Zaborski.Pp
23958c86148SMariusz ZaborskiThe
24058c86148SMariusz Zaborski.Fn nvlist_destroy
24158c86148SMariusz Zaborskifunction destroys the given nvlist.
24258c86148SMariusz ZaborskiFunction does nothing if
24358c86148SMariusz Zaborski.Dv NULL
24458c86148SMariusz Zaborskinvlist is provided.
24558c86148SMariusz ZaborskiFunction never modifies the
24658c86148SMariusz Zaborski.Va errno
24758c86148SMariusz Zaborskiglobal variable.
24858c86148SMariusz Zaborski.Pp
24958c86148SMariusz ZaborskiThe
25058c86148SMariusz Zaborski.Fn nvlist_error
25158c86148SMariusz Zaborskifunction returns any error value that the nvlist accumulated.
25258c86148SMariusz ZaborskiIf the given nvlist is
25358c86148SMariusz Zaborski.Dv NULL
25458c86148SMariusz Zaborskithe
25558c86148SMariusz Zaborski.Er ENOMEM
25658c86148SMariusz Zaborskierror will be returned.
25758c86148SMariusz Zaborski.Pp
25858c86148SMariusz ZaborskiThe
25958c86148SMariusz Zaborski.Fn nvlist_set_error
26058c86148SMariusz Zaborskifunction sets an nvlist to be in the error state.
26158c86148SMariusz ZaborskiSubsequent calls to
26258c86148SMariusz Zaborski.Fn nvlist_error
26358c86148SMariusz Zaborskiwill return the given error value.
26458c86148SMariusz ZaborskiThis function cannot be used to clear the error state from an nvlist.
26558c86148SMariusz ZaborskiThis function does nothing if the nvlist is already in the error state.
26658c86148SMariusz Zaborski.Pp
26758c86148SMariusz ZaborskiThe
26858c86148SMariusz Zaborski.Fn nvlist_empty
26958c86148SMariusz Zaborskifunction returns
27058c86148SMariusz Zaborski.Dv true
27158c86148SMariusz Zaborskiif the given nvlist is empty and
27258c86148SMariusz Zaborski.Dv false
27358c86148SMariusz Zaborskiotherwise.
27458c86148SMariusz ZaborskiThe nvlist must not be in error state.
27558c86148SMariusz Zaborski.Pp
27658c86148SMariusz ZaborskiThe
27758c86148SMariusz Zaborski.Fn nvlist_flags
27858c86148SMariusz Zaborskifunction returns flags used to create the nvlist with the
27958c86148SMariusz Zaborski.Fn nvlist_create
28058c86148SMariusz Zaborskifunction.
28158c86148SMariusz Zaborski.Pp
28258c86148SMariusz ZaborskiThe
28358c86148SMariusz Zaborski.Fn nvlist_clone
28458c86148SMariusz Zaborskifunctions clones the given nvlist.
28558c86148SMariusz ZaborskiThe clone shares no resources with its origin.
28658c86148SMariusz ZaborskiThis also means that all file descriptors that are part of the nvlist will be
28758c86148SMariusz Zaborskiduplicated with the
28858c86148SMariusz Zaborski.Xr dup 2
28958c86148SMariusz Zaborskisystem call before placing them in the clone.
29058c86148SMariusz Zaborski.Pp
29158c86148SMariusz ZaborskiThe
29258c86148SMariusz Zaborski.Fn nvlist_dump
29358c86148SMariusz Zaborskidumps nvlist content for debugging purposes to the given file descriptor
29458c86148SMariusz Zaborski.Fa fd .
29558c86148SMariusz Zaborski.Pp
29658c86148SMariusz ZaborskiThe
29758c86148SMariusz Zaborski.Fn nvlist_fdump
29858c86148SMariusz Zaborskidumps nvlist content for debugging purposes to the given file stream
29958c86148SMariusz Zaborski.Fa fp .
30058c86148SMariusz Zaborski.Pp
30158c86148SMariusz ZaborskiThe
30258c86148SMariusz Zaborski.Fn nvlist_size
30358c86148SMariusz Zaborskifunction returns the size of the given nvlist after converting it to binary
30458c86148SMariusz Zaborskibuffer with the
30558c86148SMariusz Zaborski.Fn nvlist_pack
30658c86148SMariusz Zaborskifunction.
30758c86148SMariusz Zaborski.Pp
30858c86148SMariusz ZaborskiThe
30958c86148SMariusz Zaborski.Fn nvlist_pack
31058c86148SMariusz Zaborskifunction converts the given nvlist to a binary buffer.
31158c86148SMariusz ZaborskiThe function allocates memory for the buffer, which should be freed with the
31258c86148SMariusz Zaborski.Xr free 3
31358c86148SMariusz Zaborskifunction.
31458c86148SMariusz ZaborskiIf the
31558c86148SMariusz Zaborski.Fa sizep
31658c86148SMariusz Zaborskiargument is not
31758c86148SMariusz Zaborski.Dv NULL ,
31858c86148SMariusz Zaborskithe size of the buffer will be stored there.
31958c86148SMariusz ZaborskiThe function returns
32058c86148SMariusz Zaborski.Dv NULL
32158c86148SMariusz Zaborskiin case of an error (allocation failure).
32258c86148SMariusz ZaborskiIf the nvlist contains any file descriptors
32358c86148SMariusz Zaborski.Dv NULL
32458c86148SMariusz Zaborskiwill be returned.
32558c86148SMariusz ZaborskiThe nvlist must not be in error state.
32658c86148SMariusz Zaborski.Pp
32758c86148SMariusz ZaborskiThe
32858c86148SMariusz Zaborski.Fn nvlist_unpack
32958c86148SMariusz Zaborskifunction converts the given buffer to the nvlist.
33058c86148SMariusz ZaborskiThe
33158c86148SMariusz Zaborski.Fa flags
33258c86148SMariusz Zaborskiargument defines what type of the top level nvlist is expected to be.
33358c86148SMariusz ZaborskiFlags are set up using the
33458c86148SMariusz Zaborski.Fn nvlist_create
33558c86148SMariusz Zaborskifunction.
33658c86148SMariusz ZaborskiIf the nvlist flags do not match the flags passed to
33758c86148SMariusz Zaborski.Fn nvlist_unpack ,
33858c86148SMariusz Zaborskithe nvlist will not be returned.
33958c86148SMariusz ZaborskiEvery nested nvlist list should be checked using
34058c86148SMariusz Zaborski.Fn nvlist_flags
34158c86148SMariusz Zaborskifunction.
34258c86148SMariusz ZaborskiThe function returns
34358c86148SMariusz Zaborski.Dv NULL
34458c86148SMariusz Zaborskiin case of an error.
34558c86148SMariusz Zaborski.Pp
34658c86148SMariusz ZaborskiThe
34758c86148SMariusz Zaborski.Fn nvlist_send
34858c86148SMariusz Zaborskifunction sends the given nvlist over the socket given by the
34958c86148SMariusz Zaborski.Fa sock
35058c86148SMariusz Zaborskiargument.
35158c86148SMariusz ZaborskiNote that nvlist that contains file descriptors can only be send over
35258c86148SMariusz Zaborski.Xr unix 4
35358c86148SMariusz Zaborskidomain sockets.
35458c86148SMariusz Zaborski.Pp
35558c86148SMariusz ZaborskiThe
35658c86148SMariusz Zaborski.Fn nvlist_recv
35758c86148SMariusz Zaborskifunction receives nvlist over the socket given by the
35858c86148SMariusz Zaborski.Fa sock
35958c86148SMariusz Zaborskiargument.
36058c86148SMariusz ZaborskiThe
36158c86148SMariusz Zaborski.Fa flags
36258c86148SMariusz Zaborskiargument defines what type of the top level nvlist is expected to be.
36358c86148SMariusz ZaborskiFlags are set up using the
36458c86148SMariusz Zaborski.Fn nvlist_create
36558c86148SMariusz Zaborskifunction.
36658c86148SMariusz ZaborskiIf the nvlist flags do not match the flags passed to
36758c86148SMariusz Zaborski.Fn nvlist_recv ,
36858c86148SMariusz Zaborskithe nvlist will not be returned.
36958c86148SMariusz ZaborskiEvery nested nvlist list should be checked using
37058c86148SMariusz Zaborski.Fn nvlist_flags
37158c86148SMariusz Zaborskifunction.
37258c86148SMariusz Zaborski.Pp
37358c86148SMariusz ZaborskiThe
37458c86148SMariusz Zaborski.Fn nvlist_xfer
37558c86148SMariusz Zaborskifunction sends the given nvlist over the socket given by the
37658c86148SMariusz Zaborski.Fa sock
37758c86148SMariusz Zaborskiargument and receives nvlist over the same socket.
37858c86148SMariusz ZaborskiThe
37958c86148SMariusz Zaborski.Fa flags
38058c86148SMariusz Zaborskiargument defines what type of the top level nvlist is expected to be.
38158c86148SMariusz ZaborskiFlags are set up using the
38258c86148SMariusz Zaborski.Fn nvlist_create
38358c86148SMariusz Zaborskifunction.
38458c86148SMariusz ZaborskiIf the nvlist flags do not match the flags passed to
38558c86148SMariusz Zaborski.Fn nvlist_xfer ,
38658c86148SMariusz Zaborskithe nvlist will not be returned.
38758c86148SMariusz ZaborskiEvery nested nvlist list should be checked using
38858c86148SMariusz Zaborski.Fn nvlist_flags
38958c86148SMariusz Zaborskifunction.
39058c86148SMariusz ZaborskiThe given nvlist is always destroyed.
39158c86148SMariusz Zaborski.Pp
39258c86148SMariusz ZaborskiThe
39358c86148SMariusz Zaborski.Fn nvlist_next
39458c86148SMariusz Zaborskifunction iterates over the given nvlist returning names and types of subsequent
39558c86148SMariusz Zaborskielements.
39658c86148SMariusz ZaborskiThe
39758c86148SMariusz Zaborski.Fa cookiep
39858c86148SMariusz Zaborskiargument allows the function to figure out which element should be returned
39958c86148SMariusz Zaborskinext.
40058c86148SMariusz ZaborskiThe
40158c86148SMariusz Zaborski.Va *cookiep
40258c86148SMariusz Zaborskishould be set to
40358c86148SMariusz Zaborski.Dv NULL
40458c86148SMariusz Zaborskifor the first call and should not be changed later.
40558c86148SMariusz ZaborskiReturning
40658c86148SMariusz Zaborski.Dv NULL
40758c86148SMariusz Zaborskimeans there are no more elements on the nvlist.
40858c86148SMariusz ZaborskiThe
40958c86148SMariusz Zaborski.Fa typep
41058c86148SMariusz Zaborskiargument can be NULL.
41158c86148SMariusz ZaborskiElements may not be removed from the nvlist while traversing it.
41258c86148SMariusz ZaborskiThe nvlist must not be in error state.
413*89ca10c6SMariusz ZaborskiNote that
414*89ca10c6SMariusz Zaborski.Fn nvlist_next
415*89ca10c6SMariusz Zaborskiwill handle
416*89ca10c6SMariusz Zaborski.Va cookiep
417*89ca10c6SMariusz Zaborskibeing set to
418*89ca10c6SMariusz Zaborski.Dv NULL .
419*89ca10c6SMariusz ZaborskiIn this case first element is returned or
420*89ca10c6SMariusz Zaborski.Dv NULL
421*89ca10c6SMariusz Zaborskiif nvlist is empty.
422*89ca10c6SMariusz ZaborskiThis behavior simplifies removing the first element from the list.
42358c86148SMariusz Zaborski.Pp
42458c86148SMariusz ZaborskiThe
42558c86148SMariusz Zaborski.Fn nvlist_exists
42658c86148SMariusz Zaborskifunction returns
42758c86148SMariusz Zaborski.Dv true
42858c86148SMariusz Zaborskiif element of the given name exists (besides of its type) or
42958c86148SMariusz Zaborski.Dv false
43058c86148SMariusz Zaborskiotherwise.
43158c86148SMariusz ZaborskiThe nvlist must not be in error state.
43258c86148SMariusz Zaborski.Pp
43358c86148SMariusz ZaborskiThe
43458c86148SMariusz Zaborski.Fn nvlist_exists_type
43558c86148SMariusz Zaborskifunction returns
43658c86148SMariusz Zaborski.Dv true
43758c86148SMariusz Zaborskiif element of the given name and the given type exists or
43858c86148SMariusz Zaborski.Dv false
43958c86148SMariusz Zaborskiotherwise.
44058c86148SMariusz ZaborskiThe nvlist must not be in error state.
44158c86148SMariusz Zaborski.Pp
44258c86148SMariusz ZaborskiThe
44358c86148SMariusz Zaborski.Fn nvlist_exists_null ,
44458c86148SMariusz Zaborski.Fn nvlist_exists_bool ,
44558c86148SMariusz Zaborski.Fn nvlist_exists_number ,
44658c86148SMariusz Zaborski.Fn nvlist_exists_string ,
44758c86148SMariusz Zaborski.Fn nvlist_exists_nvlist ,
44858c86148SMariusz Zaborski.Fn nvlist_exists_descriptor ,
44958c86148SMariusz Zaborski.Fn nvlist_exists_binary
45058c86148SMariusz Zaborskifunctions return
45158c86148SMariusz Zaborski.Dv true
45258c86148SMariusz Zaborskiif element of the given name and the given type determined by the function name
45358c86148SMariusz Zaborskiexists or
45458c86148SMariusz Zaborski.Dv false
45558c86148SMariusz Zaborskiotherwise.
45658c86148SMariusz ZaborskiThe nvlist must not be in error state.
45758c86148SMariusz Zaborski.Pp
45858c86148SMariusz ZaborskiThe
45958c86148SMariusz Zaborski.Fn nvlist_add_null ,
46058c86148SMariusz Zaborski.Fn nvlist_add_bool ,
46158c86148SMariusz Zaborski.Fn nvlist_add_number ,
46258c86148SMariusz Zaborski.Fn nvlist_add_string ,
46358c86148SMariusz Zaborski.Fn nvlist_add_stringf ,
46458c86148SMariusz Zaborski.Fn nvlist_add_stringv ,
46558c86148SMariusz Zaborski.Fn nvlist_add_nvlist ,
46658c86148SMariusz Zaborski.Fn nvlist_add_descriptor ,
46758c86148SMariusz Zaborski.Fn nvlist_add_binary
46858c86148SMariusz Zaborskifunctions add element to the given nvlist.
46958c86148SMariusz ZaborskiWhen adding string or binary buffor the functions will allocate memory
47058c86148SMariusz Zaborskiand copy the data over.
47158c86148SMariusz ZaborskiWhen adding nvlist, the nvlist will be cloned and clone will be added.
47258c86148SMariusz ZaborskiWhen adding descriptor, the descriptor will be duplicated using the
47358c86148SMariusz Zaborski.Xr dup 2
47458c86148SMariusz Zaborskisystem call and the new descriptor will be added.
47558c86148SMariusz ZaborskiIf an error occurs while adding new element, internal error is set which can be
47658c86148SMariusz Zaborskiexamined using the
47758c86148SMariusz Zaborski.Fn nvlist_error
47858c86148SMariusz Zaborskifunction.
47958c86148SMariusz Zaborski.Pp
48058c86148SMariusz ZaborskiThe
48158c86148SMariusz Zaborski.Fn nvlist_move_string ,
48258c86148SMariusz Zaborski.Fn nvlist_move_nvlist ,
48358c86148SMariusz Zaborski.Fn nvlist_move_descriptor ,
48458c86148SMariusz Zaborski.Fn nvlist_move_binary
48558c86148SMariusz Zaborskifunctions add new element to the given nvlist, but unlike
48658c86148SMariusz Zaborski.Fn nvlist_add_<type>
48758c86148SMariusz Zaborskifunctions they will consume the given resource.
48858c86148SMariusz ZaborskiIf an error occurs while adding new element, the resource is destroyed and
48958c86148SMariusz Zaborskiinternal error is set which can be examined using the
49058c86148SMariusz Zaborski.Fn nvlist_error
49158c86148SMariusz Zaborskifunction.
49258c86148SMariusz Zaborski.Pp
49358c86148SMariusz ZaborskiThe
49458c86148SMariusz Zaborski.Fn nvlist_get_bool ,
49558c86148SMariusz Zaborski.Fn nvlist_get_number ,
49658c86148SMariusz Zaborski.Fn nvlist_get_string ,
49758c86148SMariusz Zaborski.Fn nvlist_get_nvlist ,
49858c86148SMariusz Zaborski.Fn nvlist_get_descriptor ,
49958c86148SMariusz Zaborski.Fn nvlist_get_binary
50058c86148SMariusz Zaborskifunctions allow to obtain value of the given name.
50158c86148SMariusz ZaborskiIn case of string, nvlist, descriptor or binary, returned resource should
50258c86148SMariusz Zaborskinot be modified - it still belongs to the nvlist.
50358c86148SMariusz ZaborskiIf element of the given name does not exist, the program will be aborted.
50458c86148SMariusz ZaborskiTo avoid that the caller should check for existence before trying to obtain
50558c86148SMariusz Zaborskithe value or use
50658c86148SMariusz Zaborski.Xr dnvlist 3
50758c86148SMariusz Zaborskiextension, which allows to provide default value for a missing element.
50858c86148SMariusz ZaborskiThe nvlist must not be in error state.
50958c86148SMariusz Zaborski.Pp
51058c86148SMariusz ZaborskiThe
51158c86148SMariusz Zaborski.Fn nvlist_get_parent
51258c86148SMariusz Zaborskifunction allows to obtain the parent nvlist from the nested nvlist.
51358c86148SMariusz Zaborski.Pp
51458c86148SMariusz ZaborskiThe
51558c86148SMariusz Zaborski.Fn nvlist_take_bool ,
51658c86148SMariusz Zaborski.Fn nvlist_take_number ,
51758c86148SMariusz Zaborski.Fn nvlist_take_string ,
51858c86148SMariusz Zaborski.Fn nvlist_take_nvlist ,
51958c86148SMariusz Zaborski.Fn nvlist_take_descriptor ,
52058c86148SMariusz Zaborski.Fn nvlist_take_binary
52158c86148SMariusz Zaborskifunctions return value associated with the given name and remove the element
52258c86148SMariusz Zaborskifrom the nvlist.
52358c86148SMariusz ZaborskiIn case of string and binary values, the caller is responsible for free returned
52458c86148SMariusz Zaborskimemory using the
52558c86148SMariusz Zaborski.Xr free 3
52658c86148SMariusz Zaborskifunction.
52758c86148SMariusz ZaborskiIn case of nvlist, the caller is responsible for destroying returned nvlist
52858c86148SMariusz Zaborskiusing the
52958c86148SMariusz Zaborski.Fn nvlist_destroy
53058c86148SMariusz Zaborskifunction.
53158c86148SMariusz ZaborskiIn case of descriptor, the caller is responsible for closing returned descriptor
53258c86148SMariusz Zaborskiusing the
53358c86148SMariusz Zaborski.Fn close 2
53458c86148SMariusz Zaborskisystem call.
53558c86148SMariusz ZaborskiIf element of the given name does not exist, the program will be aborted.
53658c86148SMariusz ZaborskiTo avoid that the caller should check for existence before trying to obtain
53758c86148SMariusz Zaborskithe value or use
53858c86148SMariusz Zaborski.Xr dnvlist 3
53958c86148SMariusz Zaborskiextension, which allows to provide default value for a missing element.
54058c86148SMariusz ZaborskiThe nvlist must not be in error state.
54158c86148SMariusz Zaborski.Pp
54258c86148SMariusz ZaborskiThe
54358c86148SMariusz Zaborski.Fn nvlist_free
54458c86148SMariusz Zaborskifunction removes element of the given name from the nvlist (besides of its type)
54558c86148SMariusz Zaborskiand frees all resources associated with it.
54658c86148SMariusz ZaborskiIf element of the given name does not exist, the program will be aborted.
54758c86148SMariusz ZaborskiThe nvlist must not be in error state.
54858c86148SMariusz Zaborski.Pp
54958c86148SMariusz ZaborskiThe
55058c86148SMariusz Zaborski.Fn nvlist_free_type
55158c86148SMariusz Zaborskifunction removes element of the given name and the given type from the nvlist
55258c86148SMariusz Zaborskiand frees all resources associated with it.
55358c86148SMariusz ZaborskiIf element of the given name and the given type does not exist, the program
55458c86148SMariusz Zaborskiwill be aborted.
55558c86148SMariusz ZaborskiThe nvlist must not be in error state.
55658c86148SMariusz Zaborski.Pp
55758c86148SMariusz ZaborskiThe
55858c86148SMariusz Zaborski.Fn nvlist_free_null ,
55958c86148SMariusz Zaborski.Fn nvlist_free_bool ,
56058c86148SMariusz Zaborski.Fn nvlist_free_number ,
56158c86148SMariusz Zaborski.Fn nvlist_free_string ,
56258c86148SMariusz Zaborski.Fn nvlist_free_nvlist ,
56358c86148SMariusz Zaborski.Fn nvlist_free_descriptor ,
56458c86148SMariusz Zaborski.Fn nvlist_free_binary
56558c86148SMariusz Zaborskifunctions remove element of the given name and the given type determined by the
56658c86148SMariusz Zaborskifunction name from the nvlist and free all resources associated with it.
56758c86148SMariusz ZaborskiIf element of the given name and the given type does not exist, the program
56858c86148SMariusz Zaborskiwill be aborted.
56958c86148SMariusz ZaborskiThe nvlist must not be in error state.
57058c86148SMariusz Zaborski.Sh EXAMPLES
57158c86148SMariusz ZaborskiThe following example demonstrates how to prepare an nvlist and send it over
57258c86148SMariusz Zaborski.Xr unix 4
57358c86148SMariusz Zaborskidomain socket.
57458c86148SMariusz Zaborski.Bd -literal
57558c86148SMariusz Zaborskinvlist_t *nvl;
57658c86148SMariusz Zaborskiint fd;
57758c86148SMariusz Zaborski
57858c86148SMariusz Zaborskifd = open("/tmp/foo", O_RDONLY);
57958c86148SMariusz Zaborskiif (fd < 0)
58058c86148SMariusz Zaborski        err(1, "open(\\"/tmp/foo\\") failed");
58158c86148SMariusz Zaborski
58258c86148SMariusz Zaborskinvl = nvlist_create(0);
58358c86148SMariusz Zaborski/*
58458c86148SMariusz Zaborski * There is no need to check if nvlist_create() succeeded,
58558c86148SMariusz Zaborski * as the nvlist_add_<type>() functions can cope.
58658c86148SMariusz Zaborski * If it failed, nvlist_send() will fail.
58758c86148SMariusz Zaborski */
58858c86148SMariusz Zaborskinvlist_add_string(nvl, "filename", "/tmp/foo");
58958c86148SMariusz Zaborskinvlist_add_number(nvl, "flags", O_RDONLY);
59058c86148SMariusz Zaborski/*
59158c86148SMariusz Zaborski * We just want to send the descriptor, so we can give it
59258c86148SMariusz Zaborski * for the nvlist to consume (that's why we use nvlist_move
59358c86148SMariusz Zaborski * not nvlist_add).
59458c86148SMariusz Zaborski */
59558c86148SMariusz Zaborskinvlist_move_descriptor(nvl, "fd", fd);
59658c86148SMariusz Zaborskiif (nvlist_send(sock, nvl) < 0) {
59758c86148SMariusz Zaborski	nvlist_destroy(nvl);
59858c86148SMariusz Zaborski	err(1, "nvlist_send() failed");
59958c86148SMariusz Zaborski}
60058c86148SMariusz Zaborskinvlist_destroy(nvl);
60158c86148SMariusz Zaborski.Ed
60258c86148SMariusz Zaborski.Pp
60358c86148SMariusz ZaborskiReceiving nvlist and getting data:
60458c86148SMariusz Zaborski.Bd -literal
60558c86148SMariusz Zaborskinvlist_t *nvl;
60658c86148SMariusz Zaborskiconst char *command;
60758c86148SMariusz Zaborskichar *filename;
60858c86148SMariusz Zaborskiint fd;
60958c86148SMariusz Zaborski
61058c86148SMariusz Zaborskinvl = nvlist_recv(sock, 0);
61158c86148SMariusz Zaborskiif (nvl == NULL)
61258c86148SMariusz Zaborski	err(1, "nvlist_recv() failed");
61358c86148SMariusz Zaborski
61458c86148SMariusz Zaborski/* For command we take pointer to nvlist's buffer. */
61558c86148SMariusz Zaborskicommand = nvlist_get_string(nvl, "command");
61658c86148SMariusz Zaborski/*
61758c86148SMariusz Zaborski * For filename we remove it from the nvlist and take
61858c86148SMariusz Zaborski * ownership of the buffer.
61958c86148SMariusz Zaborski */
62058c86148SMariusz Zaborskifilename = nvlist_take_string(nvl, "filename");
62158c86148SMariusz Zaborski/* The same for the descriptor. */
62258c86148SMariusz Zaborskifd = nvlist_take_descriptor(nvl, "fd");
62358c86148SMariusz Zaborski
62458c86148SMariusz Zaborskiprintf("command=%s filename=%s fd=%d\n", command, filename, fd);
62558c86148SMariusz Zaborski
62658c86148SMariusz Zaborskinvlist_destroy(nvl);
62758c86148SMariusz Zaborskifree(filename);
62858c86148SMariusz Zaborskiclose(fd);
62958c86148SMariusz Zaborski/* command was freed by nvlist_destroy() */
63058c86148SMariusz Zaborski.Ed
63158c86148SMariusz Zaborski.Pp
63258c86148SMariusz ZaborskiIterating over nvlist:
63358c86148SMariusz Zaborski.Bd -literal
63458c86148SMariusz Zaborskinvlist_t *nvl;
63558c86148SMariusz Zaborskiconst char *name;
63658c86148SMariusz Zaborskivoid *cookie;
63758c86148SMariusz Zaborskiint type;
63858c86148SMariusz Zaborski
63958c86148SMariusz Zaborskinvl = nvlist_recv(sock, 0);
64058c86148SMariusz Zaborskiif (nvl == NULL)
64158c86148SMariusz Zaborski	err(1, "nvlist_recv() failed");
64258c86148SMariusz Zaborski
64358c86148SMariusz Zaborskicookie = NULL;
64458c86148SMariusz Zaborskiwhile ((name = nvlist_next(nvl, &type, &cookie)) != NULL) {
64558c86148SMariusz Zaborski	printf("%s=", name);
64658c86148SMariusz Zaborski	switch (type) {
64758c86148SMariusz Zaborski	case NV_TYPE_NUMBER:
64858c86148SMariusz Zaborski		printf("%ju", (uintmax_t)nvlist_get_number(nvl, name));
64958c86148SMariusz Zaborski		break;
65058c86148SMariusz Zaborski	case NV_TYPE_STRING:
65158c86148SMariusz Zaborski		printf("%s", nvlist_get_string(nvl, name));
65258c86148SMariusz Zaborski		break;
65358c86148SMariusz Zaborski	default:
65458c86148SMariusz Zaborski		printf("N/A");
65558c86148SMariusz Zaborski		break;
65658c86148SMariusz Zaborski	}
65758c86148SMariusz Zaborski	printf("\\n");
65858c86148SMariusz Zaborski}
65958c86148SMariusz Zaborski.Ed
66058c86148SMariusz Zaborski.Pp
66158c86148SMariusz ZaborskiIterating over every nested nvlist:
66258c86148SMariusz Zaborski.Bd -literal
66358c86148SMariusz Zaborskinvlist_t *nvl;
66458c86148SMariusz Zaborskiconst char *name;
66558c86148SMariusz Zaborskivoid *cookie;
66658c86148SMariusz Zaborskiint type;
66758c86148SMariusz Zaborski
66858c86148SMariusz Zaborskinvl = nvlist_recv(sock, 0);
66958c86148SMariusz Zaborskiif (nvl == NULL)
67058c86148SMariusz Zaborski	err(1, "nvlist_recv() failed");
67158c86148SMariusz Zaborski
67258c86148SMariusz Zaborskicookie = NULL;
67358c86148SMariusz Zaborskido {
67458c86148SMariusz Zaborski	while ((name = nvlist_next(nvl, &type, &cookie)) != NULL) {
67558c86148SMariusz Zaborski		if (type == NV_TYPE_NVLIST) {
67658c86148SMariusz Zaborski			nvl = nvlist_get_nvlist(nvl, name);
67758c86148SMariusz Zaborski			cookie = NULL;
67858c86148SMariusz Zaborski		}
67958c86148SMariusz Zaborski	}
68058c86148SMariusz Zaborski} while ((nvl = nvlist_get_parent(nvl, &cookie)) != NULL);
68158c86148SMariusz Zaborski.Ed
68258c86148SMariusz Zaborski.Sh SEE ALSO
68358c86148SMariusz Zaborski.Xr close 2 ,
68458c86148SMariusz Zaborski.Xr dup 2 ,
68558c86148SMariusz Zaborski.Xr open 2 ,
68658c86148SMariusz Zaborski.Xr err 3 ,
68758c86148SMariusz Zaborski.Xr free 3 ,
68858c86148SMariusz Zaborski.Xr printf 3 ,
68958c86148SMariusz Zaborski.Xr unix 4
69058c86148SMariusz Zaborski.Sh HISTORY
69158c86148SMariusz ZaborskiThe
69258c86148SMariusz Zaborski.Nm libnv
69358c86148SMariusz Zaborskilibrary appeared in
69458c86148SMariusz Zaborski.Fx 11.0 .
69558c86148SMariusz Zaborski.Sh AUTHORS
69658c86148SMariusz Zaborski.An -nosplit
69758c86148SMariusz ZaborskiThe
69858c86148SMariusz Zaborski.Nm libnv
69958c86148SMariusz Zaborskilibrary was implemented by
70058c86148SMariusz Zaborski.An Pawel Jakub Dawidek Aq Mt pawel@dawidek.net
70158c86148SMariusz Zaborskiunder sponsorship from the FreeBSD Foundation.
702