Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/freebsd/poudriere.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Drewery <bryan@shatow.net>2016-01-07 23:53:08 +0300
committerBryan Drewery <bryan@shatow.net>2016-01-07 23:53:08 +0300
commit83a8316d1cd0ab34470d8ed83cdd9fbc4d3dac42 (patch)
treecf2894b690b12f3b1caa5e380b10c813123d1358 /external
parentdc0c33836e153948399e24ef07a18c1873a80894 (diff)
Update libnv to the latest head @ r293361
Diffstat (limited to 'external')
-rw-r--r--external/libnv/Makefile159
-rw-r--r--external/libnv/Makefile.depend18
-rw-r--r--external/libnv/common_impl.h2
-rw-r--r--external/libnv/msgio.c2
-rw-r--r--external/libnv/msgio.h2
-rw-r--r--external/libnv/nv.3644
-rw-r--r--external/libnv/subr_dnvlist.c294
-rw-r--r--external/libnv/sys/dnv.h35
-rw-r--r--external/libnv/sys/dnvlist.c128
-rw-r--r--external/libnv/sys/nv.h210
-rw-r--r--external/libnv/sys/nv_impl.h91
-rw-r--r--external/libnv/sys/nvlist.c (renamed from external/libnv/subr_nvlist.c)1496
-rw-r--r--external/libnv/sys/nvlist_impl.h11
-rw-r--r--external/libnv/sys/nvpair.c (renamed from external/libnv/subr_nvpair.c)1235
-rw-r--r--external/libnv/sys/nvpair_impl.h27
-rw-r--r--external/libnv/tests/dnv_tests.cc577
-rw-r--r--external/libnv/tests/nv_tests.cc1254
-rw-r--r--external/libnv/tests/nvlist_add_test.c196
-rw-r--r--external/libnv/tests/nvlist_exists_test.c321
-rw-r--r--external/libnv/tests/nvlist_free_test.c221
-rw-r--r--external/libnv/tests/nvlist_get_test.c182
-rw-r--r--external/libnv/tests/nvlist_move_test.c161
-rw-r--r--external/libnv/tests/nvlist_send_recv_test.c342
23 files changed, 1996 insertions, 5612 deletions
diff --git a/external/libnv/Makefile b/external/libnv/Makefile
index c8179d9e..38ec0098 100644
--- a/external/libnv/Makefile
+++ b/external/libnv/Makefile
@@ -1,4 +1,4 @@
-# $FreeBSD: head/lib/libnv/Makefile 279439 2015-03-01 00:34:27Z rstone $
+# $FreeBSD$
SHLIBDIR?= /lib
@@ -7,162 +7,13 @@ SHLIBDIR?= /lib
LIB= nv
SHLIB_MAJOR= 0
-.PATH: ${.CURDIR}/../../sys/kern ${.CURDIR}/../../sys/sys
+.PATH: ${.CURDIR}/../../sys/contrib/libnv ${.CURDIR}/../../sys/sys
CFLAGS+=-I${.CURDIR}/../../sys -I${.CURDIR}
-SRCS= subr_dnvlist.c
+SRCS= dnvlist.c
SRCS+= msgio.c
-SRCS+= subr_nvlist.c
-SRCS+= subr_nvpair.c
-
-INCS= dnv.h
-INCS+= nv.h
-
-MAN+= nv.3
-
-MLINKS+=nv.3 libnv.3 \
- nv.3 nvlist.3
-MLINKS+=nv.3 nvlist_create.3 \
- nv.3 nvlist_destroy.3 \
- nv.3 nvlist_error.3 \
- nv.3 nvlist_set_error.3 \
- nv.3 nvlist_empty.3 \
- nv.3 nvlist_clone.3 \
- nv.3 nvlist_dump.3 \
- nv.3 nvlist_fdump.3 \
- nv.3 nvlist_size.3 \
- nv.3 nvlist_pack.3 \
- nv.3 nvlist_unpack.3 \
- nv.3 nvlist_send.3 \
- nv.3 nvlist_recv.3 \
- nv.3 nvlist_xfer.3 \
- nv.3 nvlist_next.3 \
- nv.3 nvlist_exists.3 \
- nv.3 nvlist_exists_type.3 \
- nv.3 nvlist_exists_null.3 \
- nv.3 nvlist_exists_bool.3 \
- nv.3 nvlist_exists_number.3 \
- nv.3 nvlist_exists_string.3 \
- nv.3 nvlist_exists_nvlist.3 \
- nv.3 nvlist_exists_descriptor.3 \
- nv.3 nvlist_exists_binary.3 \
- nv.3 nvlist_add_null.3 \
- nv.3 nvlist_add_bool.3 \
- nv.3 nvlist_add_number.3 \
- nv.3 nvlist_add_string.3 \
- nv.3 nvlist_add_stringf.3 \
- nv.3 nvlist_add_stringv.3 \
- nv.3 nvlist_add_nvlist.3 \
- nv.3 nvlist_add_descriptor.3 \
- nv.3 nvlist_add_binary.3 \
- nv.3 nvlist_move_string.3 \
- nv.3 nvlist_move_nvlist.3 \
- nv.3 nvlist_move_descriptor.3 \
- nv.3 nvlist_move_binary.3 \
- nv.3 nvlist_get_bool.3 \
- nv.3 nvlist_get_number.3 \
- nv.3 nvlist_get_string.3 \
- nv.3 nvlist_get_nvlist.3 \
- nv.3 nvlist_get_descriptor.3 \
- nv.3 nvlist_get_binary.3 \
- nv.3 nvlist_get_parent.3 \
- nv.3 nvlist_take_bool.3 \
- nv.3 nvlist_take_number.3 \
- nv.3 nvlist_take_string.3 \
- nv.3 nvlist_take_nvlist.3 \
- nv.3 nvlist_take_descriptor.3 \
- nv.3 nvlist_take_binary.3 \
- nv.3 nvlist_free.3 \
- nv.3 nvlist_free_type.3 \
- nv.3 nvlist_free_null.3 \
- nv.3 nvlist_free_bool.3 \
- nv.3 nvlist_free_number.3 \
- nv.3 nvlist_free_string.3 \
- nv.3 nvlist_free_nvlist.3 \
- nv.3 nvlist_free_descriptor.3 \
- nv.3 nvlist_free_binary.3
-MLINKS+=nv.3 nvlist_existsf.3 \
- nv.3 nvlist_existsf_type.3 \
- nv.3 nvlist_existsf_null.3 \
- nv.3 nvlist_existsf_bool.3 \
- nv.3 nvlist_existsf_number.3 \
- nv.3 nvlist_existsf_string.3 \
- nv.3 nvlist_existsf_nvlist.3 \
- nv.3 nvlist_existsf_descriptor.3 \
- nv.3 nvlist_existsf_binary.3 \
- nv.3 nvlist_addf_null.3 \
- nv.3 nvlist_addf_bool.3 \
- nv.3 nvlist_addf_number.3 \
- nv.3 nvlist_addf_string.3 \
- nv.3 nvlist_addf_nvlist.3 \
- nv.3 nvlist_addf_descriptor.3 \
- nv.3 nvlist_addf_binary.3 \
- nv.3 nvlist_movef_string.3 \
- nv.3 nvlist_movef_nvlist.3 \
- nv.3 nvlist_movef_descriptor.3 \
- nv.3 nvlist_movef_binary.3 \
- nv.3 nvlist_getf_bool.3 \
- nv.3 nvlist_getf_number.3 \
- nv.3 nvlist_getf_string.3 \
- nv.3 nvlist_getf_nvlist.3 \
- nv.3 nvlist_getf_descriptor.3 \
- nv.3 nvlist_getf_binary.3 \
- nv.3 nvlist_takef_bool.3 \
- nv.3 nvlist_takef_number.3 \
- nv.3 nvlist_takef_string.3 \
- nv.3 nvlist_takef_nvlist.3 \
- nv.3 nvlist_takef_descriptor.3 \
- nv.3 nvlist_takef_binary.3 \
- nv.3 nvlist_freef.3 \
- nv.3 nvlist_freef_type.3 \
- nv.3 nvlist_freef_null.3 \
- nv.3 nvlist_freef_bool.3 \
- nv.3 nvlist_freef_number.3 \
- nv.3 nvlist_freef_string.3 \
- nv.3 nvlist_freef_nvlist.3 \
- nv.3 nvlist_freef_descriptor.3 \
- nv.3 nvlist_freef_binary.3
-MLINKS+=nv.3 nvlist_existsv.3 \
- nv.3 nvlist_existsv_type.3 \
- nv.3 nvlist_existsv_null.3 \
- nv.3 nvlist_existsv_bool.3 \
- nv.3 nvlist_existsv_number.3 \
- nv.3 nvlist_existsv_string.3 \
- nv.3 nvlist_existsv_nvlist.3 \
- nv.3 nvlist_existsv_descriptor.3 \
- nv.3 nvlist_existsv_binary.3 \
- nv.3 nvlist_addv_null.3 \
- nv.3 nvlist_addv_bool.3 \
- nv.3 nvlist_addv_number.3 \
- nv.3 nvlist_addv_string.3 \
- nv.3 nvlist_addv_nvlist.3 \
- nv.3 nvlist_addv_descriptor.3 \
- nv.3 nvlist_addv_binary.3 \
- nv.3 nvlist_movev_string.3 \
- nv.3 nvlist_movev_nvlist.3 \
- nv.3 nvlist_movev_descriptor.3 \
- nv.3 nvlist_movev_binary.3 \
- nv.3 nvlist_getv_bool.3 \
- nv.3 nvlist_getv_number.3 \
- nv.3 nvlist_getv_string.3 \
- nv.3 nvlist_getv_nvlist.3 \
- nv.3 nvlist_getv_descriptor.3 \
- nv.3 nvlist_getv_binary.3 \
- nv.3 nvlist_takev_bool.3 \
- nv.3 nvlist_takev_number.3 \
- nv.3 nvlist_takev_string.3 \
- nv.3 nvlist_takev_nvlist.3 \
- nv.3 nvlist_takev_descriptor.3 \
- nv.3 nvlist_takev_binary.3 \
- nv.3 nvlist_freev.3 \
- nv.3 nvlist_freev_type.3 \
- nv.3 nvlist_freev_null.3 \
- nv.3 nvlist_freev_bool.3 \
- nv.3 nvlist_freev_number.3 \
- nv.3 nvlist_freev_string.3 \
- nv.3 nvlist_freev_nvlist.3 \
- nv.3 nvlist_freev_descriptor.3 \
- nv.3 nvlist_freev_binary.3
+SRCS+= nvlist.c
+SRCS+= nvpair.c
WARNS?= 6
diff --git a/external/libnv/Makefile.depend b/external/libnv/Makefile.depend
new file mode 100644
index 00000000..3646e2e2
--- /dev/null
+++ b/external/libnv/Makefile.depend
@@ -0,0 +1,18 @@
+# $FreeBSD$
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+ gnu/lib/csu \
+ gnu/lib/libgcc \
+ include \
+ include/xlocale \
+ lib/${CSU_DIR} \
+ lib/libc \
+ lib/libcompiler_rt \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/external/libnv/common_impl.h b/external/libnv/common_impl.h
index 04bd4533..5af4db2b 100644
--- a/external/libnv/common_impl.h
+++ b/external/libnv/common_impl.h
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: head/lib/libnv/common_impl.h 258065 2013-11-12 19:39:14Z pjd $
+ * $FreeBSD$
*/
#ifndef _COMMON_IMPL_H_
diff --git a/external/libnv/msgio.c b/external/libnv/msgio.c
index 93c736ed..27620a18 100644
--- a/external/libnv/msgio.c
+++ b/external/libnv/msgio.c
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/lib/libnv/msgio.c 271578 2014-09-14 09:27:12Z pjd $");
+__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/socket.h>
diff --git a/external/libnv/msgio.h b/external/libnv/msgio.h
index 8d888d47..fd5e462a 100644
--- a/external/libnv/msgio.h
+++ b/external/libnv/msgio.h
@@ -28,7 +28,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: head/lib/libnv/msgio.h 259430 2013-12-15 22:58:09Z pjd $
+ * $FreeBSD$
*/
#ifndef _MSGIO_H_
diff --git a/external/libnv/nv.3 b/external/libnv/nv.3
deleted file mode 100644
index dd9a661a..00000000
--- a/external/libnv/nv.3
+++ /dev/null
@@ -1,644 +0,0 @@
-.\"
-.\" Copyright (c) 2013 The FreeBSD Foundation
-.\" All rights reserved.
-.\"
-.\" This documentation was written by Pawel Jakub Dawidek under sponsorship
-.\" the FreeBSD Foundation.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD: head/lib/libnv/nv.3 279434 2015-03-01 00:22:23Z rstone $
-.\"
-.Dd January 30, 2015
-.Dt NV 3
-.Os
-.Sh NAME
-.Nm nvlist_create ,
-.Nm nvlist_destroy ,
-.Nm nvlist_error ,
-.Nm nvlist_set_error ,
-.Nm nvlist_empty ,
-.Nm nvlist_exists ,
-.Nm nvlist_free ,
-.Nm nvlist_clone ,
-.Nm nvlist_dump ,
-.Nm nvlist_fdump ,
-.Nm nvlist_size ,
-.Nm nvlist_pack ,
-.Nm nvlist_unpack ,
-.Nm nvlist_send ,
-.Nm nvlist_recv ,
-.Nm nvlist_xfer ,
-.Nm nvlist_next ,
-.Nm nvlist_add ,
-.Nm nvlist_move ,
-.Nm nvlist_get ,
-.Nm nvlist_take
-.Nd "library for name/value pairs"
-.Sh LIBRARY
-.Lb libnv
-.Sh SYNOPSIS
-.In nv.h
-.Ft "nvlist_t *"
-.Fn nvlist_create "int flags"
-.Ft void
-.Fn nvlist_destroy "nvlist_t *nvl"
-.Ft int
-.Fn nvlist_error "const nvlist_t *nvl"
-.Ft void
-.Fn nvlist_set_error "nvlist_t *nvl, int error"
-.Ft bool
-.Fn nvlist_empty "const nvlist_t *nvl"
-.\"
-.Ft "nvlist_t *"
-.Fn nvlist_clone "const nvlist_t *nvl"
-.\"
-.Ft void
-.Fn nvlist_dump "const nvlist_t *nvl, int fd"
-.Ft void
-.Fn nvlist_fdump "const nvlist_t *nvl, FILE *fp"
-.\"
-.Ft size_t
-.Fn nvlist_size "const nvlist_t *nvl"
-.Ft "void *"
-.Fn nvlist_pack "const nvlist_t *nvl" "size_t *sizep"
-.Ft "nvlist_t *"
-.Fn nvlist_unpack "const void *buf" "size_t size"
-.\"
-.Ft int
-.Fn nvlist_send "int sock" "const nvlist_t *nvl"
-.Ft "nvlist_t *"
-.Fn nvlist_recv "int sock"
-.Ft "nvlist_t *"
-.Fn nvlist_xfer "int sock" "nvlist_t *nvl"
-.\"
-.Ft "const char *"
-.Fn nvlist_next "const nvlist_t *nvl" "int *typep" "void **cookiep"
-.\"
-.Ft bool
-.Fn nvlist_exists "const nvlist_t *nvl" "const char *name"
-.Ft bool
-.Fn nvlist_exists_type "const nvlist_t *nvl" "const char *name" "int type"
-.Ft bool
-.Fn nvlist_exists_null "const nvlist_t *nvl" "const char *name"
-.Ft bool
-.Fn nvlist_exists_bool "const nvlist_t *nvl" "const char *name"
-.Ft bool
-.Fn nvlist_exists_number "const nvlist_t *nvl" "const char *name"
-.Ft bool
-.Fn nvlist_exists_string "const nvlist_t *nvl" "const char *name"
-.Ft bool
-.Fn nvlist_exists_nvlist "const nvlist_t *nvl" "const char *name"
-.Ft bool
-.Fn nvlist_exists_descriptor "const nvlist_t *nvl" "const char *name"
-.Ft bool
-.Fn nvlist_exists_binary "const nvlist_t *nvl" "const char *name"
-.\"
-.Ft void
-.Fn nvlist_add_null "nvlist_t *nvl" "const char *name"
-.Ft void
-.Fn nvlist_add_bool "nvlist_t *nvl" "const char *name" "bool value"
-.Ft void
-.Fn nvlist_add_number "nvlist_t *nvl" "const char *name" "uint64_t value"
-.Ft void
-.Fn nvlist_add_string "nvlist_t *nvl" "const char *name" "const char *value"
-.Ft void
-.Fn nvlist_add_stringf "nvlist_t *nvl" "const char *name" "const char *valuefmt" "..."
-.Ft void
-.Fn nvlist_add_stringv "nvlist_t *nvl" "const char *name" "const char *valuefmt" "va_list valueap"
-.Ft void
-.Fn nvlist_add_nvlist "nvlist_t *nvl" "const char *name" "const nvlist_t *value"
-.Ft void
-.Fn nvlist_add_descriptor "nvlist_t *nvl" "const char *name" "int value"
-.Ft void
-.Fn nvlist_add_binary "nvlist_t *nvl" "const char *name" "const void *value" "size_t size"
-.\"
-.Ft void
-.Fn nvlist_move_string "nvlist_t *nvl" "const char *name" "char *value"
-.Ft void
-.Fn nvlist_move_nvlist "nvlist_t *nvl" "const char *name" "nvlist_t *value"
-.Ft void
-.Fn nvlist_move_descriptor "nvlist_t *nvl" "const char *name" "int value"
-.Ft void
-.Fn nvlist_move_binary "nvlist_t *nvl" "const char *name" "void *value" "size_t size"
-.\"
-.Ft bool
-.Fn nvlist_get_bool "const nvlist_t *nvl" "const char *name"
-.Ft uint64_t
-.Fn nvlist_get_number "const nvlist_t *nvl" "const char *name"
-.Ft "const char *"
-.Fn nvlist_get_string "const nvlist_t *nvl" "const char *name"
-.Ft "const nvlist_t *"
-.Fn nvlist_get_nvlist "const nvlist_t *nvl" "const char *name"
-.Ft int
-.Fn nvlist_get_descriptor "const nvlist_t *nvl" "const char *name"
-.Ft "const void *"
-.Fn nvlist_get_binary "const nvlist_t *nvl" "const char *name" "size_t *sizep"
-.Ft "const nvlist_t *"
-.Fn nvlist_get_parent "const nvlist_t *nvl" "void **cookiep"
-.\"
-.Ft bool
-.Fn nvlist_take_bool "nvlist_t *nvl" "const char *name"
-.Ft uint64_t
-.Fn nvlist_take_number "nvlist_t *nvl" "const char *name"
-.Ft "char *"
-.Fn nvlist_take_string "nvlist_t *nvl" "const char *name"
-.Ft "nvlist_t *"
-.Fn nvlist_take_nvlist "nvlist_t *nvl" "const char *name"
-.Ft int
-.Fn nvlist_take_descriptor "nvlist_t *nvl" "const char *name"
-.Ft "void *"
-.Fn nvlist_take_binary "nvlist_t *nvl" "const char *name" "size_t *sizep"
-.\"
-.Ft void
-.Fn nvlist_free "nvlist_t *nvl" "const char *name"
-.Ft void
-.Fn nvlist_free_type "nvlist_t *nvl" "const char *name" "int type"
-.\"
-.Ft void
-.Fn nvlist_free_null "nvlist_t *nvl" "const char *name"
-.Ft void
-.Fn nvlist_free_bool "nvlist_t *nvl" "const char *name"
-.Ft void
-.Fn nvlist_free_number "nvlist_t *nvl" "const char *name"
-.Ft void
-.Fn nvlist_free_string "nvlist_t *nvl" "const char *name"
-.Ft void
-.Fn nvlist_free_nvlist "nvlist_t *nvl" "const char *name"
-.Ft void
-.Fn nvlist_free_descriptor "nvlist_t *nvl" "const char *name"
-.Ft void
-.Fn nvlist_free_binary "nvlist_t *nvl" "const char *name"
-.Sh DESCRIPTION
-The
-.Nm libnv
-library allows to easily manage name value pairs as well as send and receive
-them over sockets.
-A group (list) of name value pairs is called an
-.Nm nvlist .
-The API supports the following data types:
-.Bl -ohang -offset indent
-.It Sy null ( NV_TYPE_NULL )
-There is no data associated with the name.
-.It Sy bool ( NV_TYPE_BOOL )
-The value can be either
-.Dv true
-or
-.Dv false .
-.It Sy number ( NV_TYPE_NUMBER )
-The value is a number stored as
-.Vt uint64_t .
-.It Sy string ( NV_TYPE_STRING )
-The value is a C string.
-.It Sy nvlist ( NV_TYPE_NVLIST )
-The value is a nested nvlist.
-.It Sy descriptor ( NV_TYPE_DESCRIPTOR )
-The value is a file descriptor.
-Note that file descriptors can be sent only over
-.Xr unix 4
-domain sockets.
-.It Sy binary ( NV_TYPE_BINARY )
-The value is a binary buffer.
-.El
-.Pp
-The
-.Fn nvlist_create
-function allocates memory and initializes an nvlist.
-.Pp
-The following flag can be provided:
-.Pp
-.Bl -tag -width "NV_FLAG_IGNORE_CASE" -compact -offset indent
-.It Dv NV_FLAG_IGNORE_CASE
-Perform case-insensitive lookups of provided names.
-.El
-.Pp
-The
-.Fn nvlist_destroy
-function destroys the given nvlist.
-Function does nothing if
-.Dv NULL
-nvlist is provided.
-Function never modifies the
-.Va errno
-global variable.
-.Pp
-The
-.Fn nvlist_error
-function returns any error value that the nvlist accumulated.
-If the given nvlist is
-.Dv NULL
-the
-.Er ENOMEM
-error will be returned.
-.Pp
-The
-.Fn nvlist_set_error
-function sets an nvlist to be in the error state.
-Subsequent calls to
-.Fn nvlist_error
-will return the given error value.
-This function cannot be used to clear the error state from an nvlist.
-This function does nothing if the nvlist is already in the error state.
-.Pp
-The
-.Fn nvlist_empty
-function returns
-.Dv true
-if the given nvlist is empty and
-.Dv false
-otherwise.
-The nvlist must not be in error state.
-.Pp
-The
-.Fn nvlist_clone
-functions clones the given nvlist.
-The clone shares no resources with its origin.
-This also means that all file descriptors that are part of the nvlist will be
-duplicated with the
-.Xr dup 2
-system call before placing them in the clone.
-.Pp
-The
-.Fn nvlist_dump
-dumps nvlist content for debugging purposes to the given file descriptor
-.Fa fd .
-.Pp
-The
-.Fn nvlist_fdump
-dumps nvlist content for debugging purposes to the given file stream
-.Fa fp .
-.Pp
-The
-.Fn nvlist_size
-function returns the size of the given nvlist after converting it to binary
-buffer with the
-.Fn nvlist_pack
-function.
-.Pp
-The
-.Fn nvlist_pack
-function converts the given nvlist to a binary buffer.
-The function allocates memory for the buffer, which should be freed with the
-.Xr free 3
-function.
-If the
-.Fa sizep
-argument is not
-.Dv NULL ,
-the size of the buffer will be stored there.
-The function returns
-.Dv NULL
-in case of an error (allocation failure).
-If the nvlist contains any file descriptors
-.Dv NULL
-will be returned.
-The nvlist must not be in error state.
-.Pp
-The
-.Fn nvlist_unpack
-function converts the given buffer to the nvlist.
-The function returns
-.Dv NULL
-in case of an error.
-.Pp
-The
-.Fn nvlist_send
-function sends the given nvlist over the socket given by the
-.Fa sock
-argument.
-Note that nvlist that contains file descriptors can only be send over
-.Xr unix 4
-domain sockets.
-.Pp
-The
-.Fn nvlist_recv
-function receives nvlist over the socket given by the
-.Fa sock
-argument.
-.Pp
-The
-.Fn nvlist_xfer
-function sends the given nvlist over the socket given by the
-.Fa sock
-argument and receives nvlist over the same socket.
-The given nvlist is always destroyed.
-.Pp
-The
-.Fn nvlist_next
-function iterates over the given nvlist returning names and types of subsequent
-elements.
-The
-.Fa cookiep
-argument allows the function to figure out which element should be returned
-next.
-The
-.Va *cookiep
-should be set to
-.Dv NULL
-for the first call and should not be changed later.
-Returning
-.Dv NULL
-means there are no more elements on the nvlist.
-The
-.Fa typep
-argument can be NULL.
-Elements may not be removed from the nvlist while traversing it.
-The nvlist must not be in error state.
-.Pp
-The
-.Fn nvlist_exists
-function returns
-.Dv true
-if element of the given name exists (besides of its type) or
-.Dv false
-otherwise.
-The nvlist must not be in error state.
-.Pp
-The
-.Fn nvlist_exists_type
-function returns
-.Dv true
-if element of the given name and the given type exists or
-.Dv false
-otherwise.
-The nvlist must not be in error state.
-.Pp
-The
-.Fn nvlist_exists_null ,
-.Fn nvlist_exists_bool ,
-.Fn nvlist_exists_number ,
-.Fn nvlist_exists_string ,
-.Fn nvlist_exists_nvlist ,
-.Fn nvlist_exists_descriptor ,
-.Fn nvlist_exists_binary
-functions return
-.Dv true
-if element of the given name and the given type determined by the function name
-exists or
-.Dv false
-otherwise.
-The nvlist must not be in error state.
-.Pp
-The
-.Fn nvlist_add_null ,
-.Fn nvlist_add_bool ,
-.Fn nvlist_add_number ,
-.Fn nvlist_add_string ,
-.Fn nvlist_add_stringf ,
-.Fn nvlist_add_stringv ,
-.Fn nvlist_add_nvlist ,
-.Fn nvlist_add_descriptor ,
-.Fn nvlist_add_binary
-functions add element to the given nvlist.
-When adding string or binary buffor the functions will allocate memory
-and copy the data over.
-When adding nvlist, the nvlist will be cloned and clone will be added.
-When adding descriptor, the descriptor will be duplicated using the
-.Xr dup 2
-system call and the new descriptor will be added.
-If an error occurs while adding new element, internal error is set which can be
-examined using the
-.Fn nvlist_error
-function.
-.Pp
-The
-.Fn nvlist_move_string ,
-.Fn nvlist_move_nvlist ,
-.Fn nvlist_move_descriptor ,
-.Fn nvlist_move_binary
-functions add new element to the given nvlist, but unlike
-.Fn nvlist_add_<type>
-functions they will consume the given resource.
-If an error occurs while adding new element, the resource is destroyed and
-internal error is set which can be examined using the
-.Fn nvlist_error
-function.
-.Pp
-The
-.Fn nvlist_get_bool ,
-.Fn nvlist_get_number ,
-.Fn nvlist_get_string ,
-.Fn nvlist_get_nvlist ,
-.Fn nvlist_get_descriptor ,
-.Fn nvlist_get_binary
-functions allow to obtain value of the given name.
-In case of string, nvlist, descriptor or binary, returned resource should
-not be modified - it still belongs to the nvlist.
-If element of the given name does not exist, the program will be aborted.
-To avoid that the caller should check for existence before trying to obtain
-the value or use
-.Xr dnvlist 3
-extension, which allows to provide default value for a missing element.
-The nvlist must not be in error state.
-.Pp
-The
-.Fn nvlist_get_parent
-function allows to obtain the parent nvlist from the nested nvlist.
-.Pp
-The
-.Fn nvlist_take_bool ,
-.Fn nvlist_take_number ,
-.Fn nvlist_take_string ,
-.Fn nvlist_take_nvlist ,
-.Fn nvlist_take_descriptor ,
-.Fn nvlist_take_binary
-functions return value associated with the given name and remove the element
-from the nvlist.
-In case of string and binary values, the caller is responsible for free returned
-memory using the
-.Xr free 3
-function.
-In case of nvlist, the caller is responsible for destroying returned nvlist
-using the
-.Fn nvlist_destroy
-function.
-In case of descriptor, the caller is responsible for closing returned descriptor
-using the
-.Fn close 2
-system call.
-If element of the given name does not exist, the program will be aborted.
-To avoid that the caller should check for existence before trying to obtain
-the value or use
-.Xr dnvlist 3
-extension, which allows to provide default value for a missing element.
-The nvlist must not be in error state.
-.Pp
-The
-.Fn nvlist_free
-function removes element of the given name from the nvlist (besides of its type)
-and frees all resources associated with it.
-If element of the given name does not exist, the program will be aborted.
-The nvlist must not be in error state.
-.Pp
-The
-.Fn nvlist_free_type
-function removes element of the given name and the given type from the nvlist
-and frees all resources associated with it.
-If element of the given name and the given type does not exist, the program
-will be aborted.
-The nvlist must not be in error state.
-.Pp
-The
-.Fn nvlist_free_null ,
-.Fn nvlist_free_bool ,
-.Fn nvlist_free_number ,
-.Fn nvlist_free_string ,
-.Fn nvlist_free_nvlist ,
-.Fn nvlist_free_descriptor ,
-.Fn nvlist_free_binary
-functions remove element of the given name and the given type determined by the
-function name from the nvlist and free all resources associated with it.
-If element of the given name and the given type does not exist, the program
-will be aborted.
-The nvlist must not be in error state.
-.Sh EXAMPLES
-The following example demonstrates how to prepare an nvlist and send it over
-.Xr unix 4
-domain socket.
-.Bd -literal
-nvlist_t *nvl;
-int fd;
-
-fd = open("/tmp/foo", O_RDONLY);
-if (fd < 0)
- err(1, "open(\\"/tmp/foo\\") failed");
-
-nvl = nvlist_create(0);
-/*
- * There is no need to check if nvlist_create() succeeded,
- * as the nvlist_add_<type>() functions can cope.
- * If it failed, nvlist_send() will fail.
- */
-nvlist_add_string(nvl, "filename", "/tmp/foo");
-nvlist_add_number(nvl, "flags", O_RDONLY);
-/*
- * We just want to send the descriptor, so we can give it
- * for the nvlist to consume (that's why we use nvlist_move
- * not nvlist_add).
- */
-nvlist_move_descriptor(nvl, "fd", fd);
-if (nvlist_send(sock, nvl) < 0) {
- nvlist_destroy(nvl);
- err(1, "nvlist_send() failed");
-}
-nvlist_destroy(nvl);
-.Ed
-.Pp
-Receiving nvlist and getting data:
-.Bd -literal
-nvlist_t *nvl;
-const char *command;
-char *filename;
-int fd;
-
-nvl = nvlist_recv(sock);
-if (nvl == NULL)
- err(1, "nvlist_recv() failed");
-
-/* For command we take pointer to nvlist's buffer. */
-command = nvlist_get_string(nvl, "command");
-/*
- * For filename we remove it from the nvlist and take
- * ownership of the buffer.
- */
-filename = nvlist_take_string(nvl, "filename");
-/* The same for the descriptor. */
-fd = nvlist_take_descriptor(nvl, "fd");
-
-printf("command=%s filename=%s fd=%d\n", command, filename, fd);
-
-nvlist_destroy(nvl);
-free(filename);
-close(fd);
-/* command was freed by nvlist_destroy() */
-.Ed
-.Pp
-Iterating over nvlist:
-.Bd -literal
-nvlist_t *nvl;
-const char *name;
-void *cookie;
-int type;
-
-nvl = nvlist_recv(sock);
-if (nvl == NULL)
- err(1, "nvlist_recv() failed");
-
-cookie = NULL;
-while ((name = nvlist_next(nvl, &type, &cookie)) != NULL) {
- printf("%s=", name);
- switch (type) {
- case NV_TYPE_NUMBER:
- printf("%ju", (uintmax_t)nvlist_get_number(nvl, name));
- break;
- case NV_TYPE_STRING:
- printf("%s", nvlist_get_string(nvl, name));
- break;
- default:
- printf("N/A");
- break;
- }
- printf("\\n");
-}
-.Ed
-.Pp
-Iterating over every nested nvlist:
-.Bd -literal
-nvlist_t *nvl;
-const char *name;
-void *cookie;
-int type;
-
-nvl = nvlist_recv(sock);
-if (nvl == NULL)
- err(1, "nvlist_recv() failed");
-
-cookie = NULL;
-do {
- while ((name = nvlist_next(nvl, &type, &cookie)) != NULL) {
- if (type == NV_TYPE_NVLIST) {
- nvl = nvlist_get_nvlist(nvl, name);
- cookie = NULL;
- }
- }
-} while ((nvl = nvlist_get_parent(nvl, &cookie)) != NULL);
-.Ed
-.Sh SEE ALSO
-.Xr close 2 ,
-.Xr dup 2 ,
-.Xr open 2 ,
-.Xr err 3 ,
-.Xr free 3 ,
-.Xr printf 3 ,
-.Xr unix 4
-.Sh HISTORY
-The
-.Nm libnv
-library appeared in
-.Fx 11.0 .
-.Sh AUTHORS
-.An -nosplit
-The
-.Nm libnv
-library was implemented by
-.An Pawel Jakub Dawidek Aq Mt pawel@dawidek.net
-under sponsorship from the FreeBSD Foundation.
diff --git a/external/libnv/subr_dnvlist.c b/external/libnv/subr_dnvlist.c
deleted file mode 100644
index 01618a04..00000000
--- a/external/libnv/subr_dnvlist.c
+++ /dev/null
@@ -1,294 +0,0 @@
-/*-
- * Copyright (c) 2013 The FreeBSD Foundation
- * All rights reserved.
- *
- * This software was developed by Pawel Jakub Dawidek under sponsorship from
- * the FreeBSD Foundation.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/sys/kern/subr_dnvlist.c 279439 2015-03-01 00:34:27Z rstone $");
-
-#ifdef _KERNEL
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/kernel.h>
-#include <sys/systm.h>
-#include <sys/malloc.h>
-
-#include <machine/stdarg.h>
-
-#else
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdlib.h>
-#endif
-
-#include <sys/nv.h>
-#include <sys/nv_impl.h>
-
-#include <sys/dnv.h>
-
-#define DNVLIST_GET(ftype, type) \
-ftype \
-dnvlist_get_##type(const nvlist_t *nvl, const char *name, ftype defval) \
-{ \
- \
- if (nvlist_exists_##type(nvl, name)) \
- return (nvlist_get_##type(nvl, name)); \
- else \
- return (defval); \
-}
-
-DNVLIST_GET(bool, bool)
-DNVLIST_GET(uint64_t, number)
-DNVLIST_GET(const char *, string)
-DNVLIST_GET(const nvlist_t *, nvlist)
-#ifndef _KERNEL
-DNVLIST_GET(int, descriptor)
-#endif
-
-#undef DNVLIST_GET
-
-const void *
-dnvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep,
- const void *defval, size_t defsize)
-{
- const void *value;
-
- if (nvlist_exists_binary(nvl, name))
- value = nvlist_get_binary(nvl, name, sizep);
- else {
- if (sizep != NULL)
- *sizep = defsize;
- value = defval;
- }
- return (value);
-}
-
-#ifndef _KERNEL
-#define DNVLIST_GETF(ftype, type) \
-ftype \
-dnvlist_getf_##type(const nvlist_t *nvl, ftype defval, \
- const char *namefmt, ...) \
-{ \
- va_list nameap; \
- ftype value; \
- \
- va_start(nameap, namefmt); \
- value = dnvlist_getv_##type(nvl, defval, namefmt, nameap); \
- va_end(nameap); \
- \
- return (value); \
-}
-
-DNVLIST_GETF(bool, bool)
-DNVLIST_GETF(uint64_t, number)
-DNVLIST_GETF(const char *, string)
-DNVLIST_GETF(const nvlist_t *, nvlist)
-DNVLIST_GETF(int, descriptor)
-
-#undef DNVLIST_GETF
-
-const void *
-dnvlist_getf_binary(const nvlist_t *nvl, size_t *sizep, const void *defval,
- size_t defsize, const char *namefmt, ...)
-{
- va_list nameap;
- const void *value;
-
- va_start(nameap, namefmt);
- value = dnvlist_getv_binary(nvl, sizep, defval, defsize, namefmt,
- nameap);
- va_end(nameap);
-
- return (value);
-}
-
-#define DNVLIST_GETV(ftype, type) \
-ftype \
-dnvlist_getv_##type(const nvlist_t *nvl, ftype defval, \
- const char *namefmt, va_list nameap) \
-{ \
- char *name; \
- ftype value; \
- \
- vasprintf(&name, namefmt, nameap); \
- if (name == NULL) \
- return (defval); \
- value = dnvlist_get_##type(nvl, name, defval); \
- free(name); \
- return (value); \
-}
-
-DNVLIST_GETV(bool, bool)
-DNVLIST_GETV(uint64_t, number)
-DNVLIST_GETV(const char *, string)
-DNVLIST_GETV(const nvlist_t *, nvlist)
-DNVLIST_GETV(int, descriptor)
-
-#undef DNVLIST_GETV
-
-const void *
-dnvlist_getv_binary(const nvlist_t *nvl, size_t *sizep, const void *defval,
- size_t defsize, const char *namefmt, va_list nameap)
-{
- char *name;
- const void *value;
-
- nv_vasprintf(&name, namefmt, nameap);
- if (name != NULL) {
- value = dnvlist_get_binary(nvl, name, sizep, defval, defsize);
- nv_free(name);
- } else {
- if (sizep != NULL)
- *sizep = defsize;
- value = defval;
- }
- return (value);
-}
-#endif
-
-#define DNVLIST_TAKE(ftype, type) \
-ftype \
-dnvlist_take_##type(nvlist_t *nvl, const char *name, ftype defval) \
-{ \
- \
- if (nvlist_exists_##type(nvl, name)) \
- return (nvlist_take_##type(nvl, name)); \
- else \
- return (defval); \
-}
-
-DNVLIST_TAKE(bool, bool)
-DNVLIST_TAKE(uint64_t, number)
-DNVLIST_TAKE(char *, string)
-DNVLIST_TAKE(nvlist_t *, nvlist)
-#ifndef _KERNEL
-DNVLIST_TAKE(int, descriptor)
-#endif
-
-#undef DNVLIST_TAKE
-
-void *
-dnvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep,
- void *defval, size_t defsize)
-{
- void *value;
-
- if (nvlist_exists_binary(nvl, name))
- value = nvlist_take_binary(nvl, name, sizep);
- else {
- if (sizep != NULL)
- *sizep = defsize;
- value = defval;
- }
- return (value);
-}
-
-#ifndef _KERNEL
-#define DNVLIST_TAKEF(ftype, type) \
-ftype \
-dnvlist_takef_##type(nvlist_t *nvl, ftype defval, \
- const char *namefmt, ...) \
-{ \
- va_list nameap; \
- ftype value; \
- \
- va_start(nameap, namefmt); \
- value = dnvlist_takev_##type(nvl, defval, namefmt, nameap); \
- va_end(nameap); \
- \
- return (value); \
-}
-
-DNVLIST_TAKEF(bool, bool)
-DNVLIST_TAKEF(uint64_t, number)
-DNVLIST_TAKEF(char *, string)
-DNVLIST_TAKEF(nvlist_t *, nvlist)
-DNVLIST_TAKEF(int, descriptor)
-
-#undef DNVLIST_TAKEF
-
-void *
-dnvlist_takef_binary(nvlist_t *nvl, size_t *sizep, void *defval,
- size_t defsize, const char *namefmt, ...)
-{
- va_list nameap;
- void *value;
-
- va_start(nameap, namefmt);
- value = dnvlist_takev_binary(nvl, sizep, defval, defsize, namefmt,
- nameap);
- va_end(nameap);
-
- return (value);
-}
-
-#define DNVLIST_TAKEV(ftype, type) \
-ftype \
-dnvlist_takev_##type(nvlist_t *nvl, ftype defval, const char *namefmt, \
- va_list nameap) \
-{ \
- char *name; \
- ftype value; \
- \
- vasprintf(&name, namefmt, nameap); \
- if (name == NULL) \
- return (defval); \
- value = dnvlist_take_##type(nvl, name, defval); \
- free(name); \
- return (value); \
-}
-
-DNVLIST_TAKEV(bool, bool)
-DNVLIST_TAKEV(uint64_t, number)
-DNVLIST_TAKEV(char *, string)
-DNVLIST_TAKEV(nvlist_t *, nvlist)
-DNVLIST_TAKEV(int, descriptor)
-
-#undef DNVLIST_TAKEV
-
-void *
-dnvlist_takev_binary(nvlist_t *nvl, size_t *sizep, void *defval,
- size_t defsize, const char *namefmt, va_list nameap)
-{
- char *name;
- void *value;
-
- nv_vasprintf(&name, namefmt, nameap);
- if (name != NULL) {
- value = dnvlist_take_binary(nvl, name, sizep, defval, defsize);
- nv_free(name);
- } else {
- if (sizep != NULL)
- *sizep = defsize;
- value = defval;
- }
-
- return (value);
-}
-#endif
diff --git a/external/libnv/sys/dnv.h b/external/libnv/sys/dnv.h
index fcf0512f..679a51f8 100644
--- a/external/libnv/sys/dnv.h
+++ b/external/libnv/sys/dnv.h
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: head/sys/sys/dnv.h 279439 2015-03-01 00:34:27Z rstone $
+ * $FreeBSD$
*/
#ifndef _DNV_H_
@@ -37,6 +37,7 @@
#ifndef _KERNEL
#include <stdarg.h>
#include <stdbool.h>
+#include <stddef.h>
#include <stdint.h>
#endif
@@ -64,22 +65,6 @@ const nvlist_t *dnvlist_get_nvlist(const nvlist_t *nvl, const char *name, const
int dnvlist_get_descriptor(const nvlist_t *nvl, const char *name, int defval);
const void *dnvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep, const void *defval, size_t defsize);
-#ifndef _KERNEL
-bool dnvlist_getf_bool(const nvlist_t *nvl, bool defval, const char *namefmt, ...) __printflike(3, 4);
-uint64_t dnvlist_getf_number(const nvlist_t *nvl, uint64_t defval, const char *namefmt, ...) __printflike(3, 4);
-const char *dnvlist_getf_string(const nvlist_t *nvl, const char *defval, const char *namefmt, ...) __printflike(3, 4);
-const nvlist_t *dnvlist_getf_nvlist(const nvlist_t *nvl, const nvlist_t *defval, const char *namefmt, ...) __printflike(3, 4);
-int dnvlist_getf_descriptor(const nvlist_t *nvl, int defval, const char *namefmt, ...) __printflike(3, 4);
-const void *dnvlist_getf_binary(const nvlist_t *nvl, size_t *sizep, const void *defval, size_t defsize, const char *namefmt, ...) __printflike(5, 6);
-
-bool dnvlist_getv_bool(const nvlist_t *nvl, bool defval, const char *namefmt, va_list nameap) __printflike(3, 0);
-uint64_t dnvlist_getv_number(const nvlist_t *nvl, uint64_t defval, const char *namefmt, va_list nameap) __printflike(3, 0);
-const char *dnvlist_getv_string(const nvlist_t *nvl, const char *defval, const char *namefmt, va_list nameap) __printflike(3, 0);
-const nvlist_t *dnvlist_getv_nvlist(const nvlist_t *nvl, const nvlist_t *defval, const char *namefmt, va_list nameap) __printflike(3, 0);
-int dnvlist_getv_descriptor(const nvlist_t *nvl, int defval, const char *namefmt, va_list nameap) __printflike(3, 0);
-const void *dnvlist_getv_binary(const nvlist_t *nvl, size_t *sizep, const void *defval, size_t defsize, const char *namefmt, va_list nameap) __printflike(5, 0);
-#endif
-
/*
* The dnvlist_take functions returns value associated with the given name and
* remove corresponding nvpair.
@@ -95,22 +80,6 @@ nvlist_t *dnvlist_take_nvlist(nvlist_t *nvl, const char *name, nvlist_t *defval)
int dnvlist_take_descriptor(nvlist_t *nvl, const char *name, int defval);
void *dnvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep, void *defval, size_t defsize);
-#ifndef _KERNEL
-bool dnvlist_takef_bool(nvlist_t *nvl, bool defval, const char *namefmt, ...) __printflike(3, 4);
-uint64_t dnvlist_takef_number(nvlist_t *nvl, uint64_t defval, const char *namefmt, ...) __printflike(3, 4);
-char *dnvlist_takef_string(nvlist_t *nvl, char *defval, const char *namefmt, ...) __printflike(3, 4);
-nvlist_t *dnvlist_takef_nvlist(nvlist_t *nvl, nvlist_t *defval, const char *namefmt, ...) __printflike(3, 4);
-int dnvlist_takef_descriptor(nvlist_t *nvl, int defval, const char *namefmt, ...) __printflike(3, 4);
-void *dnvlist_takef_binary(nvlist_t *nvl, size_t *sizep, void *defval, size_t defsize, const char *namefmt, ...) __printflike(5, 6);
-
-bool dnvlist_takev_bool(nvlist_t *nvl, bool defval, const char *namefmt, va_list nameap) __printflike(3, 0);
-uint64_t dnvlist_takev_number(nvlist_t *nvl, uint64_t defval, const char *namefmt, va_list nameap) __printflike(3, 0);
-char *dnvlist_takev_string(nvlist_t *nvl, char *defval, const char *namefmt, va_list nameap) __printflike(3, 0);
-nvlist_t *dnvlist_takev_nvlist(nvlist_t *nvl, nvlist_t *defval, const char *namefmt, va_list nameap) __printflike(3, 0);
-int dnvlist_takev_descriptor(nvlist_t *nvl, int defval, const char *namefmt, va_list nameap) __printflike(3, 0);
-void *dnvlist_takev_binary(nvlist_t *nvl, size_t *sizep, void *defval, size_t defsize, const char *namefmt, va_list nameap) __printflike(5, 0);
-#endif
-
__END_DECLS
#endif /* !_DNV_H_ */
diff --git a/external/libnv/sys/dnvlist.c b/external/libnv/sys/dnvlist.c
new file mode 100644
index 00000000..c2106c5a
--- /dev/null
+++ b/external/libnv/sys/dnvlist.c
@@ -0,0 +1,128 @@
+/*-
+ * Copyright (c) 2013 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Pawel Jakub Dawidek under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#ifdef _KERNEL
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/systm.h>
+#include <sys/malloc.h>
+
+#include <machine/stdarg.h>
+
+#else
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#endif
+
+#include <sys/dnv.h>
+#include <sys/nv.h>
+
+#include "nv_impl.h"
+
+#define DNVLIST_GET(ftype, type) \
+ftype \
+dnvlist_get_##type(const nvlist_t *nvl, const char *name, ftype defval) \
+{ \
+ \
+ if (nvlist_exists_##type(nvl, name)) \
+ return (nvlist_get_##type(nvl, name)); \
+ else \
+ return (defval); \
+}
+
+DNVLIST_GET(bool, bool)
+DNVLIST_GET(uint64_t, number)
+DNVLIST_GET(const char *, string)
+DNVLIST_GET(const nvlist_t *, nvlist)
+#ifndef _KERNEL
+DNVLIST_GET(int, descriptor)
+#endif
+
+#undef DNVLIST_GET
+
+const void *
+dnvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep,
+ const void *defval, size_t defsize)
+{
+ const void *value;
+
+ if (nvlist_exists_binary(nvl, name))
+ value = nvlist_get_binary(nvl, name, sizep);
+ else {
+ if (sizep != NULL)
+ *sizep = defsize;
+ value = defval;
+ }
+ return (value);
+}
+
+#define DNVLIST_TAKE(ftype, type) \
+ftype \
+dnvlist_take_##type(nvlist_t *nvl, const char *name, ftype defval) \
+{ \
+ \
+ if (nvlist_exists_##type(nvl, name)) \
+ return (nvlist_take_##type(nvl, name)); \
+ else \
+ return (defval); \
+}
+
+DNVLIST_TAKE(bool, bool)
+DNVLIST_TAKE(uint64_t, number)
+DNVLIST_TAKE(char *, string)
+DNVLIST_TAKE(nvlist_t *, nvlist)
+#ifndef _KERNEL
+DNVLIST_TAKE(int, descriptor)
+#endif
+
+#undef DNVLIST_TAKE
+
+void *
+dnvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep,
+ void *defval, size_t defsize)
+{
+ void *value;
+
+ if (nvlist_exists_binary(nvl, name))
+ value = nvlist_take_binary(nvl, name, sizep);
+ else {
+ if (sizep != NULL)
+ *sizep = defsize;
+ value = defval;
+ }
+ return (value);
+}
+
diff --git a/external/libnv/sys/nv.h b/external/libnv/sys/nv.h
index fd4e3725..fcea2b3e 100644
--- a/external/libnv/sys/nv.h
+++ b/external/libnv/sys/nv.h
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2009-2013 The FreeBSD Foundation
+ * Copyright (c) 2013-2015 Mariusz Zaborski <oshogbo@FreeBSD.org>
* All rights reserved.
*
* This software was developed by Pawel Jakub Dawidek under sponsorship from
@@ -26,7 +27,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: head/sys/sys/nv.h 279439 2015-03-01 00:34:27Z rstone $
+ * $FreeBSD$
*/
#ifndef _NV_H_
@@ -59,11 +60,20 @@ typedef struct nvlist nvlist_t;
#define NV_TYPE_NVLIST 5
#define NV_TYPE_DESCRIPTOR 6
#define NV_TYPE_BINARY 7
+#define NV_TYPE_BOOL_ARRAY 8
+#define NV_TYPE_NUMBER_ARRAY 9
+#define NV_TYPE_STRING_ARRAY 10
+#define NV_TYPE_NVLIST_ARRAY 11
+#define NV_TYPE_DESCRIPTOR_ARRAY 12
/*
* Perform case-insensitive lookups of provided names.
*/
#define NV_FLAG_IGNORE_CASE 0x01
+/*
+ * Names don't have to be unique.
+ */
+#define NV_FLAG_NO_UNIQUE 0x02
#if defined(_KERNEL) && defined(MALLOC_DECLARE)
MALLOC_DECLARE(M_NVLIST);
@@ -75,6 +85,7 @@ nvlist_t *nvlist_create(int flags);
void nvlist_destroy(nvlist_t *nvl);
int nvlist_error(const nvlist_t *nvl);
bool nvlist_empty(const nvlist_t *nvl);
+int nvlist_flags(const nvlist_t *nvl);
void nvlist_set_error(nvlist_t *nvl, int error);
nvlist_t *nvlist_clone(const nvlist_t *nvl);
@@ -86,16 +97,21 @@ void nvlist_fdump(const nvlist_t *nvl, FILE *fp);
size_t nvlist_size(const nvlist_t *nvl);
void *nvlist_pack(const nvlist_t *nvl, size_t *sizep);
-nvlist_t *nvlist_unpack(const void *buf, size_t size);
+nvlist_t *nvlist_unpack(const void *buf, size_t size, int flags);
int nvlist_send(int sock, const nvlist_t *nvl);
-nvlist_t *nvlist_recv(int sock);
-nvlist_t *nvlist_xfer(int sock, nvlist_t *nvl);
+nvlist_t *nvlist_recv(int sock, int flags);
+nvlist_t *nvlist_xfer(int sock, nvlist_t *nvl, int flags);
const char *nvlist_next(const nvlist_t *nvl, int *typep, void **cookiep);
const nvlist_t *nvlist_get_parent(const nvlist_t *nvl, void **cookiep);
+const nvlist_t *nvlist_get_array_next(const nvlist_t *nvl);
+bool nvlist_in_array(const nvlist_t *nvl);
+
+const nvlist_t *nvlist_get_pararr(const nvlist_t *nvl, void **cookiep);
+
/*
* The nvlist_exists functions check if the given name (optionally of the given
* type) exists on nvlist.
@@ -109,10 +125,15 @@ bool nvlist_exists_bool(const nvlist_t *nvl, const char *name);
bool nvlist_exists_number(const nvlist_t *nvl, const char *name);
bool nvlist_exists_string(const nvlist_t *nvl, const char *name);
bool nvlist_exists_nvlist(const nvlist_t *nvl, const char *name);
+bool nvlist_exists_binary(const nvlist_t *nvl, const char *name);
+bool nvlist_exists_bool_array(const nvlist_t *nvl, const char *name);
+bool nvlist_exists_number_array(const nvlist_t *nvl, const char *name);
+bool nvlist_exists_string_array(const nvlist_t *nvl, const char *name);
+bool nvlist_exists_nvlist_array(const nvlist_t *nvl, const char *name);
#ifndef _KERNEL
bool nvlist_exists_descriptor(const nvlist_t *nvl, const char *name);
+bool nvlist_exists_descriptor_array(const nvlist_t *nvl, const char *name);
#endif
-bool nvlist_exists_binary(const nvlist_t *nvl, const char *name);
/*
* The nvlist_add functions add the given name/value pair.
@@ -125,14 +146,19 @@ void nvlist_add_bool(nvlist_t *nvl, const char *name, bool value);
void nvlist_add_number(nvlist_t *nvl, const char *name, uint64_t value);
void nvlist_add_string(nvlist_t *nvl, const char *name, const char *value);
void nvlist_add_stringf(nvlist_t *nvl, const char *name, const char *valuefmt, ...) __printflike(3, 4);
-#ifdef _VA_LIST_DECLARED
+#if !defined(_KERNEL) || defined(_VA_LIST_DECLARED)
void nvlist_add_stringv(nvlist_t *nvl, const char *name, const char *valuefmt, va_list valueap) __printflike(3, 0);
#endif
void nvlist_add_nvlist(nvlist_t *nvl, const char *name, const nvlist_t *value);
+void nvlist_add_binary(nvlist_t *nvl, const char *name, const void *value, size_t size);
+void nvlist_add_bool_array(nvlist_t *nvl, const char *name, const bool *value, size_t nitems);
+void nvlist_add_number_array(nvlist_t *nvl, const char *name, const uint64_t *value, size_t nitems);
+void nvlist_add_string_array(nvlist_t *nvl, const char *name, const char * const *value, size_t nitems);
+void nvlist_add_nvlist_array(nvlist_t *nvl, const char *name, const nvlist_t * const *value, size_t nitems);
#ifndef _KERNEL
void nvlist_add_descriptor(nvlist_t *nvl, const char *name, int value);
+void nvlist_add_descriptor_array(nvlist_t *nvl, const char *name, const int *value, size_t nitems);
#endif
-void nvlist_add_binary(nvlist_t *nvl, const char *name, const void *value, size_t size);
/*
* The nvlist_move functions add the given name/value pair.
@@ -141,10 +167,15 @@ void nvlist_add_binary(nvlist_t *nvl, const char *name, const void *value, size_
void nvlist_move_string(nvlist_t *nvl, const char *name, char *value);
void nvlist_move_nvlist(nvlist_t *nvl, const char *name, nvlist_t *value);
+void nvlist_move_binary(nvlist_t *nvl, const char *name, void *value, size_t size);
+void nvlist_move_bool_array(nvlist_t *nvl, const char *name, bool *value, size_t nitems);
+void nvlist_move_string_array(nvlist_t *nvl, const char *name, char **value, size_t nitems);
+void nvlist_move_nvlist_array(nvlist_t *nvl, const char *name, nvlist_t **value, size_t nitems);
+void nvlist_move_number_array(nvlist_t *nvl, const char *name, uint64_t *value, size_t nitems);
#ifndef _KERNEL
void nvlist_move_descriptor(nvlist_t *nvl, const char *name, int value);
+void nvlist_move_descriptor_array(nvlist_t *nvl, const char *name, int *value, size_t nitems);
#endif
-void nvlist_move_binary(nvlist_t *nvl, const char *name, void *value, size_t size);
/*
* The nvlist_get functions returns value associated with the given name.
@@ -152,14 +183,19 @@ void nvlist_move_binary(nvlist_t *nvl, const char *name, void *value, size_t siz
* not be freed by the caller.
*/
-bool nvlist_get_bool(const nvlist_t *nvl, const char *name);
-uint64_t nvlist_get_number(const nvlist_t *nvl, const char *name);
-const char *nvlist_get_string(const nvlist_t *nvl, const char *name);
-const nvlist_t *nvlist_get_nvlist(const nvlist_t *nvl, const char *name);
+bool nvlist_get_bool(const nvlist_t *nvl, const char *name);
+uint64_t nvlist_get_number(const nvlist_t *nvl, const char *name);
+const char *nvlist_get_string(const nvlist_t *nvl, const char *name);
+const nvlist_t *nvlist_get_nvlist(const nvlist_t *nvl, const char *name);
+const void *nvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep);
+const bool *nvlist_get_bool_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
+const uint64_t *nvlist_get_number_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
+const char * const *nvlist_get_string_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
+const nvlist_t * const *nvlist_get_nvlist_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
#ifndef _KERNEL
-int nvlist_get_descriptor(const nvlist_t *nvl, const char *name);
+int nvlist_get_descriptor(const nvlist_t *nvl, const char *name);
+const int *nvlist_get_descriptor_array(const nvlist_t *nvl, const char *name, size_t *nitemsp);
#endif
-const void *nvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep);
/*
* The nvlist_take functions returns value associated with the given name and
@@ -167,14 +203,19 @@ const void *nvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *siz
* The caller is responsible for freeing received data.
*/
-bool nvlist_take_bool(nvlist_t *nvl, const char *name);
-uint64_t nvlist_take_number(nvlist_t *nvl, const char *name);
-char *nvlist_take_string(nvlist_t *nvl, const char *name);
-nvlist_t *nvlist_take_nvlist(nvlist_t *nvl, const char *name);
+bool nvlist_take_bool(nvlist_t *nvl, const char *name);
+uint64_t nvlist_take_number(nvlist_t *nvl, const char *name);
+char *nvlist_take_string(nvlist_t *nvl, const char *name);
+nvlist_t *nvlist_take_nvlist(nvlist_t *nvl, const char *name);
+void *nvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep);
+bool *nvlist_take_bool_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
+uint64_t *nvlist_take_number_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
+char **nvlist_take_string_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
+nvlist_t **nvlist_take_nvlist_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
#ifndef _KERNEL
int nvlist_take_descriptor(nvlist_t *nvl, const char *name);
+int *nvlist_take_descriptor_array(nvlist_t *nvl, const char *name, size_t *nitemsp);
#endif
-void *nvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep);
/*
* The nvlist_free functions removes the given name/value pair from the nvlist
@@ -189,134 +230,17 @@ void nvlist_free_bool(nvlist_t *nvl, const char *name);
void nvlist_free_number(nvlist_t *nvl, const char *name);
void nvlist_free_string(nvlist_t *nvl, const char *name);
void nvlist_free_nvlist(nvlist_t *nvl, const char *name);
-#ifndef _KERNEL
-void nvlist_free_descriptor(nvlist_t *nvl, const char *name);
-#endif
void nvlist_free_binary(nvlist_t *nvl, const char *name);
-
-/*
- * Below are the same functions, but which operate on format strings and
- * variable argument lists.
- *
- * Functions that are not inserting a new pair into the nvlist cannot handle
- * a failure to allocate the memory to hold the new name. Therefore these
- * functions are not provided in the kernel.
- */
-
+void nvlist_free_bool_array(nvlist_t *nvl, const char *name);
+void nvlist_free_number_array(nvlist_t *nvl, const char *name);
+void nvlist_free_string_array(nvlist_t *nvl, const char *name);
+void nvlist_free_nvlist_array(nvlist_t *nvl, const char *name);
+void nvlist_free_binary_array(nvlist_t *nvl, const char *name);
#ifndef _KERNEL
-bool nvlist_existsf(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-bool nvlist_existsf_type(const nvlist_t *nvl, int type, const char *namefmt, ...) __printflike(3, 4);
-
-bool nvlist_existsf_null(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-bool nvlist_existsf_bool(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-bool nvlist_existsf_number(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-bool nvlist_existsf_string(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-bool nvlist_existsf_nvlist(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-bool nvlist_existsf_descriptor(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-bool nvlist_existsf_binary(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-
-bool nvlist_existsv(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-bool nvlist_existsv_type(const nvlist_t *nvl, int type, const char *namefmt, va_list nameap) __printflike(3, 0);
-
-bool nvlist_existsv_null(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-bool nvlist_existsv_bool(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-bool nvlist_existsv_number(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-bool nvlist_existsv_string(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-bool nvlist_existsv_nvlist(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-bool nvlist_existsv_descriptor(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-bool nvlist_existsv_binary(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-#endif
-
-void nvlist_addf_null(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_addf_bool(nvlist_t *nvl, bool value, const char *namefmt, ...) __printflike(3, 4);
-void nvlist_addf_number(nvlist_t *nvl, uint64_t value, const char *namefmt, ...) __printflike(3, 4);
-void nvlist_addf_string(nvlist_t *nvl, const char *value, const char *namefmt, ...) __printflike(3, 4);
-void nvlist_addf_nvlist(nvlist_t *nvl, const nvlist_t *value, const char *namefmt, ...) __printflike(3, 4);
-#ifndef _KERNEL
-void nvlist_addf_descriptor(nvlist_t *nvl, int value, const char *namefmt, ...) __printflike(3, 4);
-#endif
-void nvlist_addf_binary(nvlist_t *nvl, const void *value, size_t size, const char *namefmt, ...) __printflike(4, 5);
-
-#if !defined(_KERNEL) || defined(_VA_LIST_DECLARED)
-void nvlist_addv_null(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_addv_bool(nvlist_t *nvl, bool value, const char *namefmt, va_list nameap) __printflike(3, 0);
-void nvlist_addv_number(nvlist_t *nvl, uint64_t value, const char *namefmt, va_list nameap) __printflike(3, 0);
-void nvlist_addv_string(nvlist_t *nvl, const char *value, const char *namefmt, va_list nameap) __printflike(3, 0);
-void nvlist_addv_nvlist(nvlist_t *nvl, const nvlist_t *value, const char *namefmt, va_list nameap) __printflike(3, 0);
-#ifndef _KERNEL
-void nvlist_addv_descriptor(nvlist_t *nvl, int value, const char *namefmt, va_list nameap) __printflike(3, 0);
-#endif
-void nvlist_addv_binary(nvlist_t *nvl, const void *value, size_t size, const char *namefmt, va_list nameap) __printflike(4, 0);
-#endif
-
-void nvlist_movef_string(nvlist_t *nvl, char *value, const char *namefmt, ...) __printflike(3, 4);
-void nvlist_movef_nvlist(nvlist_t *nvl, nvlist_t *value, const char *namefmt, ...) __printflike(3, 4);
-#ifndef _KERNEL
-void nvlist_movef_descriptor(nvlist_t *nvl, int value, const char *namefmt, ...) __printflike(3, 4);
-#endif
-void nvlist_movef_binary(nvlist_t *nvl, void *value, size_t size, const char *namefmt, ...) __printflike(4, 5);
-
-#if !defined(_KERNEL) || defined(_VA_LIST_DECLARED)
-void nvlist_movev_string(nvlist_t *nvl, char *value, const char *namefmt, va_list nameap) __printflike(3, 0);
-void nvlist_movev_nvlist(nvlist_t *nvl, nvlist_t *value, const char *namefmt, va_list nameap) __printflike(3, 0);
-#ifndef _KERNEL
-void nvlist_movev_descriptor(nvlist_t *nvl, int value, const char *namefmt, va_list nameap) __printflike(3, 0);
-#endif
-void nvlist_movev_binary(nvlist_t *nvl, void *value, size_t size, const char *namefmt, va_list nameap) __printflike(4, 0);
+void nvlist_free_descriptor(nvlist_t *nvl, const char *name);
+void nvlist_free_descriptor_array(nvlist_t *nvl, const char *name);
#endif
-#ifndef _KERNEL
-bool nvlist_getf_bool(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-uint64_t nvlist_getf_number(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-const char *nvlist_getf_string(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-const nvlist_t *nvlist_getf_nvlist(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-int nvlist_getf_descriptor(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-const void *nvlist_getf_binary(const nvlist_t *nvl, size_t *sizep, const char *namefmt, ...) __printflike(3, 4);
-
-bool nvlist_getv_bool(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-uint64_t nvlist_getv_number(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-const char *nvlist_getv_string(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-const nvlist_t *nvlist_getv_nvlist(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-int nvlist_getv_descriptor(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-const void *nvlist_getv_binary(const nvlist_t *nvl, size_t *sizep, const char *namefmt, va_list nameap) __printflike(3, 0);
-
-bool nvlist_takef_bool(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-uint64_t nvlist_takef_number(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-char *nvlist_takef_string(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-nvlist_t *nvlist_takef_nvlist(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-int nvlist_takef_descriptor(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void *nvlist_takef_binary(nvlist_t *nvl, size_t *sizep, const char *namefmt, ...) __printflike(3, 4);
-
-bool nvlist_takev_bool(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-uint64_t nvlist_takev_number(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-char *nvlist_takev_string(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvlist_t *nvlist_takev_nvlist(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-int nvlist_takev_descriptor(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void *nvlist_takev_binary(nvlist_t *nvl, size_t *sizep, const char *namefmt, va_list nameap) __printflike(3, 0);
-
-void nvlist_freef(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_freef_type(nvlist_t *nvl, int type, const char *namefmt, ...) __printflike(3, 4);
-
-void nvlist_freef_null(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_freef_bool(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_freef_number(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_freef_string(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_freef_nvlist(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_freef_descriptor(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_freef_binary(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-
-void nvlist_freev(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_freev_type(nvlist_t *nvl, int type, const char *namefmt, va_list nameap) __printflike(3, 0);
-
-void nvlist_freev_null(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_freev_bool(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_freev_number(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_freev_string(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_freev_nvlist(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_freev_descriptor(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_freev_binary(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-#endif /* _KERNEL */
-
__END_DECLS
#endif /* !_NV_H_ */
diff --git a/external/libnv/sys/nv_impl.h b/external/libnv/sys/nv_impl.h
index 944ba147..b50bdf72 100644
--- a/external/libnv/sys/nv_impl.h
+++ b/external/libnv/sys/nv_impl.h
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2013 The FreeBSD Foundation
+ * Copyright (c) 2013-2015 Mariusz Zaborski <oshogbo@FreeBSD.org>
* All rights reserved.
*
* This software was developed by Pawel Jakub Dawidek under sponsorship from
@@ -26,7 +27,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: head/sys/sys/nv_impl.h 279439 2015-03-01 00:34:27Z rstone $
+ * $FreeBSD$
*/
#ifndef _NV_IMPL_H_
@@ -39,25 +40,28 @@ struct nvpair;
typedef struct nvpair nvpair_t;
#endif
+#define NV_TYPE_NVLIST_ARRAY_NEXT 254
#define NV_TYPE_NVLIST_UP 255
-#define NV_TYPE_FIRST NV_TYPE_NULL
-#define NV_TYPE_LAST NV_TYPE_BINARY
+#define NV_TYPE_FIRST NV_TYPE_NULL
+#define NV_TYPE_LAST NV_TYPE_DESCRIPTOR_ARRAY
-#define NV_FLAG_BIG_ENDIAN 0x80
+#define NV_FLAG_BIG_ENDIAN 0x080
+#define NV_FLAG_IN_ARRAY 0x100
#ifdef _KERNEL
-#define nv_malloc(size) malloc((size), M_NVLIST, M_NOWAIT)
+#define nv_malloc(size) malloc((size), M_NVLIST, M_WAITOK)
#define nv_calloc(n, size) malloc((n) * (size), M_NVLIST, \
- M_NOWAIT | M_ZERO)
+ M_WAITOK | M_ZERO)
#define nv_realloc(buf, size) realloc((buf), (size), M_NVLIST, \
- M_NOWAIT)
+ M_WAITOK)
#define nv_free(buf) free((buf), M_NVLIST)
#define nv_strdup(buf) strdup((buf), M_NVLIST)
#define nv_vasprintf(ptr, ...) vasprintf(ptr, M_NVLIST, __VA_ARGS__)
-#define SAVE_ERRNO(var) ((void)(var))
-#define RESTORE_ERRNO(var) ((void)(var))
+#define ERRNO_SET(var) do { } while (0)
+#define ERRNO_SAVE() do { do { } while(0)
+#define ERRNO_RESTORE() } while (0)
#define ERRNO_OR_DEFAULT(default) (default)
@@ -70,8 +74,14 @@ typedef struct nvpair nvpair_t;
#define nv_strdup(buf) strdup((buf))
#define nv_vasprintf(ptr, ...) vasprintf(ptr, __VA_ARGS__)
-#define SAVE_ERRNO(var) (var) = errno
-#define RESTORE_ERRNO(var) errno = (var)
+#define ERRNO_SET(var) do { errno = (var); } while (0)
+#define ERRNO_SAVE() do { \
+ int _serrno; \
+ \
+ _serrno = errno
+
+#define ERRNO_RESTORE() errno = _serrno; \
+ } while (0)
#define ERRNO_OR_DEFAULT(default) (errno == 0 ? (default) : errno)
@@ -79,6 +89,7 @@ typedef struct nvpair nvpair_t;
int *nvlist_descriptors(const nvlist_t *nvl, size_t *nitemsp);
size_t nvlist_ndescriptors(const nvlist_t *nvl);
+void nvlist_set_flags(nvlist_t *nvl, int flags);
nvpair_t *nvlist_first_nvpair(const nvlist_t *nvl);
nvpair_t *nvlist_next_nvpair(const nvlist_t *nvl, const nvpair_t *nvp);
@@ -86,9 +97,10 @@ nvpair_t *nvlist_prev_nvpair(const nvlist_t *nvl, const nvpair_t *nvp);
void nvlist_add_nvpair(nvlist_t *nvl, const nvpair_t *nvp);
-void nvlist_move_nvpair(nvlist_t *nvl, nvpair_t *nvp);
+bool nvlist_move_nvpair(nvlist_t *nvl, nvpair_t *nvp);
void nvlist_set_parent(nvlist_t *nvl, nvpair_t *parent);
+void nvlist_set_array_next(nvlist_t *nvl, nvpair_t *ele);
const nvpair_t *nvlist_get_nvpair(const nvlist_t *nvl, const char *name);
@@ -113,45 +125,34 @@ nvpair_t *nvpair_create_stringv(const char *name, const char *valuefmt, va_list
nvpair_t *nvpair_create_nvlist(const char *name, const nvlist_t *value);
nvpair_t *nvpair_create_descriptor(const char *name, int value);
nvpair_t *nvpair_create_binary(const char *name, const void *value, size_t size);
+nvpair_t *nvpair_create_bool_array(const char *name, const bool *value, size_t nitems);
+nvpair_t *nvpair_create_number_array(const char *name, const uint64_t *value, size_t nitems);
+nvpair_t *nvpair_create_string_array(const char *name, const char * const *value, size_t nitems);
+nvpair_t *nvpair_create_nvlist_array(const char *name, const nvlist_t * const *value, size_t nitems);
+nvpair_t *nvpair_create_descriptor_array(const char *name, const int *value, size_t nitems);
nvpair_t *nvpair_move_string(const char *name, char *value);
nvpair_t *nvpair_move_nvlist(const char *name, nvlist_t *value);
nvpair_t *nvpair_move_descriptor(const char *name, int value);
nvpair_t *nvpair_move_binary(const char *name, void *value, size_t size);
-
-bool nvpair_get_bool(const nvpair_t *nvp);
-uint64_t nvpair_get_number(const nvpair_t *nvp);
-const char *nvpair_get_string(const nvpair_t *nvp);
-const nvlist_t *nvpair_get_nvlist(const nvpair_t *nvp);
-int nvpair_get_descriptor(const nvpair_t *nvp);
-const void *nvpair_get_binary(const nvpair_t *nvp, size_t *sizep);
+nvpair_t *nvpair_move_bool_array(const char *name, bool *value, size_t nitems);
+nvpair_t *nvpair_move_nvlist_array(const char *name, nvlist_t **value, size_t nitems);
+nvpair_t *nvpair_move_descriptor_array(const char *name, int *value, size_t nitems);
+nvpair_t *nvpair_move_number_array(const char *name, uint64_t *value, size_t nitems);
+nvpair_t *nvpair_move_string_array(const char *name, char **value, size_t nitems);
+
+bool nvpair_get_bool(const nvpair_t *nvp);
+uint64_t nvpair_get_number(const nvpair_t *nvp);
+const char *nvpair_get_string(const nvpair_t *nvp);
+const nvlist_t *nvpair_get_nvlist(const nvpair_t *nvp);
+int nvpair_get_descriptor(const nvpair_t *nvp);
+const void *nvpair_get_binary(const nvpair_t *nvp, size_t *sizep);
+const bool *nvpair_get_bool_array(const nvpair_t *nvp, size_t *nitemsp);
+const uint64_t *nvpair_get_number_array(const nvpair_t *nvp, size_t *nitemsp);
+const char * const *nvpair_get_string_array(const nvpair_t *nvp, size_t *nitemsp);
+const nvlist_t * const *nvpair_get_nvlist_array(const nvpair_t *nvp, size_t *nitemsp);
+const int *nvpair_get_descriptor_array(const nvpair_t *nvp, size_t *nitemsp);
void nvpair_free(nvpair_t *nvp);
-nvpair_t *nvpair_createf_null(const char *namefmt, ...) __printflike(1, 2);
-nvpair_t *nvpair_createf_bool(bool value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_createf_number(uint64_t value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_createf_string(const char *value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_createf_nvlist(const nvlist_t *value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_createf_descriptor(int value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_createf_binary(const void *value, size_t size, const char *namefmt, ...) __printflike(3, 4);
-
-nvpair_t *nvpair_createv_null(const char *namefmt, va_list nameap) __printflike(1, 0);
-nvpair_t *nvpair_createv_bool(bool value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_createv_number(uint64_t value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_createv_string(const char *value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_createv_nvlist(const nvlist_t *value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_createv_descriptor(int value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_createv_binary(const void *value, size_t size, const char *namefmt, va_list nameap) __printflike(3, 0);
-
-nvpair_t *nvpair_movef_string(char *value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_movef_nvlist(nvlist_t *value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_movef_descriptor(int value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_movef_binary(void *value, size_t size, const char *namefmt, ...) __printflike(3, 4);
-
-nvpair_t *nvpair_movev_string(char *value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_movev_nvlist(nvlist_t *value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_movev_descriptor(int value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_movev_binary(void *value, size_t size, const char *namefmt, va_list nameap) __printflike(3, 0);
-
#endif /* !_NV_IMPL_H_ */
diff --git a/external/libnv/subr_nvlist.c b/external/libnv/sys/nvlist.c
index d42f8357..cf8281e7 100644
--- a/external/libnv/subr_nvlist.c
+++ b/external/libnv/sys/nvlist.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2009-2013 The FreeBSD Foundation
+ * Copyright (c) 2013-2015 Mariusz Zaborski <oshogbo@FreeBSD.org>
* All rights reserved.
*
* This software was developed by Pawel Jakub Dawidek under sponsorship from
@@ -28,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/sys/kern/subr_nvlist.c 279439 2015-03-01 00:34:27Z rstone $");
+__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/endian.h>
@@ -65,9 +66,10 @@ __FBSDID("$FreeBSD: head/sys/kern/subr_nvlist.c 279439 2015-03-01 00:34:27Z rsto
#endif
#include <sys/nv.h>
-#include <sys/nv_impl.h>
-#include <sys/nvlist_impl.h>
-#include <sys/nvpair_impl.h>
+
+#include "nv_impl.h"
+#include "nvlist_impl.h"
+#include "nvpair_impl.h"
#ifndef HAVE_PJDLOG
#ifdef _KERNEL
@@ -87,8 +89,8 @@ __FBSDID("$FreeBSD: head/sys/kern/subr_nvlist.c 279439 2015-03-01 00:34:27Z rsto
#endif
#endif
-#define NV_FLAG_PRIVATE_MASK (NV_FLAG_BIG_ENDIAN)
-#define NV_FLAG_PUBLIC_MASK (NV_FLAG_IGNORE_CASE)
+#define NV_FLAG_PRIVATE_MASK (NV_FLAG_BIG_ENDIAN | NV_FLAG_IN_ARRAY)
+#define NV_FLAG_PUBLIC_MASK (NV_FLAG_IGNORE_CASE | NV_FLAG_NO_UNIQUE)
#define NV_FLAG_ALL_MASK (NV_FLAG_PRIVATE_MASK | NV_FLAG_PUBLIC_MASK)
#define NVLIST_MAGIC 0x6e766c /* "nvl" */
@@ -97,6 +99,7 @@ struct nvlist {
int nvl_error;
int nvl_flags;
nvpair_t *nvl_parent;
+ nvpair_t *nvl_array_next;
struct nvl_head nvl_head;
};
@@ -129,9 +132,12 @@ nvlist_create(int flags)
PJDLOG_ASSERT((flags & ~(NV_FLAG_PUBLIC_MASK)) == 0);
nvl = nv_malloc(sizeof(*nvl));
+ if (nvl == NULL)
+ return (NULL);
nvl->nvl_error = 0;
nvl->nvl_flags = flags;
nvl->nvl_parent = NULL;
+ nvl->nvl_array_next = NULL;
TAILQ_INIT(&nvl->nvl_head);
nvl->nvl_magic = NVLIST_MAGIC;
@@ -142,12 +148,11 @@ void
nvlist_destroy(nvlist_t *nvl)
{
nvpair_t *nvp;
- int serrno;
if (nvl == NULL)
return;
- SAVE_ERRNO(serrno);
+ ERRNO_SAVE();
NVLIST_ASSERT(nvl);
@@ -155,10 +160,14 @@ nvlist_destroy(nvlist_t *nvl)
nvlist_remove_nvpair(nvl, nvp);
nvpair_free(nvp);
}
+ if (nvl->nvl_array_next != NULL)
+ nvpair_free_structure(nvl->nvl_array_next);
+ nvl->nvl_array_next = NULL;
+ nvl->nvl_parent = NULL;
nvl->nvl_magic = 0;
nv_free(nvl);
- RESTORE_ERRNO(serrno);
+ ERRNO_RESTORE();
}
void
@@ -221,6 +230,59 @@ nvlist_set_parent(nvlist_t *nvl, nvpair_t *parent)
nvl->nvl_parent = parent;
}
+void
+nvlist_set_array_next(nvlist_t *nvl, nvpair_t *ele)
+{
+
+ NVLIST_ASSERT(nvl);
+
+ if (ele != NULL)
+ nvl->nvl_flags |= NV_FLAG_IN_ARRAY;
+ else
+ nvl->nvl_flags &= ~NV_FLAG_IN_ARRAY;
+
+ nvl->nvl_array_next = ele;
+}
+
+bool
+nvlist_in_array(const nvlist_t *nvl)
+{
+
+ NVLIST_ASSERT(nvl);
+
+ return ((nvl->nvl_flags & NV_FLAG_IN_ARRAY) != 0);
+}
+
+const nvlist_t *
+nvlist_get_array_next(const nvlist_t *nvl)
+{
+ nvpair_t *nvp;
+
+ NVLIST_ASSERT(nvl);
+
+ nvp = nvl->nvl_array_next;
+ if (nvp == NULL)
+ return (NULL);
+
+ return (nvpair_get_nvlist(nvp));
+}
+
+const nvlist_t *
+nvlist_get_pararr(const nvlist_t *nvl, void **cookiep)
+{
+ const nvlist_t *ret;
+
+ ret = nvlist_get_array_next(nvl);
+ if (ret != NULL) {
+ if (cookiep != NULL)
+ *cookiep = NULL;
+ return (ret);
+ }
+
+ ret = nvlist_get_parent(nvl, cookiep);
+ return (ret);
+}
+
bool
nvlist_empty(const nvlist_t *nvl)
{
@@ -231,6 +293,26 @@ nvlist_empty(const nvlist_t *nvl)
return (nvlist_first_nvpair(nvl) == NULL);
}
+int
+nvlist_flags(const nvlist_t *nvl)
+{
+
+ NVLIST_ASSERT(nvl);
+ PJDLOG_ASSERT(nvl->nvl_error == 0);
+
+ return (nvl->nvl_flags & NV_FLAG_PUBLIC_MASK);
+}
+
+void
+nvlist_set_flags(nvlist_t *nvl, int flags)
+{
+
+ NVLIST_ASSERT(nvl);
+ PJDLOG_ASSERT(nvl->nvl_error == 0);
+
+ nvl->nvl_flags = flags;
+}
+
static void
nvlist_report_missing(int type, const char *name)
{
@@ -264,7 +346,7 @@ nvlist_find(const nvlist_t *nvl, int type, const char *name)
}
if (nvp == NULL)
- RESTORE_ERRNO(ENOENT);
+ ERRNO_SET(ENOENT);
return (nvp);
}
@@ -281,37 +363,6 @@ nvlist_exists_type(const nvlist_t *nvl, const char *name, int type)
return (nvlist_find(nvl, type, name) != NULL);
}
-#ifndef _KERNEL
-bool
-nvlist_existsf_type(const nvlist_t *nvl, int type, const char *namefmt, ...)
-{
- va_list nameap;
- bool ret;
-
- va_start(nameap, namefmt);
- ret = nvlist_existsv_type(nvl, type, namefmt, nameap);
- va_end(nameap);
-
- return (ret);
-}
-
-bool
-nvlist_existsv_type(const nvlist_t *nvl, int type, const char *namefmt,
- va_list nameap)
-{
- char *name;
- bool exists;
-
- nv_vasprintf(&name, namefmt, nameap);
- if (name == NULL)
- return (false);
-
- exists = nvlist_exists_type(nvl, name, type);
- nv_free(name);
- return (exists);
-}
-#endif
-
void
nvlist_free_type(nvlist_t *nvl, const char *name, int type)
{
@@ -329,30 +380,6 @@ nvlist_free_type(nvlist_t *nvl, const char *name, int type)
nvlist_report_missing(type, name);
}
-#ifndef _KERNEL
-void
-nvlist_freef_type(nvlist_t *nvl, int type, const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_freev_type(nvl, type, namefmt, nameap);
- va_end(nameap);
-}
-
-void
-nvlist_freev_type(nvlist_t *nvl, int type, const char *namefmt, va_list nameap)
-{
- char *name;
-
- nv_vasprintf(&name, namefmt, nameap);
- if (name == NULL)
- nvlist_report_missing(type, "<unknown>");
- nvlist_free_type(nvl, name, type);
- nv_free(name);
-}
-#endif
-
nvlist_t *
nvlist_clone(const nvlist_t *nvl)
{
@@ -362,7 +389,7 @@ nvlist_clone(const nvlist_t *nvl)
NVLIST_ASSERT(nvl);
if (nvl->nvl_error != 0) {
- RESTORE_ERRNO(nvl->nvl_error);
+ ERRNO_SET(nvl->nvl_error);
return (NULL);
}
@@ -372,7 +399,7 @@ nvlist_clone(const nvlist_t *nvl)
newnvp = nvpair_clone(nvp);
if (newnvp == NULL)
break;
- nvlist_move_nvpair(newnvl, newnvp);
+ (void)nvlist_move_nvpair(newnvl, newnvp);
}
if (nvp != NULL) {
nvlist_destroy(newnvl);
@@ -460,17 +487,129 @@ nvlist_dump(const nvlist_t *nvl, int fd)
dprintf(fd, "\n");
break;
}
+ case NV_TYPE_BOOL_ARRAY:
+ {
+ const bool *value;
+ unsigned int ii;
+ size_t nitems;
+
+ value = nvpair_get_bool_array(nvp, &nitems);
+ dprintf(fd, " [ ");
+ for (ii = 0; ii < nitems; ii++) {
+ dprintf(fd, "%s", value[ii] ? "TRUE" : "FALSE");
+ if (ii != nitems - 1)
+ dprintf(fd, ", ");
+ }
+ dprintf(fd, " ]\n");
+ break;
+ }
+ case NV_TYPE_STRING_ARRAY:
+ {
+ const char * const *value;
+ unsigned int ii;
+ size_t nitems;
+
+ value = nvpair_get_string_array(nvp, &nitems);
+ dprintf(fd, " [ ");
+ for (ii = 0; ii < nitems; ii++) {
+ if (value[ii] == NULL)
+ dprintf(fd, "NULL");
+ else
+ dprintf(fd, "\"%s\"", value[ii]);
+ if (ii != nitems - 1)
+ dprintf(fd, ", ");
+ }
+ dprintf(fd, " ]\n");
+ break;
+ }
+ case NV_TYPE_NUMBER_ARRAY:
+ {
+ const uint64_t *value;
+ unsigned int ii;
+ size_t nitems;
+
+ value = nvpair_get_number_array(nvp, &nitems);
+ dprintf(fd, " [ ");
+ for (ii = 0; ii < nitems; ii++) {
+ dprintf(fd, "%ju (%jd) (0x%jx)",
+ value[ii], value[ii], value[ii]);
+ if (ii != nitems - 1)
+ dprintf(fd, ", ");
+ }
+ dprintf(fd, " ]\n");
+ break;
+ }
+ case NV_TYPE_DESCRIPTOR_ARRAY:
+ {
+ const int *value;
+ unsigned int ii;
+ size_t nitems;
+
+ value = nvpair_get_descriptor_array(nvp, &nitems);
+ dprintf(fd, " [ ");
+ for (ii = 0; ii < nitems; ii++) {
+ dprintf(fd, "%d", value[ii]);
+ if (ii != nitems - 1)
+ dprintf(fd, ", ");
+ }
+ dprintf(fd, " ]\n");
+ break;
+ }
+ case NV_TYPE_NVLIST_ARRAY:
+ {
+ const nvlist_t * const *value;
+ unsigned int ii;
+ size_t nitems;
+
+ value = nvpair_get_nvlist_array(nvp, &nitems);
+ dprintf(fd, " %zu\n", nitems);
+ tmpnvl = NULL;
+ tmpnvp = NULL;
+ for (ii = 0; ii < nitems; ii++) {
+ if (nvlist_dump_error_check(value[ii], fd,
+ level + 1)) {
+ break;
+ }
+
+ if (tmpnvl == NULL) {
+ tmpnvp = nvlist_first_nvpair(value[ii]);
+ if (tmpnvp != NULL) {
+ tmpnvl = value[ii];
+ } else {
+ dprintf(fd, "%*s,\n",
+ (level + 1) * 4, "");
+ }
+ }
+ }
+ if (tmpnvp != NULL) {
+ nvl = tmpnvl;
+ nvp = tmpnvp;
+ level++;
+ continue;
+ }
+ break;
+ }
default:
PJDLOG_ABORT("Unknown type: %d.", nvpair_type(nvp));
}
while ((nvp = nvlist_next_nvpair(nvl, nvp)) == NULL) {
- cookie = NULL;
- nvl = nvlist_get_parent(nvl, &cookie);
- if (nvl == NULL)
- return;
- nvp = cookie;
- level--;
+ do {
+ cookie = NULL;
+ if (nvlist_in_array(nvl))
+ dprintf(fd, "%*s,\n", level * 4, "");
+ nvl = nvlist_get_pararr(nvl, &cookie);
+ if (nvl == NULL)
+ return;
+ if (nvlist_in_array(nvl) && cookie == NULL) {
+ nvp = nvlist_first_nvpair(nvl);
+ } else {
+ nvp = cookie;
+ level--;
+ }
+ } while (nvp == NULL);
+ if (nvlist_in_array(nvl) && cookie == NULL)
+ break;
}
}
}
@@ -491,9 +630,11 @@ size_t
nvlist_size(const nvlist_t *nvl)
{
const nvlist_t *tmpnvl;
+ const nvlist_t * const *nvlarray;
const nvpair_t *nvp, *tmpnvp;
void *cookie;
- size_t size;
+ size_t size, nitems;
+ unsigned int ii;
NVLIST_ASSERT(nvl);
PJDLOG_ASSERT(nvl->nvl_error == 0);
@@ -514,16 +655,47 @@ nvlist_size(const nvlist_t *nvl)
nvp = tmpnvp;
continue;
}
+ } else if (nvpair_type(nvp) == NV_TYPE_NVLIST_ARRAY) {
+ nvlarray = nvpair_get_nvlist_array(nvp, &nitems);
+ PJDLOG_ASSERT(nitems > 0);
+
+ size += (nvpair_header_size() + 1) * nitems;
+ size += sizeof(struct nvlist_header) * nitems;
+
+ tmpnvl = NULL;
+ tmpnvp = NULL;
+ for (ii = 0; ii < nitems; ii++) {
+ PJDLOG_ASSERT(nvlarray[ii]->nvl_error == 0);
+ tmpnvp = nvlist_first_nvpair(nvlarray[ii]);
+ if (tmpnvp != NULL) {
+ tmpnvl = nvlarray[ii];
+ break;
+ }
+ }
+ if (tmpnvp != NULL) {
+ nvp = tmpnvp;
+ nvl = tmpnvl;
+ continue;
+ }
+
} else {
size += nvpair_size(nvp);
}
while ((nvp = nvlist_next_nvpair(nvl, nvp)) == NULL) {
- cookie = NULL;
- nvl = nvlist_get_parent(nvl, &cookie);
- if (nvl == NULL)
- goto out;
- nvp = cookie;
+ do {
+ cookie = NULL;
+ nvl = nvlist_get_pararr(nvl, &cookie);
+ if (nvl == NULL)
+ goto out;
+ if (nvlist_in_array(nvl) && cookie == NULL) {
+ nvp = nvlist_first_nvpair(nvl);
+ } else {
+ nvp = cookie;
+ }
+ } while (nvp == NULL);
+ if (nvlist_in_array(nvl) && cookie == NULL)
+ break;
}
}
@@ -533,27 +705,57 @@ out:
#ifndef _KERNEL
static int *
-nvlist_xdescriptors(const nvlist_t *nvl, int *descs, int level)
+nvlist_xdescriptors(const nvlist_t *nvl, int *descs)
{
- const nvpair_t *nvp;
+ nvpair_t *nvp;
+ const char *name;
+ int type;
NVLIST_ASSERT(nvl);
PJDLOG_ASSERT(nvl->nvl_error == 0);
- PJDLOG_ASSERT(level < 3);
- for (nvp = nvlist_first_nvpair(nvl); nvp != NULL;
- nvp = nvlist_next_nvpair(nvl, nvp)) {
- switch (nvpair_type(nvp)) {
- case NV_TYPE_DESCRIPTOR:
- *descs = nvpair_get_descriptor(nvp);
- descs++;
- break;
- case NV_TYPE_NVLIST:
- descs = nvlist_xdescriptors(nvpair_get_nvlist(nvp),
- descs, level + 1);
- break;
+ nvp = NULL;
+ do {
+ while ((name = nvlist_next(nvl, &type, (void**)&nvp)) != NULL) {
+ switch (type) {
+ case NV_TYPE_DESCRIPTOR:
+ *descs = nvpair_get_descriptor(nvp);
+ descs++;
+ break;
+ case NV_TYPE_DESCRIPTOR_ARRAY:
+ {
+ const int *value;
+ size_t nitems;
+ unsigned int ii;
+
+ value = nvpair_get_descriptor_array(nvp,
+ &nitems);
+ for (ii = 0; ii < nitems; ii++) {
+ *descs = value[ii];
+ descs++;
+ }
+ break;
+ }
+ case NV_TYPE_NVLIST:
+ nvl = nvpair_get_nvlist(nvp);
+ nvp = NULL;
+ break;
+ case NV_TYPE_NVLIST_ARRAY:
+ {
+ const nvlist_t * const *value;
+ size_t nitems;
+
+ value = nvpair_get_nvlist_array(nvp, &nitems);
+ PJDLOG_ASSERT(value != NULL);
+ PJDLOG_ASSERT(nitems > 0);
+
+ nvl = value[0];
+ nvp = NULL;
+ break;
+ }
+ }
}
- }
+ } while ((nvl = nvlist_get_pararr(nvl, (void**)&nvp)) != NULL);
return (descs);
}
@@ -571,7 +773,7 @@ nvlist_descriptors(const nvlist_t *nvl, size_t *nitemsp)
if (fds == NULL)
return (NULL);
if (nitems > 0)
- nvlist_xdescriptors(nvl, fds, 0);
+ nvlist_xdescriptors(nvl, fds);
fds[nitems] = -1;
if (nitemsp != NULL)
*nitemsp = nitems;
@@ -579,30 +781,55 @@ nvlist_descriptors(const nvlist_t *nvl, size_t *nitemsp)
}
#endif
-static size_t
-nvlist_xndescriptors(const nvlist_t *nvl, int level)
+size_t
+nvlist_ndescriptors(const nvlist_t *nvl)
{
#ifndef _KERNEL
- const nvpair_t *nvp;
+ nvpair_t *nvp;
+ const char *name;
size_t ndescs;
+ int type;
NVLIST_ASSERT(nvl);
PJDLOG_ASSERT(nvl->nvl_error == 0);
- PJDLOG_ASSERT(level < 3);
ndescs = 0;
- for (nvp = nvlist_first_nvpair(nvl); nvp != NULL;
- nvp = nvlist_next_nvpair(nvl, nvp)) {
- switch (nvpair_type(nvp)) {
- case NV_TYPE_DESCRIPTOR:
- ndescs++;
- break;
- case NV_TYPE_NVLIST:
- ndescs += nvlist_xndescriptors(nvpair_get_nvlist(nvp),
- level + 1);
- break;
+ nvp = NULL;
+ do {
+ while ((name = nvlist_next(nvl, &type, (void**)&nvp)) != NULL) {
+ switch (type) {
+ case NV_TYPE_DESCRIPTOR:
+ ndescs++;
+ break;
+ case NV_TYPE_NVLIST:
+ nvl = nvpair_get_nvlist(nvp);
+ nvp = NULL;
+ break;
+ case NV_TYPE_NVLIST_ARRAY:
+ {
+ const nvlist_t * const *value;
+ size_t nitems;
+
+ value = nvpair_get_nvlist_array(nvp, &nitems);
+ PJDLOG_ASSERT(value != NULL);
+ PJDLOG_ASSERT(nitems > 0);
+
+ nvl = value[0];
+ nvp = NULL;
+ break;
+ }
+ case NV_TYPE_DESCRIPTOR_ARRAY:
+ {
+ size_t nitems;
+
+ (void)nvpair_get_descriptor_array(nvp,
+ &nitems);
+ ndescs += nitems;
+ break;
+ }
+ }
}
- }
+ } while ((nvl = nvlist_get_pararr(nvl, (void**)&nvp)) != NULL);
return (ndescs);
#else
@@ -610,13 +837,6 @@ nvlist_xndescriptors(const nvlist_t *nvl, int level)
#endif
}
-size_t
-nvlist_ndescriptors(const nvlist_t *nvl)
-{
-
- return (nvlist_xndescriptors(nvl, 0));
-}
-
static unsigned char *
nvlist_pack_header(const nvlist_t *nvl, unsigned char *ptr, size_t *leftp)
{
@@ -640,7 +860,7 @@ nvlist_pack_header(const nvlist_t *nvl, unsigned char *ptr, size_t *leftp)
return (ptr);
}
-void *
+static void *
nvlist_xpack(const nvlist_t *nvl, int64_t *fdidxp, size_t *sizep)
{
unsigned char *buf, *ptr;
@@ -652,7 +872,7 @@ nvlist_xpack(const nvlist_t *nvl, int64_t *fdidxp, size_t *sizep)
NVLIST_ASSERT(nvl);
if (nvl->nvl_error != 0) {
- RESTORE_ERRNO(nvl->nvl_error);
+ ERRNO_SET(nvl->nvl_error);
return (NULL);
}
@@ -672,10 +892,8 @@ nvlist_xpack(const nvlist_t *nvl, int64_t *fdidxp, size_t *sizep)
nvpair_init_datasize(nvp);
ptr = nvpair_pack_header(nvp, ptr, &left);
- if (ptr == NULL) {
- nv_free(buf);
- return (NULL);
- }
+ if (ptr == NULL)
+ goto fail;
switch (nvpair_type(nvp)) {
case NV_TYPE_NULL:
ptr = nvpair_pack_null(nvp, ptr, &left);
@@ -693,7 +911,7 @@ nvlist_xpack(const nvlist_t *nvl, int64_t *fdidxp, size_t *sizep)
tmpnvl = nvpair_get_nvlist(nvp);
ptr = nvlist_pack_header(tmpnvl, ptr, &left);
if (ptr == NULL)
- goto out;
+ goto fail;
tmpnvp = nvlist_first_nvpair(tmpnvl);
if (tmpnvp != NULL) {
nvl = tmpnvl;
@@ -706,26 +924,86 @@ nvlist_xpack(const nvlist_t *nvl, int64_t *fdidxp, size_t *sizep)
case NV_TYPE_DESCRIPTOR:
ptr = nvpair_pack_descriptor(nvp, ptr, fdidxp, &left);
break;
+ case NV_TYPE_DESCRIPTOR_ARRAY:
+ ptr = nvpair_pack_descriptor_array(nvp, ptr, fdidxp,
+ &left);
+ break;
#endif
case NV_TYPE_BINARY:
ptr = nvpair_pack_binary(nvp, ptr, &left);
break;
+ case NV_TYPE_BOOL_ARRAY:
+ ptr = nvpair_pack_bool_array(nvp, ptr, &left);
+ break;
+ case NV_TYPE_NUMBER_ARRAY:
+ ptr = nvpair_pack_number_array(nvp, ptr, &left);
+ break;
+ case NV_TYPE_STRING_ARRAY:
+ ptr = nvpair_pack_string_array(nvp, ptr, &left);
+ break;
+ case NV_TYPE_NVLIST_ARRAY:
+ {
+ const nvlist_t * const * value;
+ size_t nitems;
+ unsigned int ii;
+
+ tmpnvl = NULL;
+ value = nvpair_get_nvlist_array(nvp, &nitems);
+ for (ii = 0; ii < nitems; ii++) {
+ ptr = nvlist_pack_header(value[ii], ptr, &left);
+ if (ptr == NULL)
+ goto out;
+ tmpnvp = nvlist_first_nvpair(value[ii]);
+ if (tmpnvp != NULL) {
+ tmpnvl = value[ii];
+ break;
+ }
+ ptr = nvpair_pack_nvlist_array_next(ptr, &left);
+ if (ptr == NULL)
+ goto out;
+ }
+ if (tmpnvl != NULL) {
+ nvl = tmpnvl;
+ nvp = tmpnvp;
+ continue;
+ }
+ break;
+ }
default:
PJDLOG_ABORT("Invalid type (%d).", nvpair_type(nvp));
}
- if (ptr == NULL) {
- nv_free(buf);
- return (NULL);
- }
+ if (ptr == NULL)
+ goto fail;
while ((nvp = nvlist_next_nvpair(nvl, nvp)) == NULL) {
- cookie = NULL;
- nvl = nvlist_get_parent(nvl, &cookie);
- if (nvl == NULL)
- goto out;
- nvp = cookie;
- ptr = nvpair_pack_nvlist_up(ptr, &left);
- if (ptr == NULL)
- goto out;
+ do {
+ cookie = NULL;
+ if (nvlist_in_array(nvl)) {
+ ptr = nvpair_pack_nvlist_array_next(ptr,
+ &left);
+ if (ptr == NULL)
+ goto fail;
+ }
+ nvl = nvlist_get_pararr(nvl, &cookie);
+ if (nvl == NULL)
+ goto out;
+ if (nvlist_in_array(nvl) && cookie == NULL) {
+ nvp = nvlist_first_nvpair(nvl);
+ ptr = nvlist_pack_header(nvl, ptr,
+ &left);
+ if (ptr == NULL)
+ goto fail;
+ } else if (nvpair_type((nvpair_t *)cookie) !=
+ NV_TYPE_NVLIST_ARRAY) {
+ ptr = nvpair_pack_nvlist_up(ptr, &left);
+ if (ptr == NULL)
+ goto fail;
+ nvp = cookie;
+ } else {
+ nvp = cookie;
+ }
+ } while (nvp == NULL);
+ if (nvlist_in_array(nvl) && cookie == NULL)
+ break;
}
}
@@ -733,6 +1011,9 @@ out:
if (sizep != NULL)
*sizep = size;
return (buf);
+fail:
+ nv_free(buf);
+ return (NULL);
}
void *
@@ -742,12 +1023,12 @@ nvlist_pack(const nvlist_t *nvl, size_t *sizep)
NVLIST_ASSERT(nvl);
if (nvl->nvl_error != 0) {
- RESTORE_ERRNO(nvl->nvl_error);
+ ERRNO_SET(nvl->nvl_error);
return (NULL);
}
if (nvlist_ndescriptors(nvl) > 0) {
- RESTORE_ERRNO(EOPNOTSUPP);
+ ERRNO_SET(EOPNOTSUPP);
return (NULL);
}
@@ -759,11 +1040,11 @@ nvlist_check_header(struct nvlist_header *nvlhdrp)
{
if (nvlhdrp->nvlh_magic != NVLIST_HEADER_MAGIC) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (false);
}
if ((nvlhdrp->nvlh_flags & ~NV_FLAG_ALL_MASK) != 0) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (false);
}
#if BYTE_ORDER == BIG_ENDIAN
@@ -785,6 +1066,7 @@ nvlist_unpack_header(nvlist_t *nvl, const unsigned char *ptr, size_t nfds,
bool *isbep, size_t *leftp)
{
struct nvlist_header nvlhdr;
+ int inarrayf;
if (*leftp < sizeof(nvlhdr))
goto failed;
@@ -806,7 +1088,8 @@ nvlist_unpack_header(nvlist_t *nvl, const unsigned char *ptr, size_t nfds,
if ((nvlhdr.nvlh_flags & ~NV_FLAG_ALL_MASK) != 0)
goto failed;
- nvl->nvl_flags = (nvlhdr.nvlh_flags & NV_FLAG_PUBLIC_MASK);
+ inarrayf = (nvl->nvl_flags & NV_FLAG_IN_ARRAY);
+ nvl->nvl_flags = (nvlhdr.nvlh_flags & NV_FLAG_PUBLIC_MASK) | inarrayf;
ptr += sizeof(nvlhdr);
if (isbep != NULL)
@@ -815,23 +1098,26 @@ nvlist_unpack_header(nvlist_t *nvl, const unsigned char *ptr, size_t nfds,
return (ptr);
failed:
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
-nvlist_t *
-nvlist_xunpack(const void *buf, size_t size, const int *fds, size_t nfds)
+static nvlist_t *
+nvlist_xunpack(const void *buf, size_t size, const int *fds, size_t nfds,
+ int flags)
{
const unsigned char *ptr;
- nvlist_t *nvl, *retnvl, *tmpnvl;
+ nvlist_t *nvl, *retnvl, *tmpnvl, *array;
nvpair_t *nvp;
size_t left;
bool isbe;
+ PJDLOG_ASSERT((flags & ~(NV_FLAG_PUBLIC_MASK)) == 0);
+
left = size;
ptr = buf;
- tmpnvl = NULL;
+ tmpnvl = array = NULL;
nvl = retnvl = nvlist_create(0);
if (nvl == NULL)
goto failed;
@@ -839,6 +1125,10 @@ nvlist_xunpack(const void *buf, size_t size, const int *fds, size_t nfds)
ptr = nvlist_unpack_header(nvl, ptr, nfds, &isbe, &left);
if (ptr == NULL)
goto failed;
+ if (nvl->nvl_flags != flags) {
+ ERRNO_SET(EILSEQ);
+ goto failed;
+ }
while (left > 0) {
ptr = nvpair_unpack(isbe, ptr, &left, &nvp);
@@ -860,6 +1150,8 @@ nvlist_xunpack(const void *buf, size_t size, const int *fds, size_t nfds)
case NV_TYPE_NVLIST:
ptr = nvpair_unpack_nvlist(isbe, nvp, ptr, &left, nfds,
&tmpnvl);
+ if (tmpnvl == NULL || ptr == NULL)
+ goto failed;
nvlist_set_parent(tmpnvl, nvp);
break;
#ifndef _KERNEL
@@ -867,6 +1159,10 @@ nvlist_xunpack(const void *buf, size_t size, const int *fds, size_t nfds)
ptr = nvpair_unpack_descriptor(isbe, nvp, ptr, &left,
fds, nfds);
break;
+ case NV_TYPE_DESCRIPTOR_ARRAY:
+ ptr = nvpair_unpack_descriptor_array(isbe, nvp, ptr,
+ &left, fds, nfds);
+ break;
#endif
case NV_TYPE_BINARY:
ptr = nvpair_unpack_binary(isbe, nvp, ptr, &left);
@@ -875,13 +1171,53 @@ nvlist_xunpack(const void *buf, size_t size, const int *fds, size_t nfds)
if (nvl->nvl_parent == NULL)
goto failed;
nvl = nvpair_nvlist(nvl->nvl_parent);
+ nvpair_free_structure(nvp);
continue;
+ case NV_TYPE_NVLIST_ARRAY_NEXT:
+ if (nvl->nvl_array_next == NULL) {
+ if (nvl->nvl_parent == NULL)
+ goto failed;
+ nvl = nvpair_nvlist(nvl->nvl_parent);
+ } else {
+ nvl = __DECONST(nvlist_t *,
+ nvlist_get_array_next(nvl));
+ ptr = nvlist_unpack_header(nvl, ptr, nfds,
+ &isbe, &left);
+ if (ptr == NULL)
+ goto failed;
+ }
+ nvpair_free_structure(nvp);
+ continue;
+ case NV_TYPE_BOOL_ARRAY:
+ ptr = nvpair_unpack_bool_array(isbe, nvp, ptr, &left);
+ break;
+ case NV_TYPE_NUMBER_ARRAY:
+ ptr = nvpair_unpack_number_array(isbe, nvp, ptr, &left);
+ break;
+ case NV_TYPE_STRING_ARRAY:
+ ptr = nvpair_unpack_string_array(isbe, nvp, ptr, &left);
+ break;
+ case NV_TYPE_NVLIST_ARRAY:
+ ptr = nvpair_unpack_nvlist_array(isbe, nvp, ptr, &left,
+ &array);
+ if (ptr == NULL)
+ goto failed;
+ tmpnvl = array;
+ while (array != NULL) {
+ nvlist_set_parent(array, nvp);
+ array = __DECONST(nvlist_t *,
+ nvlist_get_array_next(array));
+ }
+ ptr = nvlist_unpack_header(tmpnvl, ptr, nfds, &isbe,
+ &left);
+ break;
default:
PJDLOG_ABORT("Invalid type (%d).", nvpair_type(nvp));
}
if (ptr == NULL)
goto failed;
- nvlist_move_nvpair(nvl, nvp);
+ if (!nvlist_move_nvpair(nvl, nvp))
+ goto failed;
if (tmpnvl != NULL) {
nvl = tmpnvl;
tmpnvl = NULL;
@@ -895,10 +1231,10 @@ failed:
}
nvlist_t *
-nvlist_unpack(const void *buf, size_t size)
+nvlist_unpack(const void *buf, size_t size, int flags)
{
- return (nvlist_xunpack(buf, size, NULL, 0));
+ return (nvlist_xunpack(buf, size, NULL, 0, flags));
}
#ifndef _KERNEL
@@ -909,10 +1245,10 @@ nvlist_send(int sock, const nvlist_t *nvl)
int *fds;
void *data;
int64_t fdidx;
- int serrno, ret;
+ int ret;
if (nvlist_error(nvl) != 0) {
- errno = nvlist_error(nvl);
+ ERRNO_SET(nvlist_error(nvl));
return (-1);
}
@@ -938,21 +1274,21 @@ nvlist_send(int sock, const nvlist_t *nvl)
ret = 0;
out:
- serrno = errno;
- free(fds);
- free(data);
- errno = serrno;
+ ERRNO_SAVE();
+ nv_free(fds);
+ nv_free(data);
+ ERRNO_RESTORE();
return (ret);
}
nvlist_t *
-nvlist_recv(int sock)
+nvlist_recv(int sock, int flags)
{
struct nvlist_header nvlhdr;
nvlist_t *nvl, *ret;
unsigned char *buf;
size_t nfds, size, i;
- int serrno, *fds;
+ int *fds;
if (buf_recv(sock, &nvlhdr, sizeof(nvlhdr)) == -1)
return (NULL);
@@ -963,7 +1299,7 @@ nvlist_recv(int sock)
nfds = (size_t)nvlhdr.nvlh_descriptors;
size = sizeof(nvlhdr) + (size_t)nvlhdr.nvlh_size;
- buf = malloc(size);
+ buf = nv_malloc(size);
if (buf == NULL)
return (NULL);
@@ -976,32 +1312,34 @@ nvlist_recv(int sock)
goto out;
if (nfds > 0) {
- fds = malloc(nfds * sizeof(fds[0]));
+ fds = nv_malloc(nfds * sizeof(fds[0]));
if (fds == NULL)
goto out;
if (fd_recv(sock, fds, nfds) == -1)
goto out;
}
- nvl = nvlist_xunpack(buf, size, fds, nfds);
+ nvl = nvlist_xunpack(buf, size, fds, nfds, flags);
if (nvl == NULL) {
+ ERRNO_SAVE();
for (i = 0; i < nfds; i++)
close(fds[i]);
+ ERRNO_RESTORE();
goto out;
}
ret = nvl;
out:
- serrno = errno;
- free(buf);
- free(fds);
- errno = serrno;
+ ERRNO_SAVE();
+ nv_free(buf);
+ nv_free(fds);
+ ERRNO_RESTORE();
return (ret);
}
nvlist_t *
-nvlist_xfer(int sock, nvlist_t *nvl)
+nvlist_xfer(int sock, nvlist_t *nvl, int flags)
{
if (nvlist_send(sock, nvl) < 0) {
@@ -1009,7 +1347,7 @@ nvlist_xfer(int sock, nvlist_t *nvl)
return (NULL);
}
nvlist_destroy(nvl);
- return (nvlist_recv(sock));
+ return (nvlist_recv(sock, flags));
}
#endif
@@ -1059,9 +1397,8 @@ nvlist_next(const nvlist_t *nvl, int *typep, void **cookiep)
nvpair_t *nvp;
NVLIST_ASSERT(nvl);
- PJDLOG_ASSERT(cookiep != NULL);
- if (*cookiep == NULL)
+ if (cookiep == NULL || *cookiep == NULL)
nvp = nvlist_first_nvpair(nvl);
else
nvp = nvlist_next_nvpair(nvl, *cookiep);
@@ -1069,7 +1406,8 @@ nvlist_next(const nvlist_t *nvl, int *typep, void **cookiep)
return (NULL);
if (typep != NULL)
*typep = nvpair_type(nvp);
- *cookiep = nvp;
+ if (cookiep != NULL)
+ *cookiep = nvp;
return (nvpair_name(nvp));
}
@@ -1093,93 +1431,18 @@ NVLIST_EXISTS(bool, BOOL)
NVLIST_EXISTS(number, NUMBER)
NVLIST_EXISTS(string, STRING)
NVLIST_EXISTS(nvlist, NVLIST)
+NVLIST_EXISTS(binary, BINARY)
+NVLIST_EXISTS(bool_array, BOOL_ARRAY)
+NVLIST_EXISTS(number_array, NUMBER_ARRAY)
+NVLIST_EXISTS(string_array, STRING_ARRAY)
+NVLIST_EXISTS(nvlist_array, NVLIST_ARRAY)
#ifndef _KERNEL
NVLIST_EXISTS(descriptor, DESCRIPTOR)
+NVLIST_EXISTS(descriptor_array, DESCRIPTOR_ARRAY)
#endif
-NVLIST_EXISTS(binary, BINARY)
#undef NVLIST_EXISTS
-#ifndef _KERNEL
-bool
-nvlist_existsf(const nvlist_t *nvl, const char *namefmt, ...)
-{
- va_list nameap;
- bool ret;
-
- va_start(nameap, namefmt);
- ret = nvlist_existsv(nvl, namefmt, nameap);
- va_end(nameap);
- return (ret);
-}
-
-#define NVLIST_EXISTSF(type) \
-bool \
-nvlist_existsf_##type(const nvlist_t *nvl, const char *namefmt, ...) \
-{ \
- va_list nameap; \
- bool ret; \
- \
- va_start(nameap, namefmt); \
- ret = nvlist_existsv_##type(nvl, namefmt, nameap); \
- va_end(nameap); \
- return (ret); \
-}
-
-NVLIST_EXISTSF(null)
-NVLIST_EXISTSF(bool)
-NVLIST_EXISTSF(number)
-NVLIST_EXISTSF(string)
-NVLIST_EXISTSF(nvlist)
-#ifndef _KERNEL
-NVLIST_EXISTSF(descriptor)
-#endif
-NVLIST_EXISTSF(binary)
-
-#undef NVLIST_EXISTSF
-
-bool
-nvlist_existsv(const nvlist_t *nvl, const char *namefmt, va_list nameap)
-{
- char *name;
- bool exists;
-
- nv_vasprintf(&name, namefmt, nameap);
- if (name == NULL)
- return (false);
-
- exists = nvlist_exists(nvl, name);
- nv_free(name);
- return (exists);
-}
-
-#define NVLIST_EXISTSV(type) \
-bool \
-nvlist_existsv_##type(const nvlist_t *nvl, const char *namefmt, \
- va_list nameap) \
-{ \
- char *name; \
- bool exists; \
- \
- vasprintf(&name, namefmt, nameap); \
- if (name == NULL) \
- return (false); \
- exists = nvlist_exists_##type(nvl, name); \
- free(name); \
- return (exists); \
-}
-
-NVLIST_EXISTSV(null)
-NVLIST_EXISTSV(bool)
-NVLIST_EXISTSV(number)
-NVLIST_EXISTSV(string)
-NVLIST_EXISTSV(nvlist)
-NVLIST_EXISTSV(descriptor)
-NVLIST_EXISTSV(binary)
-
-#undef NVLIST_EXISTSV
-#endif
-
void
nvlist_add_nvpair(nvlist_t *nvl, const nvpair_t *nvp)
{
@@ -1188,19 +1451,21 @@ nvlist_add_nvpair(nvlist_t *nvl, const nvpair_t *nvp)
NVPAIR_ASSERT(nvp);
if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- if (nvlist_exists(nvl, nvpair_name(nvp))) {
- nvl->nvl_error = EEXIST;
- RESTORE_ERRNO(nvlist_error(nvl));
- return;
+ if ((nvl->nvl_flags & NV_FLAG_NO_UNIQUE) == 0) {
+ if (nvlist_exists(nvl, nvpair_name(nvp))) {
+ nvl->nvl_error = EEXIST;
+ ERRNO_SET(nvlist_error(nvl));
+ return;
+ }
}
newnvp = nvpair_clone(nvp);
if (newnvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvlist_error(nvl));
+ ERRNO_SET(nvlist_error(nvl));
return;
}
@@ -1208,34 +1473,6 @@ nvlist_add_nvpair(nvlist_t *nvl, const nvpair_t *nvp)
}
void
-nvlist_add_null(nvlist_t *nvl, const char *name)
-{
-
- nvlist_addf_null(nvl, "%s", name);
-}
-
-void
-nvlist_add_bool(nvlist_t *nvl, const char *name, bool value)
-{
-
- nvlist_addf_bool(nvl, value, "%s", name);
-}
-
-void
-nvlist_add_number(nvlist_t *nvl, const char *name, uint64_t value)
-{
-
- nvlist_addf_number(nvl, value, "%s", name);
-}
-
-void
-nvlist_add_string(nvlist_t *nvl, const char *name, const char *value)
-{
-
- nvlist_addf_string(nvl, value, "%s", name);
-}
-
-void
nvlist_add_stringf(nvlist_t *nvl, const char *name, const char *valuefmt, ...)
{
va_list valueap;
@@ -1252,405 +1489,352 @@ nvlist_add_stringv(nvlist_t *nvl, const char *name, const char *valuefmt,
nvpair_t *nvp;
if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
+ ERRNO_SET(nvlist_error(nvl));
return;
}
nvp = nvpair_create_stringv(name, valuefmt, valueap);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
- nvlist_move_nvpair(nvl, nvp);
+ ERRNO_SET(nvl->nvl_error);
+ } else {
+ (void)nvlist_move_nvpair(nvl, nvp);
+ }
}
void
-nvlist_add_nvlist(nvlist_t *nvl, const char *name, const nvlist_t *value)
+nvlist_add_null(nvlist_t *nvl, const char *name)
{
+ nvpair_t *nvp;
- nvlist_addf_nvlist(nvl, value, "%s", name);
-}
-
-#ifndef _KERNEL
-void
-nvlist_add_descriptor(nvlist_t *nvl, const char *name, int value)
-{
+ if (nvlist_error(nvl) != 0) {
+ ERRNO_SET(nvlist_error(nvl));
+ return;
+ }
- nvlist_addf_descriptor(nvl, value, "%s", name);
+ nvp = nvpair_create_null(name);
+ if (nvp == NULL) {
+ nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
+ ERRNO_SET(nvl->nvl_error);
+ } else {
+ (void)nvlist_move_nvpair(nvl, nvp);
+ }
}
-#endif
void
nvlist_add_binary(nvlist_t *nvl, const char *name, const void *value,
size_t size)
{
+ nvpair_t *nvp;
- nvlist_addf_binary(nvl, value, size, "%s", name);
-}
-
-void
-nvlist_addf_null(nvlist_t *nvl, const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_addv_null(nvl, namefmt, nameap);
- va_end(nameap);
-}
-
-void
-nvlist_addf_bool(nvlist_t *nvl, bool value, const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_addv_bool(nvl, value, namefmt, nameap);
- va_end(nameap);
-}
-
-void
-nvlist_addf_number(nvlist_t *nvl, uint64_t value, const char *namefmt, ...)
-{
- va_list nameap;
+ if (nvlist_error(nvl) != 0) {
+ ERRNO_SET(nvlist_error(nvl));
+ return;
+ }
- va_start(nameap, namefmt);
- nvlist_addv_number(nvl, value, namefmt, nameap);
- va_end(nameap);
+ nvp = nvpair_create_binary(name, value, size);
+ if (nvp == NULL) {
+ nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
+ ERRNO_SET(nvl->nvl_error);
+ } else {
+ (void)nvlist_move_nvpair(nvl, nvp);
+ }
}
-void
-nvlist_addf_string(nvlist_t *nvl, const char *value, const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_addv_string(nvl, value, namefmt, nameap);
- va_end(nameap);
-}
-void
-nvlist_addf_nvlist(nvlist_t *nvl, const nvlist_t *value, const char *namefmt,
- ...)
-{
- va_list nameap;
+#define NVLIST_ADD(vtype, type) \
+void \
+nvlist_add_##type(nvlist_t *nvl, const char *name, vtype value) \
+{ \
+ nvpair_t *nvp; \
+ \
+ if (nvlist_error(nvl) != 0) { \
+ ERRNO_SET(nvlist_error(nvl)); \
+ return; \
+ } \
+ \
+ nvp = nvpair_create_##type(name, value); \
+ if (nvp == NULL) { \
+ nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM); \
+ ERRNO_SET(nvl->nvl_error); \
+ } else { \
+ (void)nvlist_move_nvpair(nvl, nvp); \
+ } \
+}
+
+NVLIST_ADD(bool, bool)
+NVLIST_ADD(uint64_t, number)
+NVLIST_ADD(const char *, string)
+NVLIST_ADD(const nvlist_t *, nvlist)
+#ifndef _KERNEL
+NVLIST_ADD(int, descriptor);
+#endif
- va_start(nameap, namefmt);
- nvlist_addv_nvlist(nvl, value, namefmt, nameap);
- va_end(nameap);
-}
+#undef NVLIST_ADD
+#define NVLIST_ADD_ARRAY(vtype, type) \
+void \
+nvlist_add_##type##_array(nvlist_t *nvl, const char *name, vtype value, \
+ size_t nitems) \
+{ \
+ nvpair_t *nvp; \
+ \
+ if (nvlist_error(nvl) != 0) { \
+ ERRNO_SET(nvlist_error(nvl)); \
+ return; \
+ } \
+ \
+ nvp = nvpair_create_##type##_array(name, value, nitems); \
+ if (nvp == NULL) { \
+ nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM); \
+ ERRNO_SET(nvl->nvl_error); \
+ } else { \
+ (void)nvlist_move_nvpair(nvl, nvp); \
+ } \
+}
+
+NVLIST_ADD_ARRAY(const bool *, bool)
+NVLIST_ADD_ARRAY(const uint64_t *, number)
+NVLIST_ADD_ARRAY(const char * const *, string)
+NVLIST_ADD_ARRAY(const nvlist_t * const *, nvlist)
#ifndef _KERNEL
-void
-nvlist_addf_descriptor(nvlist_t *nvl, int value, const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_addv_descriptor(nvl, value, namefmt, nameap);
- va_end(nameap);
-}
+NVLIST_ADD_ARRAY(const int *, descriptor)
#endif
-void
-nvlist_addf_binary(nvlist_t *nvl, const void *value, size_t size,
- const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_addv_binary(nvl, value, size, namefmt, nameap);
- va_end(nameap);
-}
+#undef NVLIST_ADD_ARRAY
-void
-nvlist_addv_null(nvlist_t *nvl, const char *namefmt, va_list nameap)
+bool
+nvlist_move_nvpair(nvlist_t *nvl, nvpair_t *nvp)
{
- nvpair_t *nvp;
+
+ NVPAIR_ASSERT(nvp);
+ PJDLOG_ASSERT(nvpair_nvlist(nvp) == NULL);
if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
- return;
+ nvpair_free(nvp);
+ ERRNO_SET(nvlist_error(nvl));
+ return (false);
+ }
+ if ((nvl->nvl_flags & NV_FLAG_NO_UNIQUE) == 0) {
+ if (nvlist_exists(nvl, nvpair_name(nvp))) {
+ nvpair_free(nvp);
+ nvl->nvl_error = EEXIST;
+ ERRNO_SET(nvl->nvl_error);
+ return (false);
+ }
}
- nvp = nvpair_createv_null(namefmt, nameap);
- if (nvp == NULL) {
- nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
- nvlist_move_nvpair(nvl, nvp);
+ nvpair_insert(&nvl->nvl_head, nvp, nvl);
+ return (true);
}
void
-nvlist_addv_bool(nvlist_t *nvl, bool value, const char *namefmt, va_list nameap)
+nvlist_move_string(nvlist_t *nvl, const char *name, char *value)
{
nvpair_t *nvp;
if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
+ nv_free(value);
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_createv_bool(value, namefmt, nameap);
+ nvp = nvpair_move_string(name, value);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
- nvlist_move_nvpair(nvl, nvp);
+ ERRNO_SET(nvl->nvl_error);
+ } else {
+ (void)nvlist_move_nvpair(nvl, nvp);
+ }
}
void
-nvlist_addv_number(nvlist_t *nvl, uint64_t value, const char *namefmt,
- va_list nameap)
+nvlist_move_nvlist(nvlist_t *nvl, const char *name, nvlist_t *value)
{
nvpair_t *nvp;
if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
+ if (value != NULL && nvlist_get_nvpair_parent(value) != NULL)
+ nvlist_destroy(value);
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_createv_number(value, namefmt, nameap);
+ nvp = nvpair_move_nvlist(name, value);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
- nvlist_move_nvpair(nvl, nvp);
+ ERRNO_SET(nvl->nvl_error);
+ } else {
+ (void)nvlist_move_nvpair(nvl, nvp);
+ }
}
+#ifndef _KERNEL
void
-nvlist_addv_string(nvlist_t *nvl, const char *value, const char *namefmt,
- va_list nameap)
+nvlist_move_descriptor(nvlist_t *nvl, const char *name, int value)
{
nvpair_t *nvp;
if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
+ close(value);
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_createv_string(value, namefmt, nameap);
+ nvp = nvpair_move_descriptor(name, value);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
- nvlist_move_nvpair(nvl, nvp);
+ ERRNO_SET(nvl->nvl_error);
+ } else {
+ (void)nvlist_move_nvpair(nvl, nvp);
+ }
}
+#endif
void
-nvlist_addv_nvlist(nvlist_t *nvl, const nvlist_t *value, const char *namefmt,
- va_list nameap)
+nvlist_move_binary(nvlist_t *nvl, const char *name, void *value, size_t size)
{
nvpair_t *nvp;
if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
+ nv_free(value);
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_createv_nvlist(value, namefmt, nameap);
+ nvp = nvpair_move_binary(name, value, size);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
- nvlist_move_nvpair(nvl, nvp);
+ ERRNO_SET(nvl->nvl_error);
+ } else {
+ (void)nvlist_move_nvpair(nvl, nvp);
+ }
}
-#ifndef _KERNEL
void
-nvlist_addv_descriptor(nvlist_t *nvl, int value, const char *namefmt,
- va_list nameap)
+nvlist_move_bool_array(nvlist_t *nvl, const char *name, bool *value,
+ size_t nitems)
{
nvpair_t *nvp;
if (nvlist_error(nvl) != 0) {
- errno = nvlist_error(nvl);
+ nv_free(value);
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_createv_descriptor(value, namefmt, nameap);
- if (nvp == NULL)
- nvl->nvl_error = errno = (errno != 0 ? errno : ENOMEM);
- else
- nvlist_move_nvpair(nvl, nvp);
+ nvp = nvpair_move_bool_array(name, value, nitems);
+ if (nvp == NULL) {
+ nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
+ ERRNO_SET(nvl->nvl_error);
+ } else {
+ (void)nvlist_move_nvpair(nvl, nvp);
+ }
}
-#endif
void
-nvlist_addv_binary(nvlist_t *nvl, const void *value, size_t size,
- const char *namefmt, va_list nameap)
+nvlist_move_string_array(nvlist_t *nvl, const char *name, char **value,
+ size_t nitems)
{
nvpair_t *nvp;
+ size_t i;
if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
+ if (value != NULL) {
+ for (i = 0; i < nitems; i++)
+ nv_free(value[i]);
+ nv_free(value);
+ }
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_createv_binary(value, size, namefmt, nameap);
+ nvp = nvpair_move_string_array(name, value, nitems);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
- nvlist_move_nvpair(nvl, nvp);
-}
-
-void
-nvlist_move_nvpair(nvlist_t *nvl, nvpair_t *nvp)
-{
-
- NVPAIR_ASSERT(nvp);
- PJDLOG_ASSERT(nvpair_nvlist(nvp) == NULL);
-
- if (nvlist_error(nvl) != 0) {
- nvpair_free(nvp);
- RESTORE_ERRNO(nvlist_error(nvl));
- return;
- }
- if (nvlist_exists(nvl, nvpair_name(nvp))) {
- nvpair_free(nvp);
- nvl->nvl_error = EEXIST;
- RESTORE_ERRNO(nvl->nvl_error);
- return;
+ ERRNO_SET(nvl->nvl_error);
+ } else {
+ (void)nvlist_move_nvpair(nvl, nvp);
}
-
- nvpair_insert(&nvl->nvl_head, nvp, nvl);
}
-#define NVLIST_MOVE(vtype, type) \
-void \
-nvlist_move_##type(nvlist_t *nvl, const char *name, vtype value) \
-{ \
- \
- nvlist_movef_##type(nvl, value, "%s", name); \
-}
-
-NVLIST_MOVE(char *, string)
-NVLIST_MOVE(nvlist_t *, nvlist)
-#ifndef _KERNEL
-NVLIST_MOVE(int, descriptor)
-#endif
-
-#undef NVLIST_MOVE
-
void
-nvlist_move_binary(nvlist_t *nvl, const char *name, void *value, size_t size)
-{
-
- nvlist_movef_binary(nvl, value, size, "%s", name);
-}
-
-#define NVLIST_MOVEF(vtype, type) \
-void \
-nvlist_movef_##type(nvlist_t *nvl, vtype value, const char *namefmt, \
- ...) \
-{ \
- va_list nameap; \
- \
- va_start(nameap, namefmt); \
- nvlist_movev_##type(nvl, value, namefmt, nameap); \
- va_end(nameap); \
-}
-
-NVLIST_MOVEF(char *, string)
-NVLIST_MOVEF(nvlist_t *, nvlist)
-#ifndef _KERNEL
-NVLIST_MOVEF(int, descriptor)
-#endif
-
-#undef NVLIST_MOVEF
-
-void
-nvlist_movef_binary(nvlist_t *nvl, void *value, size_t size,
- const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_movev_binary(nvl, value, size, namefmt, nameap);
- va_end(nameap);
-}
-
-void
-nvlist_movev_string(nvlist_t *nvl, char *value, const char *namefmt,
- va_list nameap)
+nvlist_move_nvlist_array(nvlist_t *nvl, const char *name, nvlist_t **value,
+ size_t nitems)
{
nvpair_t *nvp;
+ size_t i;
if (nvlist_error(nvl) != 0) {
+ if (value != NULL) {
+ for (i = 0; i < nitems; i++) {
+ if (nvlist_get_pararr(value[i], NULL) == NULL)
+ nvlist_destroy(value[i]);
+ }
+ }
nv_free(value);
- RESTORE_ERRNO(nvlist_error(nvl));
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_movev_string(value, namefmt, nameap);
+ nvp = nvpair_move_nvlist_array(name, value, nitems);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
- nvlist_move_nvpair(nvl, nvp);
+ ERRNO_SET(nvl->nvl_error);
+ } else {
+ (void)nvlist_move_nvpair(nvl, nvp);
+ }
}
void
-nvlist_movev_nvlist(nvlist_t *nvl, nvlist_t *value, const char *namefmt,
- va_list nameap)
+nvlist_move_number_array(nvlist_t *nvl, const char *name, uint64_t *value,
+ size_t nitems)
{
nvpair_t *nvp;
if (nvlist_error(nvl) != 0) {
- if (value != NULL && nvlist_get_nvpair_parent(value) != NULL)
- nvlist_destroy(value);
- RESTORE_ERRNO(nvlist_error(nvl));
+ nv_free(value);
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_movev_nvlist(value, namefmt, nameap);
+ nvp = nvpair_move_number_array(name, value, nitems);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
- nvlist_move_nvpair(nvl, nvp);
+ ERRNO_SET(nvl->nvl_error);
+ } else {
+ (void)nvlist_move_nvpair(nvl, nvp);
+ }
}
#ifndef _KERNEL
void
-nvlist_movev_descriptor(nvlist_t *nvl, int value, const char *namefmt,
- va_list nameap)
+nvlist_move_descriptor_array(nvlist_t *nvl, const char *name, int *value,
+ size_t nitems)
{
nvpair_t *nvp;
+ size_t i;
if (nvlist_error(nvl) != 0) {
- close(value);
- errno = nvlist_error(nvl);
- return;
- }
-
- nvp = nvpair_movev_descriptor(value, namefmt, nameap);
- if (nvp == NULL)
- nvl->nvl_error = errno = (errno != 0 ? errno : ENOMEM);
- else
- nvlist_move_nvpair(nvl, nvp);
-}
-#endif
-
-void
-nvlist_movev_binary(nvlist_t *nvl, void *value, size_t size,
- const char *namefmt, va_list nameap)
-{
- nvpair_t *nvp;
+ if (value != 0) {
+ for (i = 0; i < nitems; i++)
+ close(value[i]);
+ nv_free(value);
+ }
- if (nvlist_error(nvl) != 0) {
- nv_free(value);
- RESTORE_ERRNO(nvlist_error(nvl));
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_movev_binary(value, size, namefmt, nameap);
+ nvp = nvpair_move_descriptor_array(name, value, nitems);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
- nvlist_move_nvpair(nvl, nvp);
+ ERRNO_SET(nvl->nvl_error);
+ } else {
+ (void)nvlist_move_nvpair(nvl, nvp);
+ }
}
+#endif
const nvpair_t *
nvlist_get_nvpair(const nvlist_t *nvl, const char *name)
@@ -1693,84 +1877,29 @@ nvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep)
return (nvpair_get_binary(nvp, sizep));
}
-#define NVLIST_GETF(ftype, type) \
+#define NVLIST_GET_ARRAY(ftype, type, TYPE) \
ftype \
-nvlist_getf_##type(const nvlist_t *nvl, const char *namefmt, ...) \
+nvlist_get_##type##_array(const nvlist_t *nvl, const char *name, \
+ size_t *nitems) \
{ \
- va_list nameap; \
- ftype value; \
- \
- va_start(nameap, namefmt); \
- value = nvlist_getv_##type(nvl, namefmt, nameap); \
- va_end(nameap); \
+ const nvpair_t *nvp; \
\
- return (value); \
+ nvp = nvlist_find(nvl, NV_TYPE_##TYPE##_ARRAY, name); \
+ if (nvp == NULL) \
+ nvlist_report_missing(NV_TYPE_##TYPE##_ARRAY, name); \
+ return (nvpair_get_##type##_array(nvp, nitems)); \
}
+NVLIST_GET_ARRAY(const bool *, bool, BOOL)
+NVLIST_GET_ARRAY(const uint64_t *, number, NUMBER)
+NVLIST_GET_ARRAY(const char * const *, string, STRING)
+NVLIST_GET_ARRAY(const nvlist_t * const *, nvlist, NVLIST)
#ifndef _KERNEL
-NVLIST_GETF(bool, bool)
-NVLIST_GETF(uint64_t, number)
-NVLIST_GETF(const char *, string)
-NVLIST_GETF(const nvlist_t *, nvlist)
-NVLIST_GETF(int, descriptor)
-
-#undef NVLIST_GETF
-
-const void *
-nvlist_getf_binary(const nvlist_t *nvl, size_t *sizep, const char *namefmt, ...)
-{
- va_list nameap;
- const void *value;
-
- va_start(nameap, namefmt);
- value = nvlist_getv_binary(nvl, sizep, namefmt, nameap);
- va_end(nameap);
-
- return (value);
-}
-
-#define NVLIST_GETV(ftype, type, TYPE) \
-ftype \
-nvlist_getv_##type(const nvlist_t *nvl, const char *namefmt, \
- va_list nameap) \
-{ \
- char *name; \
- ftype value; \
- \
- vasprintf(&name, namefmt, nameap); \
- if (name == NULL) \
- nvlist_report_missing(NV_TYPE_##TYPE, "<unknown>"); \
- value = nvlist_get_##type(nvl, name); \
- free(name); \
- \
- return (value); \
-}
-
-NVLIST_GETV(bool, bool, BOOL)
-NVLIST_GETV(uint64_t, number, NUMBER)
-NVLIST_GETV(const char *, string, STRING)
-NVLIST_GETV(const nvlist_t *, nvlist, NVLIST)
-NVLIST_GETV(int, descriptor, DESCRIPTOR)
-
-#undef NVLIST_GETV
-
-const void *
-nvlist_getv_binary(const nvlist_t *nvl, size_t *sizep, const char *namefmt,
- va_list nameap)
-{
- char *name;
- const void *binary;
-
- nv_vasprintf(&name, namefmt, nameap);
- if (name == NULL)
- nvlist_report_missing(NV_TYPE_BINARY, "<unknown>");
-
- binary = nvlist_get_binary(nvl, name, sizep);
- nv_free(name);
- return (binary);
-}
+NVLIST_GET_ARRAY(const int *, descriptor, DESCRIPTOR)
#endif
+#undef NVLIST_GET_ARRAY
+
#define NVLIST_TAKE(ftype, type, TYPE) \
ftype \
nvlist_take_##type(nvlist_t *nvl, const char *name) \
@@ -1813,80 +1942,29 @@ nvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep)
return (value);
}
-#define NVLIST_TAKEF(ftype, type) \
+#define NVLIST_TAKE_ARRAY(ftype, type, TYPE) \
ftype \
-nvlist_takef_##type(nvlist_t *nvl, const char *namefmt, ...) \
+nvlist_take_##type##_array(nvlist_t *nvl, const char *name, \
+ size_t *nitems) \
{ \
- va_list nameap; \
+ nvpair_t *nvp; \
ftype value; \
\
- va_start(nameap, namefmt); \
- value = nvlist_takev_##type(nvl, namefmt, nameap); \
- va_end(nameap); \
- \
+ nvp = nvlist_find(nvl, NV_TYPE_##TYPE##_ARRAY, name); \
+ if (nvp == NULL) \
+ nvlist_report_missing(NV_TYPE_##TYPE##_ARRAY, name); \
+ value = (ftype)(intptr_t)nvpair_get_##type##_array(nvp, nitems);\
+ nvlist_remove_nvpair(nvl, nvp); \
+ nvpair_free_structure(nvp); \
return (value); \
}
+NVLIST_TAKE_ARRAY(bool *, bool, BOOL)
+NVLIST_TAKE_ARRAY(uint64_t *, number, NUMBER)
+NVLIST_TAKE_ARRAY(char **, string, STRING)
+NVLIST_TAKE_ARRAY(nvlist_t **, nvlist, NVLIST)
#ifndef _KERNEL
-NVLIST_TAKEF(bool, bool)
-NVLIST_TAKEF(uint64_t, number)
-NVLIST_TAKEF(char *, string)
-NVLIST_TAKEF(nvlist_t *, nvlist)
-NVLIST_TAKEF(int, descriptor)
-
-#undef NVLIST_TAKEF
-
-void *
-nvlist_takef_binary(nvlist_t *nvl, size_t *sizep, const char *namefmt, ...)
-{
- va_list nameap;
- void *value;
-
- va_start(nameap, namefmt);
- value = nvlist_takev_binary(nvl, sizep, namefmt, nameap);
- va_end(nameap);
-
- return (value);
-}
-
-#define NVLIST_TAKEV(ftype, type, TYPE) \
-ftype \
-nvlist_takev_##type(nvlist_t *nvl, const char *namefmt, va_list nameap) \
-{ \
- char *name; \
- ftype value; \
- \
- vasprintf(&name, namefmt, nameap); \
- if (name == NULL) \
- nvlist_report_missing(NV_TYPE_##TYPE, "<unknown>"); \
- value = nvlist_take_##type(nvl, name); \
- free(name); \
- return (value); \
-}
-
-NVLIST_TAKEV(bool, bool, BOOL)
-NVLIST_TAKEV(uint64_t, number, NUMBER)
-NVLIST_TAKEV(char *, string, STRING)
-NVLIST_TAKEV(nvlist_t *, nvlist, NVLIST)
-NVLIST_TAKEV(int, descriptor, DESCRIPTOR)
-
-#undef NVLIST_TAKEV
-
-void *
-nvlist_takev_binary(nvlist_t *nvl, size_t *sizep, const char *namefmt,
- va_list nameap)
-{
- char *name;
- void *binary;
-
- nv_vasprintf(&name, namefmt, nameap);
- if (name == NULL)
- nvlist_report_missing(NV_TYPE_BINARY, "<unknown>");
-
- binary = nvlist_take_binary(nvl, name, sizep);
- nv_free(name);
- return (binary);
-}
+NVLIST_TAKE_ARRAY(int *, descriptor, DESCRIPTOR)
#endif
void
@@ -1920,75 +1998,18 @@ NVLIST_FREE(bool, BOOL)
NVLIST_FREE(number, NUMBER)
NVLIST_FREE(string, STRING)
NVLIST_FREE(nvlist, NVLIST)
+NVLIST_FREE(binary, BINARY)
+NVLIST_FREE(bool_array, BOOL_ARRAY)
+NVLIST_FREE(number_array, NUMBER_ARRAY)
+NVLIST_FREE(string_array, STRING_ARRAY)
+NVLIST_FREE(nvlist_array, NVLIST_ARRAY)
#ifndef _KERNEL
NVLIST_FREE(descriptor, DESCRIPTOR)
+NVLIST_FREE(descriptor_array, DESCRIPTOR_ARRAY)
#endif
-NVLIST_FREE(binary, BINARY)
#undef NVLIST_FREE
-#ifndef _KERNEL
-void
-nvlist_freef(nvlist_t *nvl, const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_freev(nvl, namefmt, nameap);
- va_end(nameap);
-}
-
-#define NVLIST_FREEF(type) \
-void \
-nvlist_freef_##type(nvlist_t *nvl, const char *namefmt, ...) \
-{ \
- va_list nameap; \
- \
- va_start(nameap, namefmt); \
- nvlist_freev_##type(nvl, namefmt, nameap); \
- va_end(nameap); \
-}
-
-NVLIST_FREEF(null)
-NVLIST_FREEF(bool)
-NVLIST_FREEF(number)
-NVLIST_FREEF(string)
-NVLIST_FREEF(nvlist)
-NVLIST_FREEF(descriptor)
-NVLIST_FREEF(binary)
-
-#undef NVLIST_FREEF
-
-void
-nvlist_freev(nvlist_t *nvl, const char *namefmt, va_list nameap)
-{
-
- nvlist_freev_type(nvl, NV_TYPE_NONE, namefmt, nameap);
-}
-
-#define NVLIST_FREEV(type, TYPE) \
-void \
-nvlist_freev_##type(nvlist_t *nvl, const char *namefmt, va_list nameap) \
-{ \
- char *name; \
- \
- vasprintf(&name, namefmt, nameap); \
- if (name == NULL) \
- nvlist_report_missing(NV_TYPE_##TYPE, "<unknown>"); \
- nvlist_free_##type(nvl, name); \
- free(name); \
-}
-
-NVLIST_FREEV(null, NULL)
-NVLIST_FREEV(bool, BOOL)
-NVLIST_FREEV(number, NUMBER)
-NVLIST_FREEV(string, STRING)
-NVLIST_FREEV(nvlist, NVLIST)
-NVLIST_FREEV(descriptor, DESCRIPTOR)
-NVLIST_FREEV(binary, BINARY)
-#undef NVLIST_FREEV
-#endif
-
void
nvlist_free_nvpair(nvlist_t *nvl, nvpair_t *nvp)
{
@@ -2000,3 +2021,4 @@ nvlist_free_nvpair(nvlist_t *nvl, nvpair_t *nvp)
nvlist_remove_nvpair(nvl, nvp);
nvpair_free(nvp);
}
+
diff --git a/external/libnv/sys/nvlist_impl.h b/external/libnv/sys/nvlist_impl.h
index 1576afd5..9952db8f 100644
--- a/external/libnv/sys/nvlist_impl.h
+++ b/external/libnv/sys/nvlist_impl.h
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2013 The FreeBSD Foundation
+ * Copyright (c) 2013-2015 Mariusz Zaborski <oshogbo@FreeBSD.org>
* All rights reserved.
*
* This software was developed by Pawel Jakub Dawidek under sponsorship from
@@ -26,22 +27,18 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: head/sys/sys/nvlist_impl.h 279439 2015-03-01 00:34:27Z rstone $
+ * $FreeBSD$
*/
#ifndef _NVLIST_IMPL_H_
#define _NVLIST_IMPL_H_
+#include <sys/nv.h>
+
#ifndef _KERNEL
#include <stdint.h>
#endif
-#include "nv.h"
-
-void *nvlist_xpack(const nvlist_t *nvl, int64_t *fdidxp, size_t *sizep);
-nvlist_t *nvlist_xunpack(const void *buf, size_t size, const int *fds,
- size_t nfds);
-
nvpair_t *nvlist_get_nvpair_parent(const nvlist_t *nvl);
const unsigned char *nvlist_unpack_header(nvlist_t *nvl,
const unsigned char *ptr, size_t nfds, bool *isbep, size_t *leftp);
diff --git a/external/libnv/subr_nvpair.c b/external/libnv/sys/nvpair.c
index f887e547..1e3bd0ea 100644
--- a/external/libnv/subr_nvpair.c
+++ b/external/libnv/sys/nvpair.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2009-2013 The FreeBSD Foundation
+ * Copyright (c) 2013-2015 Mariusz Zaborski <oshogbo@FreeBSD.org>
* All rights reserved.
*
* This software was developed by Pawel Jakub Dawidek under sponsorship from
@@ -28,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/sys/kern/subr_nvpair.c 279439 2015-03-01 00:34:27Z rstone $");
+__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/endian.h>
@@ -61,9 +62,10 @@ __FBSDID("$FreeBSD: head/sys/kern/subr_nvpair.c 279439 2015-03-01 00:34:27Z rsto
#endif
#include <sys/nv.h>
-#include <sys/nv_impl.h>
-#include <sys/nvlist_impl.h>
-#include <sys/nvpair_impl.h>
+
+#include "nv_impl.h"
+#include "nvlist_impl.h"
+#include "nvpair_impl.h"
#ifndef HAVE_PJDLOG
#ifdef _KERNEL
@@ -85,6 +87,7 @@ struct nvpair {
int nvp_type;
uint64_t nvp_data;
size_t nvp_datasize;
+ size_t nvp_nitems; /* Used only for array types. */
nvlist_t *nvp_list;
TAILQ_ENTRY(nvpair) nvp_next;
};
@@ -98,6 +101,7 @@ struct nvpair_header {
uint8_t nvph_type;
uint16_t nvph_namesize;
uint64_t nvph_datasize;
+ uint64_t nvph_nitems;
} __packed;
@@ -108,6 +112,36 @@ nvpair_assert(const nvpair_t *nvp)
NVPAIR_ASSERT(nvp);
}
+static nvpair_t *
+nvpair_allocv(const char *name, int type, uint64_t data, size_t datasize,
+ size_t nitems)
+{
+ nvpair_t *nvp;
+ size_t namelen;
+
+ PJDLOG_ASSERT(type >= NV_TYPE_FIRST && type <= NV_TYPE_LAST);
+
+ namelen = strlen(name);
+ if (namelen >= NV_NAME_MAX) {
+ ERRNO_SET(ENAMETOOLONG);
+ return (NULL);
+ }
+
+ nvp = nv_calloc(1, sizeof(*nvp) + namelen + 1);
+ if (nvp != NULL) {
+ nvp->nvp_name = (char *)(nvp + 1);
+ memcpy(nvp->nvp_name, name, namelen);
+ nvp->nvp_name[namelen] = '\0';
+ nvp->nvp_type = type;
+ nvp->nvp_data = data;
+ nvp->nvp_datasize = datasize;
+ nvp->nvp_nitems = nitems;
+ nvp->nvp_magic = NVPAIR_MAGIC;
+ }
+
+ return (nvp);
+}
+
nvlist_t *
nvpair_nvlist(const nvpair_t *nvp)
{
@@ -143,7 +177,8 @@ nvpair_insert(struct nvl_head *head, nvpair_t *nvp, nvlist_t *nvl)
NVPAIR_ASSERT(nvp);
PJDLOG_ASSERT(nvp->nvp_list == NULL);
- PJDLOG_ASSERT(!nvlist_exists(nvl, nvpair_name(nvp)));
+ PJDLOG_ASSERT((nvlist_flags(nvl) & NV_FLAG_NO_UNIQUE) != 0 ||
+ !nvlist_exists(nvl, nvpair_name(nvp)));
TAILQ_INSERT_TAIL(head, nvp, nvp_next);
nvp->nvp_list = nvl;
@@ -160,6 +195,19 @@ nvpair_remove_nvlist(nvpair_t *nvp)
nvlist_set_parent(nvl, NULL);
}
+static void
+nvpair_remove_nvlist_array(nvpair_t *nvp)
+{
+ nvlist_t **nvlarray;
+ size_t count, i;
+
+ /* XXX: DECONST is bad, mkay? */
+ nvlarray = __DECONST(nvlist_t **,
+ nvpair_get_nvlist_array(nvp, &count));
+ for (i = 0; i < count; i++)
+ nvlist_set_array_next(nvlarray[i], NULL);
+}
+
void
nvpair_remove(struct nvl_head *head, nvpair_t *nvp, const nvlist_t *nvl)
{
@@ -169,6 +217,8 @@ nvpair_remove(struct nvl_head *head, nvpair_t *nvp, const nvlist_t *nvl)
if (nvpair_type(nvp) == NV_TYPE_NVLIST)
nvpair_remove_nvlist(nvp);
+ else if (nvpair_type(nvp) == NV_TYPE_NVLIST_ARRAY)
+ nvpair_remove_nvlist_array(nvp);
TAILQ_REMOVE(head, nvp, nvp_next);
nvp->nvp_list = NULL;
@@ -202,16 +252,36 @@ nvpair_clone(const nvpair_t *nvp)
case NV_TYPE_NVLIST:
newnvp = nvpair_create_nvlist(name, nvpair_get_nvlist(nvp));
break;
+ case NV_TYPE_BINARY:
+ data = nvpair_get_binary(nvp, &datasize);
+ newnvp = nvpair_create_binary(name, data, datasize);
+ break;
+ case NV_TYPE_BOOL_ARRAY:
+ data = nvpair_get_bool_array(nvp, &datasize);
+ newnvp = nvpair_create_bool_array(name, data, datasize);
+ break;
+ case NV_TYPE_NUMBER_ARRAY:
+ data = nvpair_get_number_array(nvp, &datasize);
+ newnvp = nvpair_create_number_array(name, data, datasize);
+ break;
+ case NV_TYPE_STRING_ARRAY:
+ data = nvpair_get_string_array(nvp, &datasize);
+ newnvp = nvpair_create_string_array(name, data, datasize);
+ break;
+ case NV_TYPE_NVLIST_ARRAY:
+ data = nvpair_get_nvlist_array(nvp, &datasize);
+ newnvp = nvpair_create_nvlist_array(name, data, datasize);
+ break;
#ifndef _KERNEL
case NV_TYPE_DESCRIPTOR:
newnvp = nvpair_create_descriptor(name,
nvpair_get_descriptor(nvp));
break;
-#endif
- case NV_TYPE_BINARY:
- data = nvpair_get_binary(nvp, &datasize);
- newnvp = nvpair_create_binary(name, data, datasize);
+ case NV_TYPE_DESCRIPTOR_ARRAY:
+ data = nvpair_get_descriptor_array(nvp, &datasize);
+ newnvp = nvpair_create_descriptor_array(name, data, datasize);
break;
+#endif
default:
PJDLOG_ABORT("Unknown type: %d.", nvpair_type(nvp));
}
@@ -248,6 +318,7 @@ nvpair_pack_header(const nvpair_t *nvp, unsigned char *ptr, size_t *leftp)
PJDLOG_ASSERT(namesize > 0 && namesize <= UINT16_MAX);
nvphdr.nvph_namesize = namesize;
nvphdr.nvph_datasize = nvp->nvp_datasize;
+ nvphdr.nvph_nitems = nvp->nvp_nitems;
PJDLOG_ASSERT(*leftp >= sizeof(nvphdr));
memcpy(ptr, &nvphdr, sizeof(nvphdr));
ptr += sizeof(nvphdr);
@@ -334,6 +405,32 @@ nvpair_pack_nvlist_up(unsigned char *ptr, size_t *leftp)
nvphdr.nvph_type = NV_TYPE_NVLIST_UP;
nvphdr.nvph_namesize = namesize;
nvphdr.nvph_datasize = 0;
+ nvphdr.nvph_nitems = 0;
+ PJDLOG_ASSERT(*leftp >= sizeof(nvphdr));
+ memcpy(ptr, &nvphdr, sizeof(nvphdr));
+ ptr += sizeof(nvphdr);
+ *leftp -= sizeof(nvphdr);
+
+ PJDLOG_ASSERT(*leftp >= namesize);
+ memcpy(ptr, name, namesize);
+ ptr += namesize;
+ *leftp -= namesize;
+
+ return (ptr);
+}
+
+unsigned char *
+nvpair_pack_nvlist_array_next(unsigned char *ptr, size_t *leftp)
+{
+ struct nvpair_header nvphdr;
+ size_t namesize;
+ const char *name = "";
+
+ namesize = 1;
+ nvphdr.nvph_type = NV_TYPE_NVLIST_ARRAY_NEXT;
+ nvphdr.nvph_namesize = namesize;
+ nvphdr.nvph_datasize = 0;
+ nvphdr.nvph_nitems = 0;
PJDLOG_ASSERT(*leftp >= sizeof(nvphdr));
memcpy(ptr, &nvphdr, sizeof(nvphdr));
ptr += sizeof(nvphdr);
@@ -394,6 +491,106 @@ nvpair_pack_binary(const nvpair_t *nvp, unsigned char *ptr, size_t *leftp)
return (ptr);
}
+unsigned char *
+nvpair_pack_bool_array(const nvpair_t *nvp, unsigned char *ptr, size_t *leftp)
+{
+
+ NVPAIR_ASSERT(nvp);
+ PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_BOOL_ARRAY);
+ PJDLOG_ASSERT(*leftp >= nvp->nvp_datasize);
+
+ memcpy(ptr, (const void *)(intptr_t)nvp->nvp_data, nvp->nvp_datasize);
+ ptr += nvp->nvp_datasize;
+ *leftp -= nvp->nvp_datasize;
+
+ return (ptr);
+}
+
+unsigned char *
+nvpair_pack_number_array(const nvpair_t *nvp, unsigned char *ptr, size_t *leftp)
+{
+
+ NVPAIR_ASSERT(nvp);
+ PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_NUMBER_ARRAY);
+ PJDLOG_ASSERT(*leftp >= nvp->nvp_datasize);
+
+ memcpy(ptr, (const void *)(intptr_t)nvp->nvp_data, nvp->nvp_datasize);
+ ptr += nvp->nvp_datasize;
+ *leftp -= nvp->nvp_datasize;
+
+ return (ptr);
+}
+
+unsigned char *
+nvpair_pack_string_array(const nvpair_t *nvp, unsigned char *ptr, size_t *leftp)
+{
+ unsigned int ii;
+ size_t size, len;
+ const char * const *array;
+
+ NVPAIR_ASSERT(nvp);
+ PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_STRING_ARRAY);
+ PJDLOG_ASSERT(*leftp >= nvp->nvp_datasize);
+
+ size = 0;
+ array = nvpair_get_string_array(nvp, NULL);
+ PJDLOG_ASSERT(array != NULL);
+
+ for (ii = 0; ii < nvp->nvp_nitems; ii++) {
+ len = strlen(array[ii]) + 1;
+ PJDLOG_ASSERT(*leftp >= len);
+
+ memcpy(ptr, (const void *)array[ii], len);
+ size += len;
+ ptr += len;
+ *leftp -= len;
+ }
+
+ PJDLOG_ASSERT(size == nvp->nvp_datasize);
+
+ return (ptr);
+}
+
+#ifndef _KERNEL
+unsigned char *
+nvpair_pack_descriptor_array(const nvpair_t *nvp, unsigned char *ptr,
+ int64_t *fdidxp, size_t *leftp)
+{
+ int64_t value;
+ const int *array;
+ unsigned int ii;
+
+ NVPAIR_ASSERT(nvp);
+ PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_DESCRIPTOR_ARRAY);
+ PJDLOG_ASSERT(*leftp >= nvp->nvp_datasize);
+
+ array = nvpair_get_descriptor_array(nvp, NULL);
+ PJDLOG_ASSERT(array != NULL);
+
+ for (ii = 0; ii < nvp->nvp_nitems; ii++) {
+ PJDLOG_ASSERT(*leftp >= sizeof(value));
+
+ value = array[ii];
+ if (value != -1) {
+ /*
+ * If there is a real descriptor here, we change its
+ * number to position in the array of descriptors send
+ * via control message.
+ */
+ PJDLOG_ASSERT(fdidxp != NULL);
+
+ value = *fdidxp;
+ (*fdidxp)++;
+ }
+ memcpy(ptr, &value, sizeof(value));
+ ptr += sizeof(value);
+ *leftp -= sizeof(value);
+ }
+
+ return (ptr);
+}
+#endif
+
void
nvpair_init_datasize(nvpair_t *nvp)
{
@@ -428,7 +625,8 @@ nvpair_unpack_header(bool isbe, nvpair_t *nvp, const unsigned char *ptr,
goto failed;
#endif
if (nvphdr.nvph_type > NV_TYPE_LAST &&
- nvphdr.nvph_type != NV_TYPE_NVLIST_UP) {
+ nvphdr.nvph_type != NV_TYPE_NVLIST_UP &&
+ nvphdr.nvph_type != NV_TYPE_NVLIST_ARRAY_NEXT) {
goto failed;
}
@@ -465,10 +663,11 @@ nvpair_unpack_header(bool isbe, nvpair_t *nvp, const unsigned char *ptr,
nvp->nvp_type = nvphdr.nvph_type;
nvp->nvp_data = 0;
nvp->nvp_datasize = nvphdr.nvph_datasize;
+ nvp->nvp_nitems = nvphdr.nvph_nitems;
return (ptr);
failed:
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -480,7 +679,7 @@ nvpair_unpack_null(bool isbe __unused, nvpair_t *nvp, const unsigned char *ptr,
PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_NULL);
if (nvp->nvp_datasize != 0) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -496,11 +695,11 @@ nvpair_unpack_bool(bool isbe __unused, nvpair_t *nvp, const unsigned char *ptr,
PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_BOOL);
if (nvp->nvp_datasize != sizeof(value)) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
if (*leftp < sizeof(value)) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -509,7 +708,7 @@ nvpair_unpack_bool(bool isbe __unused, nvpair_t *nvp, const unsigned char *ptr,
*leftp -= sizeof(value);
if (value != 0 && value != 1) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -526,11 +725,11 @@ nvpair_unpack_number(bool isbe, nvpair_t *nvp, const unsigned char *ptr,
PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_NUMBER);
if (nvp->nvp_datasize != sizeof(uint64_t)) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
if (*leftp < sizeof(uint64_t)) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -538,6 +737,7 @@ nvpair_unpack_number(bool isbe, nvpair_t *nvp, const unsigned char *ptr,
nvp->nvp_data = be64dec(ptr);
else
nvp->nvp_data = le64dec(ptr);
+
ptr += sizeof(uint64_t);
*leftp -= sizeof(uint64_t);
@@ -552,13 +752,13 @@ nvpair_unpack_string(bool isbe __unused, nvpair_t *nvp,
PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_STRING);
if (*leftp < nvp->nvp_datasize || nvp->nvp_datasize == 0) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
if (strnlen((const char *)ptr, nvp->nvp_datasize) !=
nvp->nvp_datasize - 1) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -581,7 +781,7 @@ nvpair_unpack_nvlist(bool isbe __unused, nvpair_t *nvp,
PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_NVLIST);
if (*leftp < nvp->nvp_datasize || nvp->nvp_datasize == 0) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -609,11 +809,11 @@ nvpair_unpack_descriptor(bool isbe, nvpair_t *nvp, const unsigned char *ptr,
PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_DESCRIPTOR);
if (nvp->nvp_datasize != sizeof(idx)) {
- errno = EINVAL;
+ ERRNO_SET(EINVAL);
return (NULL);
}
if (*leftp < sizeof(idx)) {
- errno = EINVAL;
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -623,12 +823,12 @@ nvpair_unpack_descriptor(bool isbe, nvpair_t *nvp, const unsigned char *ptr,
idx = le64dec(ptr);
if (idx < 0) {
- errno = EINVAL;
+ ERRNO_SET(EINVAL);
return (NULL);
}
if ((size_t)idx >= nfds) {
- errno = EINVAL;
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -650,7 +850,7 @@ nvpair_unpack_binary(bool isbe __unused, nvpair_t *nvp,
PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_BINARY);
if (*leftp < nvp->nvp_datasize || nvp->nvp_datasize == 0) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -668,293 +868,341 @@ nvpair_unpack_binary(bool isbe __unused, nvpair_t *nvp,
}
const unsigned char *
-nvpair_unpack(bool isbe, const unsigned char *ptr, size_t *leftp,
- nvpair_t **nvpp)
+nvpair_unpack_bool_array(bool isbe __unused, nvpair_t *nvp,
+ const unsigned char *ptr, size_t *leftp)
{
- nvpair_t *nvp, *tmp;
-
- nvp = nv_calloc(1, sizeof(*nvp) + NV_NAME_MAX);
- if (nvp == NULL)
- return (NULL);
- nvp->nvp_name = (char *)(nvp + 1);
-
- ptr = nvpair_unpack_header(isbe, nvp, ptr, leftp);
- if (ptr == NULL)
- goto failed;
- tmp = nv_realloc(nvp, sizeof(*nvp) + strlen(nvp->nvp_name) + 1);
- if (tmp == NULL)
- goto failed;
- nvp = tmp;
+ uint8_t *value;
+ size_t size;
+ unsigned int i;
- /* Update nvp_name after realloc(). */
- nvp->nvp_name = (char *)(nvp + 1);
- nvp->nvp_data = 0x00;
- nvp->nvp_magic = NVPAIR_MAGIC;
- *nvpp = nvp;
- return (ptr);
-failed:
- nv_free(nvp);
- return (NULL);
-}
+ PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_BOOL_ARRAY);
-int
-nvpair_type(const nvpair_t *nvp)
-{
+ size = sizeof(*value) * nvp->nvp_nitems;
+ if (nvp->nvp_datasize != size || *leftp < size ||
+ nvp->nvp_nitems == 0 || size < nvp->nvp_nitems) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
- NVPAIR_ASSERT(nvp);
+ value = nv_malloc(size);
+ if (value == NULL)
+ return (NULL);
- return (nvp->nvp_type);
-}
+ for (i = 0; i < nvp->nvp_nitems; i++) {
+ value[i] = *(const uint8_t *)ptr;
-const char *
-nvpair_name(const nvpair_t *nvp)
-{
+ ptr += sizeof(*value);
+ *leftp -= sizeof(*value);
+ }
- NVPAIR_ASSERT(nvp);
+ nvp->nvp_data = (uint64_t)(uintptr_t)value;
- return (nvp->nvp_name);
+ return (ptr);
}
-static nvpair_t *
-nvpair_allocv(int type, uint64_t data, size_t datasize, const char *namefmt,
- va_list nameap)
+const unsigned char *
+nvpair_unpack_number_array(bool isbe, nvpair_t *nvp, const unsigned char *ptr,
+ size_t *leftp)
{
- nvpair_t *nvp;
- char *name;
- int namelen;
+ uint64_t *value;
+ size_t size;
+ unsigned int i;
- PJDLOG_ASSERT(type >= NV_TYPE_FIRST && type <= NV_TYPE_LAST);
+ PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_NUMBER_ARRAY);
- namelen = nv_vasprintf(&name, namefmt, nameap);
- if (namelen < 0)
+ size = sizeof(*value) * nvp->nvp_nitems;
+ if (nvp->nvp_datasize != size || *leftp < size ||
+ nvp->nvp_nitems == 0 || size < nvp->nvp_nitems) {
+ ERRNO_SET(EINVAL);
return (NULL);
+ }
- PJDLOG_ASSERT(namelen > 0);
- if (namelen >= NV_NAME_MAX) {
- nv_free(name);
- RESTORE_ERRNO(ENAMETOOLONG);
+ value = nv_malloc(size);
+ if (value == NULL)
return (NULL);
- }
- nvp = nv_calloc(1, sizeof(*nvp) + namelen + 1);
- if (nvp != NULL) {
- nvp->nvp_name = (char *)(nvp + 1);
- memcpy(nvp->nvp_name, name, namelen + 1);
- nvp->nvp_type = type;
- nvp->nvp_data = data;
- nvp->nvp_datasize = datasize;
- nvp->nvp_magic = NVPAIR_MAGIC;
- }
- nv_free(name);
+ for (i = 0; i < nvp->nvp_nitems; i++) {
+ if (isbe)
+ value[i] = be64dec(ptr);
+ else
+ value[i] = le64dec(ptr);
- return (nvp);
-};
+ ptr += sizeof(*value);
+ *leftp -= sizeof(*value);
+ }
-nvpair_t *
-nvpair_create_null(const char *name)
-{
+ nvp->nvp_data = (uint64_t)(uintptr_t)value;
- return (nvpair_createf_null("%s", name));
+ return (ptr);
}
-nvpair_t *
-nvpair_create_bool(const char *name, bool value)
+const unsigned char *
+nvpair_unpack_string_array(bool isbe __unused, nvpair_t *nvp,
+ const unsigned char *ptr, size_t *leftp)
{
+ ssize_t size;
+ size_t len;
+ const char *tmp;
+ char **value;
+ unsigned int ii, j;
- return (nvpair_createf_bool(value, "%s", name));
-}
+ PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_STRING_ARRAY);
-nvpair_t *
-nvpair_create_number(const char *name, uint64_t value)
-{
+ if (*leftp < nvp->nvp_datasize || nvp->nvp_datasize == 0 ||
+ nvp->nvp_nitems == 0) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
- return (nvpair_createf_number(value, "%s", name));
-}
+ size = nvp->nvp_datasize;
+ tmp = (const char *)ptr;
+ for (ii = 0; ii < nvp->nvp_nitems; ii++) {
+ len = strnlen(tmp, size - 1) + 1;
+ size -= len;
+ if (size < 0) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
+ tmp += len;
+ }
+ if (size != 0) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
-nvpair_t *
-nvpair_create_string(const char *name, const char *value)
-{
+ value = nv_malloc(sizeof(*value) * nvp->nvp_nitems);
+ if (value == NULL)
+ return (NULL);
+
+ for (ii = 0; ii < nvp->nvp_nitems; ii++) {
+ value[ii] = nv_strdup((const char *)ptr);
+ if (value[ii] == NULL)
+ goto out;
+ len = strlen(value[ii]) + 1;
+ ptr += len;
+ *leftp -= len;
+ }
+ nvp->nvp_data = (uint64_t)(uintptr_t)value;
- return (nvpair_createf_string(value, "%s", name));
+ return (ptr);
+out:
+ for (j = 0; j < ii; j++)
+ nv_free(value[j]);
+ nv_free(value);
+ return (NULL);
}
-nvpair_t *
-nvpair_create_stringf(const char *name, const char *valuefmt, ...)
+#ifndef _KERNEL
+const unsigned char *
+nvpair_unpack_descriptor_array(bool isbe, nvpair_t *nvp,
+ const unsigned char *ptr, size_t *leftp, const int *fds, size_t nfds)
{
- va_list valueap;
- nvpair_t *nvp;
-
- va_start(valueap, valuefmt);
- nvp = nvpair_create_stringv(name, valuefmt, valueap);
- va_end(valueap);
+ int64_t idx;
+ size_t size;
+ unsigned int ii;
+ int *array;
- return (nvp);
-}
+ PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_DESCRIPTOR_ARRAY);
-nvpair_t *
-nvpair_create_stringv(const char *name, const char *valuefmt, va_list valueap)
-{
- nvpair_t *nvp;
- char *str;
- int len;
+ size = sizeof(idx) * nvp->nvp_nitems;
+ if (nvp->nvp_datasize != size || *leftp < size ||
+ nvp->nvp_nitems == 0 || size < nvp->nvp_nitems) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
- len = nv_vasprintf(&str, valuefmt, valueap);
- if (len < 0)
+ array = (int *)nv_malloc(size);
+ if (array == NULL)
return (NULL);
- nvp = nvpair_create_string(name, str);
- if (nvp == NULL)
- nv_free(str);
- return (nvp);
-}
-nvpair_t *
-nvpair_create_nvlist(const char *name, const nvlist_t *value)
-{
+ for (ii = 0; ii < nvp->nvp_nitems; ii++) {
+ if (isbe)
+ idx = be64dec(ptr);
+ else
+ idx = le64dec(ptr);
- return (nvpair_createf_nvlist(value, "%s", name));
-}
+ if (idx < 0) {
+ ERRNO_SET(EINVAL);
+ nv_free(array);
+ return (NULL);
+ }
-#ifndef _KERNEL
-nvpair_t *
-nvpair_create_descriptor(const char *name, int value)
-{
+ if ((size_t)idx >= nfds) {
+ ERRNO_SET(EINVAL);
+ nv_free(array);
+ return (NULL);
+ }
+
+ array[ii] = (uint64_t)fds[idx];
+
+ ptr += sizeof(idx);
+ *leftp -= sizeof(idx);
+ }
+
+ nvp->nvp_data = (uint64_t)(uintptr_t)array;
- return (nvpair_createf_descriptor(value, "%s", name));
+ return (ptr);
}
#endif
-nvpair_t *
-nvpair_create_binary(const char *name, const void *value, size_t size)
+const unsigned char *
+nvpair_unpack_nvlist_array(bool isbe __unused, nvpair_t *nvp,
+ const unsigned char *ptr, size_t *leftp, nvlist_t **firstel)
{
+ nvlist_t **value;
+ nvpair_t *tmpnvp;
+ unsigned int ii, j;
+ size_t sizeup;
- return (nvpair_createf_binary(value, size, "%s", name));
-}
+ PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_NVLIST_ARRAY);
-nvpair_t *
-nvpair_createf_null(const char *namefmt, ...)
-{
- va_list nameap;
- nvpair_t *nvp;
+ sizeup = sizeof(struct nvpair_header) * nvp->nvp_nitems;
+ if (nvp->nvp_nitems == 0 || sizeup < nvp->nvp_nitems ||
+ sizeup > *leftp) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
- va_start(nameap, namefmt);
- nvp = nvpair_createv_null(namefmt, nameap);
- va_end(nameap);
+ value = nv_malloc(nvp->nvp_nitems * sizeof(*value));
+ if (value == NULL)
+ return (NULL);
- return (nvp);
-}
+ for (ii = 0; ii < nvp->nvp_nitems; ii++) {
+ value[ii] = nvlist_create(0);
+ if (value[ii] == NULL)
+ goto fail;
+ if (ii > 0) {
+ tmpnvp = nvpair_allocv(" ", NV_TYPE_NVLIST,
+ (uint64_t)(uintptr_t)value[ii], 0, 0);
+ if (tmpnvp == NULL)
+ goto fail;
+ nvlist_set_array_next(value[ii - 1], tmpnvp);
+ }
+ }
+ nvlist_set_flags(value[nvp->nvp_nitems - 1], NV_FLAG_IN_ARRAY);
-nvpair_t *
-nvpair_createf_bool(bool value, const char *namefmt, ...)
-{
- va_list nameap;
- nvpair_t *nvp;
+ nvp->nvp_data = (uint64_t)(uintptr_t)value;
+ *firstel = value[0];
- va_start(nameap, namefmt);
- nvp = nvpair_createv_bool(value, namefmt, nameap);
- va_end(nameap);
+ return (ptr);
+fail:
+ ERRNO_SAVE();
+ for (j = 0; j < ii; j++)
+ nvlist_destroy(value[j]);
+ nv_free(value);
+ ERRNO_RESTORE();
- return (nvp);
+ return (NULL);
}
-nvpair_t *
-nvpair_createf_number(uint64_t value, const char *namefmt, ...)
+const unsigned char *
+nvpair_unpack(bool isbe, const unsigned char *ptr, size_t *leftp,
+ nvpair_t **nvpp)
{
- va_list nameap;
- nvpair_t *nvp;
+ nvpair_t *nvp, *tmp;
- va_start(nameap, namefmt);
- nvp = nvpair_createv_number(value, namefmt, nameap);
- va_end(nameap);
+ nvp = nv_calloc(1, sizeof(*nvp) + NV_NAME_MAX);
+ if (nvp == NULL)
+ return (NULL);
+ nvp->nvp_name = (char *)(nvp + 1);
- return (nvp);
+ ptr = nvpair_unpack_header(isbe, nvp, ptr, leftp);
+ if (ptr == NULL)
+ goto failed;
+ tmp = nv_realloc(nvp, sizeof(*nvp) + strlen(nvp->nvp_name) + 1);
+ if (tmp == NULL)
+ goto failed;
+ nvp = tmp;
+
+ /* Update nvp_name after realloc(). */
+ nvp->nvp_name = (char *)(nvp + 1);
+ nvp->nvp_data = 0x00;
+ nvp->nvp_magic = NVPAIR_MAGIC;
+ *nvpp = nvp;
+ return (ptr);
+failed:
+ nv_free(nvp);
+ return (NULL);
}
-nvpair_t *
-nvpair_createf_string(const char *value, const char *namefmt, ...)
+int
+nvpair_type(const nvpair_t *nvp)
{
- va_list nameap;
- nvpair_t *nvp;
- va_start(nameap, namefmt);
- nvp = nvpair_createv_string(value, namefmt, nameap);
- va_end(nameap);
+ NVPAIR_ASSERT(nvp);
- return (nvp);
+ return (nvp->nvp_type);
}
-nvpair_t *
-nvpair_createf_nvlist(const nvlist_t *value, const char *namefmt, ...)
+const char *
+nvpair_name(const nvpair_t *nvp)
{
- va_list nameap;
- nvpair_t *nvp;
- va_start(nameap, namefmt);
- nvp = nvpair_createv_nvlist(value, namefmt, nameap);
- va_end(nameap);
+ NVPAIR_ASSERT(nvp);
- return (nvp);
+ return (nvp->nvp_name);
}
-#ifndef _KERNEL
nvpair_t *
-nvpair_createf_descriptor(int value, const char *namefmt, ...)
+nvpair_create_stringf(const char *name, const char *valuefmt, ...)
{
- va_list nameap;
+ va_list valueap;
nvpair_t *nvp;
- va_start(nameap, namefmt);
- nvp = nvpair_createv_descriptor(value, namefmt, nameap);
- va_end(nameap);
+ va_start(valueap, valuefmt);
+ nvp = nvpair_create_stringv(name, valuefmt, valueap);
+ va_end(valueap);
return (nvp);
}
-#endif
nvpair_t *
-nvpair_createf_binary(const void *value, size_t size, const char *namefmt, ...)
+nvpair_create_stringv(const char *name, const char *valuefmt, va_list valueap)
{
- va_list nameap;
nvpair_t *nvp;
+ char *str;
+ int len;
- va_start(nameap, namefmt);
- nvp = nvpair_createv_binary(value, size, namefmt, nameap);
- va_end(nameap);
-
+ len = nv_vasprintf(&str, valuefmt, valueap);
+ if (len < 0)
+ return (NULL);
+ nvp = nvpair_create_string(name, str);
+ if (nvp == NULL)
+ nv_free(str);
return (nvp);
}
nvpair_t *
-nvpair_createv_null(const char *namefmt, va_list nameap)
+nvpair_create_null(const char *name)
{
- return (nvpair_allocv(NV_TYPE_NULL, 0, 0, namefmt, nameap));
+ return (nvpair_allocv(name, NV_TYPE_NULL, 0, 0, 0));
}
nvpair_t *
-nvpair_createv_bool(bool value, const char *namefmt, va_list nameap)
+nvpair_create_bool(const char *name, bool value)
{
- return (nvpair_allocv(NV_TYPE_BOOL, value ? 1 : 0, sizeof(uint8_t),
- namefmt, nameap));
+ return (nvpair_allocv(name, NV_TYPE_BOOL, value ? 1 : 0,
+ sizeof(uint8_t), 0));
}
nvpair_t *
-nvpair_createv_number(uint64_t value, const char *namefmt, va_list nameap)
+nvpair_create_number(const char *name, uint64_t value)
{
- return (nvpair_allocv(NV_TYPE_NUMBER, value, sizeof(value), namefmt,
- nameap));
+ return (nvpair_allocv(name, NV_TYPE_NUMBER, value, sizeof(value), 0));
}
nvpair_t *
-nvpair_createv_string(const char *value, const char *namefmt, va_list nameap)
+nvpair_create_string(const char *name, const char *value)
{
nvpair_t *nvp;
size_t size;
char *data;
if (value == NULL) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -963,8 +1211,8 @@ nvpair_createv_string(const char *value, const char *namefmt, va_list nameap)
return (NULL);
size = strlen(value) + 1;
- nvp = nvpair_allocv(NV_TYPE_STRING, (uint64_t)(uintptr_t)data, size,
- namefmt, nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_STRING, (uint64_t)(uintptr_t)data,
+ size, 0);
if (nvp == NULL)
nv_free(data);
@@ -972,14 +1220,13 @@ nvpair_createv_string(const char *value, const char *namefmt, va_list nameap)
}
nvpair_t *
-nvpair_createv_nvlist(const nvlist_t *value, const char *namefmt,
- va_list nameap)
+nvpair_create_nvlist(const char *name, const nvlist_t *value)
{
nvlist_t *nvl;
nvpair_t *nvp;
if (value == NULL) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -987,8 +1234,8 @@ nvpair_createv_nvlist(const nvlist_t *value, const char *namefmt,
if (nvl == NULL)
return (NULL);
- nvp = nvpair_allocv(NV_TYPE_NVLIST, (uint64_t)(uintptr_t)nvl, 0,
- namefmt, nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_NVLIST, (uint64_t)(uintptr_t)nvl, 0,
+ 0);
if (nvp == NULL)
nvlist_destroy(nvl);
else
@@ -999,12 +1246,12 @@ nvpair_createv_nvlist(const nvlist_t *value, const char *namefmt,
#ifndef _KERNEL
nvpair_t *
-nvpair_createv_descriptor(int value, const char *namefmt, va_list nameap)
+nvpair_create_descriptor(const char *name, int value)
{
nvpair_t *nvp;
if (value < 0 || !fd_is_valid(value)) {
- errno = EBADF;
+ ERRNO_SET(EBADF);
return (NULL);
}
@@ -1012,24 +1259,26 @@ nvpair_createv_descriptor(int value, const char *namefmt, va_list nameap)
if (value < 0)
return (NULL);
- nvp = nvpair_allocv(NV_TYPE_DESCRIPTOR, (uint64_t)value,
- sizeof(int64_t), namefmt, nameap);
- if (nvp == NULL)
+ nvp = nvpair_allocv(name, NV_TYPE_DESCRIPTOR, (uint64_t)value,
+ sizeof(int64_t), 0);
+ if (nvp == NULL) {
+ ERRNO_SAVE();
close(value);
+ ERRNO_RESTORE();
+ }
return (nvp);
}
#endif
nvpair_t *
-nvpair_createv_binary(const void *value, size_t size, const char *namefmt,
- va_list nameap)
+nvpair_create_binary(const char *name, const void *value, size_t size)
{
nvpair_t *nvp;
void *data;
if (value == NULL || size == 0) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -1038,8 +1287,8 @@ nvpair_createv_binary(const void *value, size_t size, const char *namefmt,
return (NULL);
memcpy(data, value, size);
- nvp = nvpair_allocv(NV_TYPE_BINARY, (uint64_t)(uintptr_t)data, size,
- namefmt, nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_BINARY, (uint64_t)(uintptr_t)data,
+ size, 0);
if (nvp == NULL)
nv_free(data);
@@ -1047,129 +1296,264 @@ nvpair_createv_binary(const void *value, size_t size, const char *namefmt,
}
nvpair_t *
-nvpair_move_string(const char *name, char *value)
+nvpair_create_bool_array(const char *name, const bool *value, size_t nitems)
{
+ nvpair_t *nvp;
+ size_t size;
+ void *data;
- return (nvpair_movef_string(value, "%s", name));
-}
+ if (value == NULL || nitems == 0) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
-nvpair_t *
-nvpair_move_nvlist(const char *name, nvlist_t *value)
-{
+ size = sizeof(value[0]) * nitems;
+ data = nv_malloc(size);
+ if (data == NULL)
+ return (NULL);
+
+ memcpy(data, value, size);
+ nvp = nvpair_allocv(name, NV_TYPE_BOOL_ARRAY, (uint64_t)(uintptr_t)data,
+ size, nitems);
+ if (nvp == NULL) {
+ ERRNO_SAVE();
+ nv_free(data);
+ ERRNO_RESTORE();
+ }
- return (nvpair_movef_nvlist(value, "%s", name));
+ return (nvp);
}
-#ifndef _KERNEL
nvpair_t *
-nvpair_move_descriptor(const char *name, int value)
+nvpair_create_number_array(const char *name, const uint64_t *value,
+ size_t nitems)
{
+ nvpair_t *nvp;
+ size_t size;
+ void *data;
- return (nvpair_movef_descriptor(value, "%s", name));
-}
-#endif
+ if (value == NULL || nitems == 0) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
-nvpair_t *
-nvpair_move_binary(const char *name, void *value, size_t size)
-{
+ size = sizeof(value[0]) * nitems;
+ data = nv_malloc(size);
+ if (data == NULL)
+ return (NULL);
- return (nvpair_movef_binary(value, size, "%s", name));
+ memcpy(data, value, size);
+ nvp = nvpair_allocv(name, NV_TYPE_NUMBER_ARRAY,
+ (uint64_t)(uintptr_t)data, size, nitems);
+ if (nvp == NULL) {
+ ERRNO_SAVE();
+ nv_free(data);
+ ERRNO_RESTORE();
+ }
+
+ return (nvp);
}
nvpair_t *
-nvpair_movef_string(char *value, const char *namefmt, ...)
+nvpair_create_string_array(const char *name, const char * const *value,
+ size_t nitems)
{
- va_list nameap;
nvpair_t *nvp;
+ unsigned int ii;
+ size_t datasize, size;
+ char **data;
+
+ if (value == NULL || nitems == 0) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
+
+ nvp = NULL;
+ datasize = 0;
+ data = nv_malloc(sizeof(value[0]) * nitems);
+ if (data == NULL)
+ return (NULL);
+
+ for (ii = 0; ii < nitems; ii++) {
+ if (value[ii] == NULL) {
+ ERRNO_SET(EINVAL);
+ goto fail;
+ }
+
+ size = strlen(value[ii]) + 1;
+ datasize += size;
+ data[ii] = nv_strdup(value[ii]);
+ if (data[ii] == NULL)
+ goto fail;
+ }
+ nvp = nvpair_allocv(name, NV_TYPE_STRING_ARRAY,
+ (uint64_t)(uintptr_t)data, datasize, nitems);
- va_start(nameap, namefmt);
- nvp = nvpair_movev_string(value, namefmt, nameap);
- va_end(nameap);
+fail:
+ if (nvp == NULL) {
+ ERRNO_SAVE();
+ for (; ii > 0; ii--)
+ nv_free(data[ii - 1]);
+ nv_free(data);
+ ERRNO_RESTORE();
+ }
return (nvp);
}
nvpair_t *
-nvpair_movef_nvlist(nvlist_t *value, const char *namefmt, ...)
+nvpair_create_nvlist_array(const char *name, const nvlist_t * const *value,
+ size_t nitems)
{
- va_list nameap;
+ unsigned int ii;
+ nvlist_t **nvls;
nvpair_t *nvp;
+ int flags;
+
+ nvp = NULL;
+ nvls = NULL;
+ ii = 0;
+
+ if (value == NULL || nitems == 0) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
+
+ nvls = nv_malloc(sizeof(value[0]) * nitems);
+ if (nvls == NULL)
+ return (NULL);
- va_start(nameap, namefmt);
- nvp = nvpair_movev_nvlist(value, namefmt, nameap);
- va_end(nameap);
+ for (ii = 0; ii < nitems; ii++) {
+ if (value[ii] == NULL) {
+ ERRNO_SET(EINVAL);
+ goto fail;
+ }
+
+ nvls[ii] = nvlist_clone(value[ii]);
+ if (nvls[ii] == NULL)
+ goto fail;
+
+ if (ii > 0) {
+ nvp = nvpair_allocv(" ", NV_TYPE_NVLIST,
+ (uint64_t)(uintptr_t)nvls[ii], 0, 0);
+ if (nvp == NULL)
+ goto fail;
+ nvlist_set_array_next(nvls[ii - 1], nvp);
+ }
+ }
+ flags = nvlist_flags(nvls[nitems - 1]) | NV_FLAG_IN_ARRAY;
+ nvlist_set_flags(nvls[nitems - 1], flags);
+
+ nvp = nvpair_allocv(name, NV_TYPE_NVLIST_ARRAY,
+ (uint64_t)(uintptr_t)nvls, 0, nitems);
+
+fail:
+ if (nvp == NULL) {
+ ERRNO_SAVE();
+ for (; ii > 0; ii--)
+ nvlist_destroy(nvls[ii - 1]);
+
+ nv_free(nvls);
+ ERRNO_RESTORE();
+ } else {
+ for (ii = 0; ii < nitems; ii++)
+ nvlist_set_parent(nvls[ii], nvp);
+ }
return (nvp);
}
#ifndef _KERNEL
nvpair_t *
-nvpair_movef_descriptor(int value, const char *namefmt, ...)
+nvpair_create_descriptor_array(const char *name, const int *value,
+ size_t nitems)
{
- va_list nameap;
+ unsigned int ii;
nvpair_t *nvp;
+ int *fds;
- va_start(nameap, namefmt);
- nvp = nvpair_movev_descriptor(value, namefmt, nameap);
- va_end(nameap);
+ if (value == NULL) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
- return (nvp);
-}
-#endif
+ nvp = NULL;
-nvpair_t *
-nvpair_movef_binary(void *value, size_t size, const char *namefmt, ...)
-{
- va_list nameap;
- nvpair_t *nvp;
+ fds = nv_malloc(sizeof(value[0]) * nitems);
+ if (fds == NULL)
+ return (NULL);
+ for (ii = 0; ii < nitems; ii++) {
+ if (value[ii] == -1) {
+ fds[ii] = -1;
+ } else {
+ if (!fd_is_valid(value[ii])) {
+ ERRNO_SET(EBADF);
+ goto fail;
+ }
+
+ fds[ii] = fcntl(value[ii], F_DUPFD_CLOEXEC, 0);
+ if (fds[ii] == -1)
+ goto fail;
+ }
+ }
- va_start(nameap, namefmt);
- nvp = nvpair_movev_binary(value, size, namefmt, nameap);
- va_end(nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_DESCRIPTOR_ARRAY,
+ (uint64_t)(uintptr_t)fds, sizeof(int64_t) * nitems, nitems);
+
+fail:
+ if (nvp == NULL) {
+ ERRNO_SAVE();
+ for (; ii > 0; ii--) {
+ if (fds[ii - 1] != -1)
+ close(fds[ii - 1]);
+ }
+ nv_free(fds);
+ ERRNO_RESTORE();
+ }
return (nvp);
}
+#endif
nvpair_t *
-nvpair_movev_string(char *value, const char *namefmt, va_list nameap)
+nvpair_move_string(const char *name, char *value)
{
nvpair_t *nvp;
- int serrno;
if (value == NULL) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
- nvp = nvpair_allocv(NV_TYPE_STRING, (uint64_t)(uintptr_t)value,
- strlen(value) + 1, namefmt, nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_STRING, (uint64_t)(uintptr_t)value,
+ strlen(value) + 1, 0);
if (nvp == NULL) {
- SAVE_ERRNO(serrno);
+ ERRNO_SAVE();
nv_free(value);
- RESTORE_ERRNO(serrno);
+ ERRNO_RESTORE();
}
return (nvp);
}
nvpair_t *
-nvpair_movev_nvlist(nvlist_t *value, const char *namefmt, va_list nameap)
+nvpair_move_nvlist(const char *name, nvlist_t *value)
{
nvpair_t *nvp;
if (value == NULL || nvlist_get_nvpair_parent(value) != NULL) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
if (nvlist_error(value) != 0) {
- RESTORE_ERRNO(nvlist_error(value));
+ ERRNO_SET(nvlist_error(value));
nvlist_destroy(value);
return (NULL);
}
- nvp = nvpair_allocv(NV_TYPE_NVLIST, (uint64_t)(uintptr_t)value, 0,
- namefmt, nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_NVLIST, (uint64_t)(uintptr_t)value,
+ 0, 0);
if (nvp == NULL)
nvlist_destroy(value);
else
@@ -1180,22 +1564,21 @@ nvpair_movev_nvlist(nvlist_t *value, const char *namefmt, va_list nameap)
#ifndef _KERNEL
nvpair_t *
-nvpair_movev_descriptor(int value, const char *namefmt, va_list nameap)
+nvpair_move_descriptor(const char *name, int value)
{
nvpair_t *nvp;
- int serrno;
if (value < 0 || !fd_is_valid(value)) {
- errno = EBADF;
+ ERRNO_SET(EBADF);
return (NULL);
}
- nvp = nvpair_allocv(NV_TYPE_DESCRIPTOR, (uint64_t)value,
- sizeof(int64_t), namefmt, nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_DESCRIPTOR, (uint64_t)value,
+ sizeof(int64_t), 0);
if (nvp == NULL) {
- serrno = errno;
+ ERRNO_SAVE();
close(value);
- errno = serrno;
+ ERRNO_RESTORE();
}
return (nvp);
@@ -1203,28 +1586,191 @@ nvpair_movev_descriptor(int value, const char *namefmt, va_list nameap)
#endif
nvpair_t *
-nvpair_movev_binary(void *value, size_t size, const char *namefmt,
- va_list nameap)
+nvpair_move_binary(const char *name, void *value, size_t size)
{
nvpair_t *nvp;
- int serrno;
if (value == NULL || size == 0) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
+
+ nvp = nvpair_allocv(name, NV_TYPE_BINARY, (uint64_t)(uintptr_t)value,
+ size, 0);
+ if (nvp == NULL) {
+ ERRNO_SAVE();
+ nv_free(value);
+ ERRNO_RESTORE();
+ }
+
+ return (nvp);
+}
+
+nvpair_t *
+nvpair_move_bool_array(const char *name, bool *value, size_t nitems)
+{
+ nvpair_t *nvp;
+
+ if (value == NULL || nitems == 0) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
+
+ nvp = nvpair_allocv(name, NV_TYPE_BOOL_ARRAY,
+ (uint64_t)(uintptr_t)value, sizeof(value[0]) * nitems, nitems);
+ if (nvp == NULL) {
+ ERRNO_SAVE();
+ nv_free(value);
+ ERRNO_RESTORE();
+ }
+
+ return (nvp);
+}
+
+nvpair_t *
+nvpair_move_string_array(const char *name, char **value, size_t nitems)
+{
+ nvpair_t *nvp;
+ size_t i, size;
+
+ if (value == NULL || nitems == 0) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
+
+ size = 0;
+ for (i = 0; i < nitems; i++) {
+ if (value[i] == NULL) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
+
+ size += strlen(value[i]) + 1;
+ }
+
+ nvp = nvpair_allocv(name, NV_TYPE_STRING_ARRAY,
+ (uint64_t)(uintptr_t)value, size, nitems);
+ if (nvp == NULL) {
+ ERRNO_SAVE();
+ for (i = 0; i < nitems; i++)
+ nv_free(value[i]);
+ nv_free(value);
+ ERRNO_RESTORE();
+ }
+
+ return (nvp);
+}
+
+nvpair_t *
+nvpair_move_number_array(const char *name, uint64_t *value, size_t nitems)
+{
+ nvpair_t *nvp;
+
+ if (value == NULL || nitems == 0) {
+ ERRNO_SET(EINVAL);
return (NULL);
}
- nvp = nvpair_allocv(NV_TYPE_BINARY, (uint64_t)(uintptr_t)value, size,
- namefmt, nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_NUMBER_ARRAY,
+ (uint64_t)(uintptr_t)value, sizeof(value[0]) * nitems, nitems);
if (nvp == NULL) {
- SAVE_ERRNO(serrno);
+ ERRNO_SAVE();
nv_free(value);
- RESTORE_ERRNO(serrno);
+ ERRNO_RESTORE();
}
return (nvp);
}
+nvpair_t *
+nvpair_move_nvlist_array(const char *name, nvlist_t **value, size_t nitems)
+{
+ unsigned int ii;
+ nvpair_t *nvp;
+ int flags;
+
+ nvp = NULL;
+ if (value == NULL || nitems == 0) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
+
+ for (ii = 0; ii < nitems; ii++) {
+ if (value == NULL || nvlist_error(value[ii]) != 0 ||
+ nvlist_get_pararr(value[ii], NULL) != NULL) {
+ ERRNO_SET(EINVAL);
+ goto fail;
+ }
+ if (ii > 0) {
+ nvp = nvpair_allocv(" ", NV_TYPE_NVLIST,
+ (uint64_t)(uintptr_t)value[ii], 0, 0);
+ if (nvp == NULL)
+ goto fail;
+ nvlist_set_array_next(value[ii - 1], nvp);
+ }
+ }
+ flags = nvlist_flags(value[nitems - 1]) | NV_FLAG_IN_ARRAY;
+ nvlist_set_flags(value[nitems - 1], flags);
+
+ nvp = nvpair_allocv(name, NV_TYPE_NVLIST_ARRAY,
+ (uint64_t)(uintptr_t)value, 0, nitems);
+fail:
+ if (nvp == NULL) {
+ ERRNO_SAVE();
+ for (ii = 0; ii < nitems; ii++) {
+ if (value[ii] != NULL &&
+ nvlist_get_pararr(value[ii], NULL) != NULL) {
+ nvlist_destroy(value[ii]);
+ }
+ nv_free(value);
+ }
+ ERRNO_RESTORE();
+ } else {
+ for (ii = 0; ii < nitems; ii++)
+ nvlist_set_parent(value[ii], nvp);
+ }
+
+ return (nvp);
+}
+
+#ifndef _KERNEL
+nvpair_t *
+nvpair_move_descriptor_array(const char *name, int *value, size_t nitems)
+{
+ nvpair_t *nvp;
+ size_t i;
+
+ nvp = NULL;
+ if (value == NULL || nitems == 0) {
+ ERRNO_SET(EINVAL);
+ return (NULL);
+ }
+
+ for (i = 0; i < nitems; i++) {
+ if (value[i] != -1 && !fd_is_valid(value[i])) {
+ ERRNO_SET(EBADF);
+ goto fail;
+ }
+ }
+
+ nvp = nvpair_allocv(name, NV_TYPE_DESCRIPTOR_ARRAY,
+ (uint64_t)(uintptr_t)value, sizeof(value[0]) * nitems, nitems);
+
+fail:
+ if (nvp == NULL) {
+ ERRNO_SAVE();
+ for (i = 0; i < nitems; i++) {
+ if (fd_is_valid(value[i]))
+ close(value[i]);
+ }
+ nv_free(value);
+ ERRNO_RESTORE();
+ }
+
+ return (nvp);
+}
+#endif
+
bool
nvpair_get_bool(const nvpair_t *nvp)
{
@@ -1284,12 +1830,81 @@ nvpair_get_binary(const nvpair_t *nvp, size_t *sizep)
if (sizep != NULL)
*sizep = nvp->nvp_datasize;
+
return ((const void *)(intptr_t)nvp->nvp_data);
}
+const bool *
+nvpair_get_bool_array(const nvpair_t *nvp, size_t *nitems)
+{
+
+ NVPAIR_ASSERT(nvp);
+ PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_BOOL_ARRAY);
+
+ if (nitems != NULL)
+ *nitems = nvp->nvp_nitems;
+
+ return ((const bool *)(intptr_t)nvp->nvp_data);
+}
+
+const uint64_t *
+nvpair_get_number_array(const nvpair_t *nvp, size_t *nitems)
+{
+
+ NVPAIR_ASSERT(nvp);
+ PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_NUMBER_ARRAY);
+
+ if (nitems != NULL)
+ *nitems = nvp->nvp_nitems;
+
+ return ((const uint64_t *)(intptr_t)nvp->nvp_data);
+}
+
+const char * const *
+nvpair_get_string_array(const nvpair_t *nvp, size_t *nitems)
+{
+
+ NVPAIR_ASSERT(nvp);
+ PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_STRING_ARRAY);
+
+ if (nitems != NULL)
+ *nitems = nvp->nvp_nitems;
+
+ return ((const char * const *)(intptr_t)nvp->nvp_data);
+}
+
+const nvlist_t * const *
+nvpair_get_nvlist_array(const nvpair_t *nvp, size_t *nitems)
+{
+
+ NVPAIR_ASSERT(nvp);
+ PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_NVLIST_ARRAY);
+
+ if (nitems != NULL)
+ *nitems = nvp->nvp_nitems;
+
+ return ((const nvlist_t * const *)((intptr_t)nvp->nvp_data));
+}
+
+#ifndef _KERNEL
+const int *
+nvpair_get_descriptor_array(const nvpair_t *nvp, size_t *nitems)
+{
+
+ NVPAIR_ASSERT(nvp);
+ PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_DESCRIPTOR_ARRAY);
+
+ if (nitems != NULL)
+ *nitems = nvp->nvp_nitems;
+
+ return ((const int *)(intptr_t)nvp->nvp_data);
+}
+#endif
+
void
nvpair_free(nvpair_t *nvp)
{
+ size_t i;
NVPAIR_ASSERT(nvp);
PJDLOG_ASSERT(nvp->nvp_list == NULL);
@@ -1300,6 +1915,10 @@ nvpair_free(nvpair_t *nvp)
case NV_TYPE_DESCRIPTOR:
close((int)nvp->nvp_data);
break;
+ case NV_TYPE_DESCRIPTOR_ARRAY:
+ for (i = 0; i < nvp->nvp_nitems; i++)
+ close(((int *)(intptr_t)nvp->nvp_data)[i]);
+ break;
#endif
case NV_TYPE_NVLIST:
nvlist_destroy((nvlist_t *)(intptr_t)nvp->nvp_data);
@@ -1310,6 +1929,23 @@ nvpair_free(nvpair_t *nvp)
case NV_TYPE_BINARY:
nv_free((void *)(intptr_t)nvp->nvp_data);
break;
+ case NV_TYPE_NVLIST_ARRAY:
+ for (i = 0; i < nvp->nvp_nitems; i++) {
+ nvlist_destroy(
+ ((nvlist_t **)(intptr_t)nvp->nvp_data)[i]);
+ }
+ nv_free(((nvlist_t **)(intptr_t)nvp->nvp_data));
+ break;
+ case NV_TYPE_NUMBER_ARRAY:
+ nv_free((uint64_t *)(intptr_t)nvp->nvp_data);
+ break;
+ case NV_TYPE_BOOL_ARRAY:
+ nv_free((bool *)(intptr_t)nvp->nvp_data);
+ break;
+ case NV_TYPE_STRING_ARRAY:
+ for (i = 0; i < nvp->nvp_nitems; i++)
+ nv_free(((char **)(intptr_t)nvp->nvp_data)[i]);
+ break;
}
nv_free(nvp);
}
@@ -1344,7 +1980,18 @@ nvpair_type_string(int type)
return ("DESCRIPTOR");
case NV_TYPE_BINARY:
return ("BINARY");
+ case NV_TYPE_BOOL_ARRAY:
+ return ("BOOL ARRAY");
+ case NV_TYPE_NUMBER_ARRAY:
+ return ("NUMBER ARRAY");
+ case NV_TYPE_STRING_ARRAY:
+ return ("STRING ARRAY");
+ case NV_TYPE_NVLIST_ARRAY:
+ return ("NVLIST ARRAY");
+ case NV_TYPE_DESCRIPTOR_ARRAY:
+ return ("DESCRIPTOR ARRAY");
default:
return ("<UNKNOWN>");
}
}
+
diff --git a/external/libnv/sys/nvpair_impl.h b/external/libnv/sys/nvpair_impl.h
index fbcd28ed..0350b1c1 100644
--- a/external/libnv/sys/nvpair_impl.h
+++ b/external/libnv/sys/nvpair_impl.h
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2009-2013 The FreeBSD Foundation
+ * Copyright (c) 2013-2015 Mariusz Zaborski <oshogbo@FreeBSD.org>
* All rights reserved.
*
* This software was developed by Pawel Jakub Dawidek under sponsorship from
@@ -26,20 +27,19 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: head/sys/sys/nvpair_impl.h 279439 2015-03-01 00:34:27Z rstone $
+ * $FreeBSD$
*/
#ifndef _NVPAIR_IMPL_H_
#define _NVPAIR_IMPL_H_
+#include <sys/nv.h>
#include <sys/queue.h>
#ifndef _KERNEL
#include <stdint.h>
#endif
-#include "nv.h"
-
TAILQ_HEAD(nvl_head, nvpair);
void nvpair_assert(const nvpair_t *nvp);
@@ -72,6 +72,15 @@ unsigned char *nvpair_pack_descriptor(const nvpair_t *nvp, unsigned char *ptr,
unsigned char *nvpair_pack_binary(const nvpair_t *nvp, unsigned char *ptr,
size_t *leftp);
unsigned char *nvpair_pack_nvlist_up(unsigned char *ptr, size_t *leftp);
+unsigned char *nvpair_pack_bool_array(const nvpair_t *nvp, unsigned char *ptr,
+ size_t *leftp);
+unsigned char *nvpair_pack_number_array(const nvpair_t *nvp, unsigned char *ptr,
+ size_t *leftp);
+unsigned char *nvpair_pack_string_array(const nvpair_t *nvp, unsigned char *ptr,
+ size_t *leftp);
+unsigned char *nvpair_pack_descriptor_array(const nvpair_t *nvp,
+ unsigned char *ptr, int64_t *fdidxp, size_t *leftp);
+unsigned char *nvpair_pack_nvlist_array_next(unsigned char *ptr, size_t *leftp);
/* Unpack data functions. */
const unsigned char *nvpair_unpack_header(bool isbe, nvpair_t *nvp,
@@ -85,10 +94,20 @@ const unsigned char *nvpair_unpack_number(bool isbe, nvpair_t *nvp,
const unsigned char *nvpair_unpack_string(bool isbe, nvpair_t *nvp,
const unsigned char *ptr, size_t *leftp);
const unsigned char *nvpair_unpack_nvlist(bool isbe, nvpair_t *nvp,
- const unsigned char *ptr, size_t *leftp, size_t nvlist, nvlist_t **child);
+ const unsigned char *ptr, size_t *leftp, size_t nfds, nvlist_t **child);
const unsigned char *nvpair_unpack_descriptor(bool isbe, nvpair_t *nvp,
const unsigned char *ptr, size_t *leftp, const int *fds, size_t nfds);
const unsigned char *nvpair_unpack_binary(bool isbe, nvpair_t *nvp,
const unsigned char *ptr, size_t *leftp);
+const unsigned char *nvpair_unpack_bool_array(bool isbe, nvpair_t *nvp,
+ const unsigned char *ptr, size_t *leftp);
+const unsigned char *nvpair_unpack_number_array(bool isbe, nvpair_t *nvp,
+ const unsigned char *ptr, size_t *leftp);
+const unsigned char *nvpair_unpack_string_array(bool isbe, nvpair_t *nvp,
+ const unsigned char *ptr, size_t *leftp);
+const unsigned char *nvpair_unpack_descriptor_array(bool isbe, nvpair_t *nvp,
+ const unsigned char *ptr, size_t *leftp, const int *fds, size_t nfds);
+const unsigned char *nvpair_unpack_nvlist_array(bool isbe, nvpair_t *nvp,
+ const unsigned char *ptr, size_t *leftp, nvlist_t **firstel);
#endif /* !_NVPAIR_IMPL_H_ */
diff --git a/external/libnv/tests/dnv_tests.cc b/external/libnv/tests/dnv_tests.cc
deleted file mode 100644
index 8f46f9c1..00000000
--- a/external/libnv/tests/dnv_tests.cc
+++ /dev/null
@@ -1,577 +0,0 @@
-/*-
- * Copyright (c) 2014-2015 Sandvine Inc. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/lib/libnv/tests/dnv_tests.cc 279760 2015-03-08 00:30:52Z dim $");
-
-#include <atf-c++.hpp>
-#include <dnv.h>
-#include <nv.h>
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_get_bool__present);
-ATF_TEST_CASE_BODY(dnvlist_get_bool__present)
-{
- nvlist_t *nvl;
- const char *key;
- bool value;
-
- nvl = nvlist_create(0);
-
- key = "name";
- value = true;
- nvlist_add_bool(nvl, key, value);
-
- ATF_REQUIRE_EQ(dnvlist_get_bool(nvl, key, false), value);
- ATF_REQUIRE_EQ(dnvlist_getf_bool(nvl, false, "%c%s", 'n', "ame"), value);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_get_bool__default_value);
-ATF_TEST_CASE_BODY(dnvlist_get_bool__default_value)
-{
- nvlist_t *nvl;
- const char *key;
-
- key = "123";
- nvl = nvlist_create(0);
-
- ATF_REQUIRE_EQ(dnvlist_get_bool(nvl, key, false), false);
- ATF_REQUIRE_EQ(dnvlist_getf_bool(nvl, true, "%d", 123), true);
-
- nvlist_add_bool(nvl, key, true);
-
- ATF_REQUIRE_EQ(dnvlist_get_bool(nvl, "otherkey", true), true);
- ATF_REQUIRE_EQ(dnvlist_getf_bool(nvl, false, "%d%c", 12, 'c'), false);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_get_number__present);
-ATF_TEST_CASE_BODY(dnvlist_get_number__present)
-{
- nvlist_t *nvl;
- const char *key;
- uint64_t value;
-
- nvl = nvlist_create(0);
-
- key = "key";
- value = 48952;
- nvlist_add_number(nvl, key, value);
-
- ATF_REQUIRE_EQ(dnvlist_get_number(nvl, key, 19), value);
- ATF_REQUIRE_EQ(dnvlist_getf_number(nvl, 65, "key"), value);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_get_number__default_value);
-ATF_TEST_CASE_BODY(dnvlist_get_number__default_value)
-{
- nvlist_t *nvl;
- const char *key;
-
- key = "123";
- nvl = nvlist_create(0);
-
- ATF_REQUIRE_EQ(dnvlist_get_number(nvl, key, 5), 5);
- ATF_REQUIRE_EQ(dnvlist_getf_number(nvl, 12, "%s", key), 12);
-
- nvlist_add_number(nvl, key, 24841);
-
- ATF_REQUIRE_EQ(dnvlist_get_number(nvl, "hthth", 184), 184);
- ATF_REQUIRE_EQ(dnvlist_getf_number(nvl, 5641, "%d", 1234), 5641);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_get_string__present);
-ATF_TEST_CASE_BODY(dnvlist_get_string__present)
-{
- nvlist_t *nvl;
- const char *key;
- const char *value, *actual_value;
-
- nvl = nvlist_create(0);
-
- key = "string";
- value = "fjdojfdi";
- nvlist_add_string(nvl, key, value);
-
- ATF_REQUIRE_EQ(strcmp(dnvlist_get_string(nvl, key, "g"), value), 0);
-
- actual_value = dnvlist_getf_string(nvl, "rs", "%s", key);
- ATF_REQUIRE_EQ(strcmp(actual_value, value), 0);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_get_string__default_value);
-ATF_TEST_CASE_BODY(dnvlist_get_string__default_value)
-{
- nvlist_t *nvl;
- const char *key;
- const char *actual_value;
-
- key = "123";
- nvl = nvlist_create(0);
-
- ATF_REQUIRE_EQ(strcmp(dnvlist_get_string(nvl, key, "bar"), "bar"), 0);
-
- actual_value = dnvlist_getf_string(nvl, "d", "%s", key);
- ATF_REQUIRE_EQ(strcmp(actual_value, "d"), 0);
-
- nvlist_add_string(nvl, key, "cxhweh");
-
- ATF_REQUIRE_EQ(strcmp(dnvlist_get_string(nvl, "hthth", "fd"), "fd"), 0);
- actual_value = dnvlist_getf_string(nvl, "5", "%s", "5");
- ATF_REQUIRE_EQ(strcmp("5", "5"), 0);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_get_nvlist__present);
-ATF_TEST_CASE_BODY(dnvlist_get_nvlist__present)
-{
- nvlist_t *nvl;
- const char *key;
- nvlist_t *value;
- const nvlist_t *actual_value;
-
- nvl = nvlist_create(0);
-
- key = "nvlist";
- value = nvlist_create(0);
- nvlist_move_nvlist(nvl, key, value);
-
- actual_value = dnvlist_get_nvlist(nvl, key, NULL);
- ATF_REQUIRE(actual_value != NULL);
- ATF_REQUIRE(nvlist_empty(actual_value));
-
- actual_value = dnvlist_getf_nvlist(nvl, NULL, "%s", key);
- ATF_REQUIRE(actual_value != NULL);
- ATF_REQUIRE(nvlist_empty(actual_value));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_get_nvlist__default_value);
-ATF_TEST_CASE_BODY(dnvlist_get_nvlist__default_value)
-{
- nvlist_t *nvl;
- const char *key;
- nvlist_t *dummy;
-
- key = "123";
- nvl = nvlist_create(0);
- dummy = nvlist_create(0);
-
- ATF_REQUIRE_EQ(dnvlist_get_nvlist(nvl, key, dummy), dummy);
- ATF_REQUIRE_EQ(dnvlist_getf_nvlist(nvl, dummy, "%s", key), dummy);
-
- nvlist_move_nvlist(nvl, key, nvlist_create(0));
- ATF_REQUIRE_EQ(dnvlist_get_nvlist(nvl, "456", dummy), dummy);
- ATF_REQUIRE_EQ(dnvlist_getf_nvlist(nvl, dummy, "%s", "gh"), dummy);
-
- nvlist_destroy(nvl);
-}
-
-static void
-set_const_binary_value(const void *&value, size_t &size, const char *str)
-{
-
- value = str;
- size = strlen(str) + 1; /* +1 to include '\0' */
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_get_binary__present);
-ATF_TEST_CASE_BODY(dnvlist_get_binary__present)
-{
- nvlist_t *nvl;
- const char *k;
- const void *value, *actual_value;
- size_t value_size, actual_size;
-
- nvl = nvlist_create(0);
-
- k = "binary";
- set_const_binary_value(value, value_size, "fjdojfdi");
- nvlist_add_binary(nvl, k, value, value_size);
-
- actual_value = dnvlist_get_binary(nvl, k, &actual_size, "g", 1);
- ATF_REQUIRE_EQ(value_size, actual_size);
- ATF_REQUIRE_EQ(memcmp(actual_value, value, actual_size), 0);
-
- actual_value = dnvlist_getf_binary(nvl, &actual_size, "g", 1, "%s", k);
- ATF_REQUIRE_EQ(value_size, actual_size);
- ATF_REQUIRE_EQ(memcmp(actual_value, value, actual_size), 0);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_get_binary__default_value);
-ATF_TEST_CASE_BODY(dnvlist_get_binary__default_value)
-{
- nvlist_t *nvl;
- const char *key;
- const void *default_value, *actual_value;
- size_t default_size, actual_size;
-
- key = "123";
- nvl = nvlist_create(0);
-
- set_const_binary_value(default_value, default_size, "bar");
- actual_value = dnvlist_get_binary(nvl, key, &actual_size, default_value,
- default_size);
- ATF_REQUIRE_EQ(default_size, actual_size);
- ATF_REQUIRE_EQ(memcmp(actual_value, default_value, actual_size), 0);
-
- set_const_binary_value(default_value, default_size, "atf");
- actual_value = dnvlist_getf_binary(nvl, &actual_size, default_value,
- default_size, "%s", key);
- ATF_REQUIRE_EQ(default_size, actual_size);
- ATF_REQUIRE_EQ(memcmp(actual_value, default_value, actual_size), 0);
-
- nvlist_add_binary(nvl, key, "test", 4);
-
- set_const_binary_value(default_value, default_size, "bthrg");
- actual_value = dnvlist_get_binary(nvl, "k", &actual_size, default_value,
- default_size);
- ATF_REQUIRE_EQ(default_size, actual_size);
- ATF_REQUIRE_EQ(memcmp(actual_value, default_value, actual_size), 0);
-
- set_const_binary_value(default_value, default_size,
- "rrhgrythtyrtgbrhgrtdsvdfbtjlkul");
- actual_value = dnvlist_getf_binary(nvl, &actual_size, default_value,
- default_size, "s");
- ATF_REQUIRE_EQ(default_size, actual_size);
- ATF_REQUIRE_EQ(memcmp(actual_value, default_value, actual_size), 0);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_bool__present);
-ATF_TEST_CASE_BODY(dnvlist_take_bool__present)
-{
- nvlist_t *nvl;
- const char *key;
- bool value;
-
- nvl = nvlist_create(0);
-
- key = "name";
- value = true;
- nvlist_add_bool(nvl, key, value);
-
- ATF_REQUIRE_EQ(dnvlist_take_bool(nvl, key, false), value);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_bool__empty);
-ATF_TEST_CASE_BODY(dnvlist_take_bool__empty)
-{
- nvlist_t *nvl;
-
- nvl = nvlist_create(0);
-
- ATF_REQUIRE_EQ(dnvlist_take_bool(nvl, "123", false), false);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_bool__default_value);
-ATF_TEST_CASE_BODY(dnvlist_take_bool__default_value)
-{
- nvlist_t *nvl;
-
- nvl = nvlist_create(0);
- nvlist_add_bool(nvl, "key", true);
-
- ATF_REQUIRE_EQ(dnvlist_take_bool(nvl, "otherkey", true), true);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_number__present);
-ATF_TEST_CASE_BODY(dnvlist_take_number__present)
-{
- nvlist_t *nvl;
- const char *key;
- uint64_t value;
-
- nvl = nvlist_create(0);
-
- key = "name";
- value = 194154;
- nvlist_add_number(nvl, key, value);
-
- ATF_REQUIRE_EQ(dnvlist_take_number(nvl, key, 2), value);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_number__empty);
-ATF_TEST_CASE_BODY(dnvlist_take_number__empty)
-{
- nvlist_t *nvl;
-
- nvl = nvlist_create(0);
-
- ATF_REQUIRE_EQ(dnvlist_take_number(nvl, "123", 126484), 126484);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_number__default_value);
-ATF_TEST_CASE_BODY(dnvlist_take_number__default_value)
-{
- nvlist_t *nvl;
-
- nvl = nvlist_create(0);
- nvlist_add_number(nvl, "key", 12);
-
- ATF_REQUIRE_EQ(dnvlist_take_number(nvl, "otherkey", 13), 13);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_string__present);
-ATF_TEST_CASE_BODY(dnvlist_take_string__present)
-{
- nvlist_t *nvl;
- const char *key;
- const char *value;
- char *default_val, *actual_val;
-
- nvl = nvlist_create(0);
-
- key = "name";
- value = "wrowm";
- default_val = strdup("default");
- nvlist_add_string(nvl, key, value);
-
- actual_val = dnvlist_take_string(nvl, key, default_val);
- ATF_REQUIRE_EQ(strcmp(actual_val, value), 0);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- free(actual_val);
- free(default_val);
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_string__empty);
-ATF_TEST_CASE_BODY(dnvlist_take_string__empty)
-{
- nvlist_t *nvl;
- char *default_val, *actual_val;
-
- nvl = nvlist_create(0);
- default_val = strdup("");
-
- actual_val = dnvlist_take_string(nvl, "123", default_val);
- ATF_REQUIRE_EQ(strcmp(actual_val, default_val), 0);
-
- free(actual_val);
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_string__default_value);
-ATF_TEST_CASE_BODY(dnvlist_take_string__default_value)
-{
- nvlist_t *nvl;
- char *default_val, *actual_val;
-
- nvl = nvlist_create(0);
- nvlist_add_string(nvl, "key", "foobar");
- default_val = strdup("other");
-
- actual_val = dnvlist_take_string(nvl, "otherkey", default_val);
- ATF_REQUIRE_EQ(strcmp(actual_val, default_val), 0);
-
- free(actual_val);
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_nvlist__present);
-ATF_TEST_CASE_BODY(dnvlist_take_nvlist__present)
-{
- nvlist_t *nvl;
- const char *key;
- nvlist_t *value, *default_val, *actual_val;
-
- nvl = nvlist_create(0);
-
- key = "name";
- value = nvlist_create(0);
- default_val = nvlist_create(0);
- nvlist_move_nvlist(nvl, key, value);
-
- actual_val = dnvlist_take_nvlist(nvl, key, default_val);
- ATF_REQUIRE_EQ(actual_val, value);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- free(actual_val);
- free(default_val);
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_nvlist__empty);
-ATF_TEST_CASE_BODY(dnvlist_take_nvlist__empty)
-{
- nvlist_t *nvl, *actual_val;
-
- nvl = nvlist_create(0);
-
- actual_val = dnvlist_take_nvlist(nvl, "123", NULL);
- ATF_REQUIRE_EQ(actual_val, static_cast<nvlist_t *>(NULL));
-
- free(actual_val);
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_nvlist__default_value);
-ATF_TEST_CASE_BODY(dnvlist_take_nvlist__default_value)
-{
- nvlist_t *nvl;
- nvlist_t *default_val, *actual_val;
-
- nvl = nvlist_create(0);
- nvlist_move_nvlist(nvl, "key", nvlist_create(0));
- default_val = nvlist_create(0);
-
- actual_val = dnvlist_take_nvlist(nvl, "otherkey", default_val);
- ATF_REQUIRE_EQ(actual_val, default_val);
-
- free(actual_val);
- nvlist_destroy(nvl);
-}
-
-static void
-set_binary_value(void *&value, size_t &size, const char *str)
-{
-
- value = strdup(str);
- size = strlen(str) + 1; /* +1 to include '\0' */
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_binary__present);
-ATF_TEST_CASE_BODY(dnvlist_take_binary__present)
-{
- nvlist_t *nvl;
- const char *key;
- void *value, *default_val, *actual_val;
- size_t value_size, default_size, actual_size;
-
- nvl = nvlist_create(0);
-
- key = "name";
- set_binary_value(value, value_size, "fkdojvmo908");
- set_binary_value(default_val, default_size, "16546");
- nvlist_add_binary(nvl, key, value, value_size);
-
- actual_val = dnvlist_take_binary(nvl, key, &actual_size, default_val,
- default_size);
- ATF_REQUIRE_EQ(value_size, actual_size);
- ATF_REQUIRE_EQ(memcmp(actual_val, value, value_size), 0);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- free(actual_val);
- free(default_val);
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_binary__empty);
-ATF_TEST_CASE_BODY(dnvlist_take_binary__empty)
-{
- nvlist_t *nvl;
- void *default_val, *actual_val;
- size_t default_size, actual_size;
-
- nvl = nvlist_create(0);
- set_binary_value(default_val, default_size, "\xa8\x89\x49\xff\xe2\x08");
-
- actual_val = dnvlist_take_binary(nvl, "123", &actual_size, default_val,
- default_size);
- ATF_REQUIRE_EQ(default_size, actual_size);
- ATF_REQUIRE_EQ(memcmp(actual_val, default_val, actual_size), 0);
-
- free(actual_val);
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(dnvlist_take_binary__default_value);
-ATF_TEST_CASE_BODY(dnvlist_take_binary__default_value)
-{
- nvlist_t *nvl;
- void *default_val, *actual_val;
- size_t default_size, actual_size;
-
- nvl = nvlist_create(0);
- nvlist_add_binary(nvl, "key", "foobar", 6);
- set_binary_value(default_val, default_size, "vbhag");
-
- actual_val = dnvlist_take_binary(nvl, "otherkey", &actual_size,
- default_val, default_size);
- ATF_REQUIRE_EQ(default_size, actual_size);
- ATF_REQUIRE_EQ(memcmp(actual_val, default_val, default_size), 0);
-
- free(actual_val);
- nvlist_destroy(nvl);
-}
-
-ATF_INIT_TEST_CASES(tp)
-{
- ATF_ADD_TEST_CASE(tp, dnvlist_get_bool__present);
- ATF_ADD_TEST_CASE(tp, dnvlist_get_bool__default_value);
- ATF_ADD_TEST_CASE(tp, dnvlist_get_number__present);
- ATF_ADD_TEST_CASE(tp, dnvlist_get_number__default_value);
- ATF_ADD_TEST_CASE(tp, dnvlist_get_string__present);
- ATF_ADD_TEST_CASE(tp, dnvlist_get_string__default_value);
- ATF_ADD_TEST_CASE(tp, dnvlist_get_nvlist__present);
- ATF_ADD_TEST_CASE(tp, dnvlist_get_nvlist__default_value);
- ATF_ADD_TEST_CASE(tp, dnvlist_get_binary__present);
- ATF_ADD_TEST_CASE(tp, dnvlist_get_binary__default_value);
-
- ATF_ADD_TEST_CASE(tp, dnvlist_take_bool__present);
- ATF_ADD_TEST_CASE(tp, dnvlist_take_bool__empty);
- ATF_ADD_TEST_CASE(tp, dnvlist_take_bool__default_value);
- ATF_ADD_TEST_CASE(tp, dnvlist_take_number__present);
- ATF_ADD_TEST_CASE(tp, dnvlist_take_number__empty);
- ATF_ADD_TEST_CASE(tp, dnvlist_take_number__default_value);
- ATF_ADD_TEST_CASE(tp, dnvlist_take_string__present);
- ATF_ADD_TEST_CASE(tp, dnvlist_take_string__empty);
- ATF_ADD_TEST_CASE(tp, dnvlist_take_string__default_value);
- ATF_ADD_TEST_CASE(tp, dnvlist_take_nvlist__present);
- ATF_ADD_TEST_CASE(tp, dnvlist_take_nvlist__empty);
- ATF_ADD_TEST_CASE(tp, dnvlist_take_nvlist__default_value);
- ATF_ADD_TEST_CASE(tp, dnvlist_take_binary__present);
- ATF_ADD_TEST_CASE(tp, dnvlist_take_binary__empty);
- ATF_ADD_TEST_CASE(tp, dnvlist_take_binary__default_value);
-}
diff --git a/external/libnv/tests/nv_tests.cc b/external/libnv/tests/nv_tests.cc
deleted file mode 100644
index fcdc8683..00000000
--- a/external/libnv/tests/nv_tests.cc
+++ /dev/null
@@ -1,1254 +0,0 @@
-/*-
- * Copyright (c) 2014-2015 Sandvine Inc. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/lib/libnv/tests/nv_tests.cc 279760 2015-03-08 00:30:52Z dim $");
-
-#include <atf-c++.hpp>
-#include <nv.h>
-
-#include <errno.h>
-#include <limits>
-#include <set>
-#include <sstream>
-#include <string>
-
-/*
- * Test that a newly created nvlist has no errors, and is empty.
- */
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_create__is_empty);
-ATF_TEST_CASE_BODY(nvlist_create__is_empty)
-{
- nvlist_t *nvl;
- int type;
- void *it;
-
- nvl = nvlist_create(0);
-
- ATF_REQUIRE(nvl != NULL);
-
- ATF_REQUIRE_EQ(nvlist_error(nvl), 0);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- it = NULL;
- ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_null__single_insert);
-ATF_TEST_CASE_BODY(nvlist_add_null__single_insert)
-{
- nvlist_t *nvl;
- void *it;
- const char *key;
- int type;
-
- key = "key";
- nvl = nvlist_create(0);
-
- ATF_REQUIRE(nvl != NULL);
- ATF_REQUIRE(!nvlist_exists(nvl, key));
-
- nvlist_add_null(nvl, key);
-
- ATF_REQUIRE(!nvlist_empty(nvl));
- ATF_REQUIRE(nvlist_exists(nvl, key));
- ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
- ATF_REQUIRE(nvlist_exists_null(nvl, key));
- ATF_REQUIRE(nvlist_existsf_null(nvl, "key"));
-
- /* Iterate over the nvlist; ensure that it has only our one key. */
- it = NULL;
- ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
- ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
- ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_bool__single_insert);
-ATF_TEST_CASE_BODY(nvlist_add_bool__single_insert)
-{
- nvlist_t *nvl;
- void *it;
- const char *key;
- int type;
-
- key = "name";
- nvl = nvlist_create(0);
-
- ATF_REQUIRE(nvl != NULL);
- ATF_REQUIRE(!nvlist_exists(nvl, key));
-
- nvlist_add_bool(nvl, key, true);
-
- ATF_REQUIRE(!nvlist_empty(nvl));
- ATF_REQUIRE(nvlist_exists(nvl, key));
- ATF_REQUIRE(nvlist_existsf(nvl, "%s%s", "na", "me"));
- ATF_REQUIRE(nvlist_exists_bool(nvl, key));
- ATF_REQUIRE(nvlist_existsf_bool(nvl, "%s%c", "nam", 'e'));
- ATF_REQUIRE_EQ(nvlist_get_bool(nvl, key), true);
- ATF_REQUIRE_EQ(nvlist_getf_bool(nvl, "%c%s", 'n', "ame"), true);
-
- /* Iterate over the nvlist; ensure that it has only our one key. */
- it = NULL;
- ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
- ATF_REQUIRE_EQ(type, NV_TYPE_BOOL);
- ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_number__single_insert);
-ATF_TEST_CASE_BODY(nvlist_add_number__single_insert)
-{
- nvlist_t *nvl;
- void *it;
- const char *key;
- uint64_t value;
- int type;
-
- key = "foo123";
- value = 71965;
- nvl = nvlist_create(0);
-
- ATF_REQUIRE(nvl != NULL);
- ATF_REQUIRE(!nvlist_exists(nvl, key));
-
- nvlist_add_number(nvl, key, value);
-
- ATF_REQUIRE(!nvlist_empty(nvl));
- ATF_REQUIRE(nvlist_exists(nvl, key));
- ATF_REQUIRE(nvlist_existsf(nvl, "%s%d", "foo", 123));
- ATF_REQUIRE(nvlist_exists_number(nvl, key));
- ATF_REQUIRE(nvlist_existsf_number(nvl, "%s", key));
- ATF_REQUIRE_EQ(nvlist_get_number(nvl, key), value);
- ATF_REQUIRE_EQ(nvlist_getf_number(nvl, "%s", key), value);
-
- /* Iterate over the nvlist; ensure that it has only our one key. */
- it = NULL;
- ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
- ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
- ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_string__single_insert);
-ATF_TEST_CASE_BODY(nvlist_add_string__single_insert)
-{
- nvlist_t *nvl;
- void *it;
- const char *key;
- const char *value;
- int type;
-
- key = "test";
- value = "fgjdkgjdk";
- nvl = nvlist_create(0);
-
- ATF_REQUIRE(nvl != NULL);
- ATF_REQUIRE(!nvlist_exists(nvl, key));
-
- nvlist_add_string(nvl, key, value);
-
- ATF_REQUIRE(!nvlist_empty(nvl));
- ATF_REQUIRE(nvlist_exists(nvl, key));
- ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
- ATF_REQUIRE(nvlist_exists_string(nvl, key));
- ATF_REQUIRE(nvlist_existsf_string(nvl, "%s", key));
- ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, key), value), 0);
- ATF_REQUIRE_EQ(strcmp(nvlist_getf_string(nvl, "%s", key), value), 0);
-
- /* nvlist_add_* is required to clone the value, so check for that. */
- ATF_REQUIRE(nvlist_get_string(nvl, key) != value);
-
- /* Iterate over the nvlist; ensure that it has only our one key. */
- it = NULL;
- ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
- ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
- ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__single_insert);
-ATF_TEST_CASE_BODY(nvlist_add_nvlist__single_insert)
-{
- nvlist_t *nvl;
- void *it;
- const char *key, *subkey;
- nvlist_t *sublist;
- const nvlist_t *value;
- int type;
-
- key = "test";
- subkey = "subkey";
- sublist = nvlist_create(0);
- nvl = nvlist_create(0);
-
- ATF_REQUIRE(nvl != NULL);
- ATF_REQUIRE(!nvlist_exists(nvl, key));
-
- nvlist_add_null(sublist, subkey);
- nvlist_add_nvlist(nvl, key, sublist);
-
- ATF_REQUIRE(!nvlist_empty(nvl));
- ATF_REQUIRE(nvlist_exists(nvl, key));
- ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
- ATF_REQUIRE(nvlist_exists_nvlist(nvl, key));
- ATF_REQUIRE(nvlist_existsf_nvlist(nvl, "%s", key));
-
- value = nvlist_get_nvlist(nvl, key);
- ATF_REQUIRE(nvlist_exists_null(value, subkey));
-
- /* nvlist_add_* is required to clone the value, so check for that. */
- ATF_REQUIRE(sublist != value);
-
- value = nvlist_getf_nvlist(nvl, "%s", key);
- ATF_REQUIRE(nvlist_exists_null(value, subkey));
- ATF_REQUIRE(sublist != value);
-
- /* Iterate over the nvlist; ensure that it has only our one key. */
- it = NULL;
- ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
- ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
- ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
-
- nvlist_destroy(sublist);
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_nvlist__child_with_error);
-ATF_TEST_CASE_BODY(nvlist_add_nvlist__child_with_error)
-{
- nvlist_t *nvl, *parent;
-
- nvl = nvlist_create(0);
- parent = nvlist_create(0);
-
- nvlist_set_error(nvl, EBADF);
- nvlist_add_nvlist(parent, "test", nvl);
- ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
-
- nvlist_destroy(nvl);
- nvlist_destroy(parent);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_add_binary__single_insert);
-ATF_TEST_CASE_BODY(nvlist_add_binary__single_insert)
-{
- nvlist_t *nvl;
- void *it;
- const char *key;
- void *value;
- const void *ret_value;
- size_t value_size, ret_size;
- int type;
-
- key = "binary";
- value_size = 13;
- value = malloc(value_size);
- memset(value, 0xa5, value_size);
- nvl = nvlist_create(0);
-
- ATF_REQUIRE(nvl != NULL);
- ATF_REQUIRE(!nvlist_exists(nvl, key));
-
- nvlist_add_binary(nvl, key, value, value_size);
-
- ATF_REQUIRE(!nvlist_empty(nvl));
- ATF_REQUIRE(nvlist_exists(nvl, key));
- ATF_REQUIRE(nvlist_existsf(nvl, "%s", key));
- ATF_REQUIRE(nvlist_exists_binary(nvl, key));
- ATF_REQUIRE(nvlist_existsf_binary(nvl, "%s", key));
-
- ret_value = nvlist_get_binary(nvl, key, &ret_size);
- ATF_REQUIRE_EQ(value_size, ret_size);
- ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
-
- /* nvlist_add_* is required to clone the value, so check for that. */
- ATF_REQUIRE(value != ret_value);
-
- ret_value = nvlist_getf_binary(nvl, &ret_size, "%s", key);
- ATF_REQUIRE_EQ(value_size, ret_size);
- ATF_REQUIRE_EQ(memcmp(value, ret_value, ret_size), 0);
- ATF_REQUIRE(value != ret_value);
-
- /* Iterate over the nvlist; ensure that it has only our one key. */
- it = NULL;
- ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it), key), 0);
- ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
- ATF_REQUIRE_EQ(nvlist_next(nvl, &type,&it), static_cast<const char *>(NULL));
-
- nvlist_destroy(nvl);
- free(value);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__empty_nvlist);
-ATF_TEST_CASE_BODY(nvlist_clone__empty_nvlist)
-{
- nvlist_t *nvl, *clone;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- clone = nvlist_clone(nvl);
- ATF_REQUIRE(clone != NULL);
- ATF_REQUIRE(clone != nvl);
- ATF_REQUIRE(nvlist_empty(clone));
-
- nvlist_destroy(clone);
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nonempty_nvlist);
-ATF_TEST_CASE_BODY(nvlist_clone__nonempty_nvlist)
-{
- nvlist_t *nvl, *clone;
- const char *key;
- void *it;
- uint64_t value;
- int type;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- key = "testkey";
- value = 684874;
- nvlist_add_number(nvl, key, value);
-
- clone = nvlist_clone(nvl);
- ATF_REQUIRE(clone != NULL);
- ATF_REQUIRE(clone != nvl);
- ATF_REQUIRE(nvlist_exists_number(clone, key));
- ATF_REQUIRE_EQ(nvlist_get_number(clone, key), value);
-
- /* Iterate over the nvlist; ensure that it has only our one key. */
- it = NULL;
- ATF_REQUIRE_EQ(strcmp(nvlist_next(clone, &type, &it), key), 0);
- ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
- ATF_REQUIRE_EQ(nvlist_next(clone, &type, &it), static_cast<const char *>(NULL));
-
- nvlist_destroy(clone);
- nvlist_destroy(nvl);
-}
-
-static const char * const test_subnvlist_key = "nvlist";
-
-static const char * const test_string_key = "string";
-static const char * const test_string_val = "59525";
-
-static nvlist_t*
-create_test_nvlist(void)
-{
- nvlist_t *nvl, *sublist;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- sublist = nvlist_create(0);
- ATF_REQUIRE(sublist != NULL);
-
- nvlist_add_string(sublist, test_string_key, test_string_val);
- nvlist_move_nvlist(nvl, test_subnvlist_key, sublist);
-
- return (nvl);
-}
-
-static void
-verify_test_nvlist(const nvlist_t *nvl)
-{
- void *it;
- const nvlist_t *value;
- int type;
-
- ATF_REQUIRE(nvlist_exists_nvlist(nvl, test_subnvlist_key));
-
- value = nvlist_get_nvlist(nvl, test_subnvlist_key);
-
- ATF_REQUIRE(nvlist_exists_string(value, test_string_key));
- ATF_REQUIRE_EQ(strcmp(nvlist_get_string(value, test_string_key), test_string_val), 0);
- ATF_REQUIRE(nvlist_get_string(value, test_string_key) != test_string_val);
-
- /* Iterate over both nvlists; ensure that each has only the one key. */
- it = NULL;
- ATF_REQUIRE_EQ(strcmp(nvlist_next(value, &type, &it),
- test_string_key), 0);
- ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
- ATF_REQUIRE_EQ(nvlist_next(value, &type, &it), static_cast<const char *>(NULL));
-
- it = NULL;
- ATF_REQUIRE_EQ(strcmp(nvlist_next(nvl, &type, &it),
- test_subnvlist_key), 0);
- ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
- ATF_REQUIRE_EQ(nvlist_next(nvl, &type, &it), static_cast<const char *>(NULL));
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__nested_nvlist);
-ATF_TEST_CASE_BODY(nvlist_clone__nested_nvlist)
-{
- nvlist_t *nvl, *clone;
-
- nvl = create_test_nvlist();
- clone = nvlist_clone(nvl);
-
- ATF_REQUIRE(clone != NULL);
- ATF_REQUIRE(clone != nvl);
- verify_test_nvlist(clone);
-
- nvlist_destroy(clone);
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_clone__error_nvlist);
-ATF_TEST_CASE_BODY(nvlist_clone__error_nvlist)
-{
- nvlist_t *nvl, *clone;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- nvlist_set_error(nvl, ENOMEM);
-
- clone = nvlist_clone(nvl);
- ATF_REQUIRE(clone == NULL);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__empty_nvlist);
-ATF_TEST_CASE_BODY(nvlist_pack__empty_nvlist)
-{
- nvlist_t *nvl, *unpacked;
- void *packed;
- size_t packed_size;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- packed = nvlist_pack(nvl, &packed_size);
- ATF_REQUIRE(packed != NULL);
-
- unpacked = nvlist_unpack(packed, packed_size);
- ATF_REQUIRE(unpacked != NULL);
- ATF_REQUIRE(unpacked != nvl);
- ATF_REQUIRE(nvlist_empty(unpacked));
-
- nvlist_destroy(unpacked);
- nvlist_destroy(nvl);
- free(packed);
-}
-
-static void
-verify_null(const nvlist_t *nvl, int type)
-{
-
- ATF_REQUIRE_EQ(type, NV_TYPE_NULL);
-}
-
-static void
-verify_number(const nvlist_t *nvl, const char *name, int type, uint64_t value)
-{
-
- ATF_REQUIRE_EQ(type, NV_TYPE_NUMBER);
- ATF_REQUIRE_EQ(nvlist_get_number(nvl, name), value);
-}
-
-static void
-verify_string(const nvlist_t *nvl, const char *name, int type,
- const char * value)
-{
-
- ATF_REQUIRE_EQ(type, NV_TYPE_STRING);
- ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, name), value), 0);
-}
-
-static void
-verify_nvlist(const nvlist_t *nvl, const char *name, int type)
-{
-
- ATF_REQUIRE_EQ(type, NV_TYPE_NVLIST);
- verify_test_nvlist(nvlist_get_nvlist(nvl, name));
-}
-
-static void
-verify_binary(const nvlist_t *nvl, const char *name, int type,
- const void * value, size_t size)
-{
- const void *actual_value;
- size_t actual_size;
-
- ATF_REQUIRE_EQ(type, NV_TYPE_BINARY);
- actual_value = nvlist_get_binary(nvl, name, &actual_size);
- ATF_REQUIRE_EQ(size, actual_size);
- ATF_REQUIRE_EQ(memcmp(value, actual_value, size), 0);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__multiple_values);
-ATF_TEST_CASE_BODY(nvlist_pack__multiple_values)
-{
- std::ostringstream msg;
- std::set<std::string> keys_seen;
- nvlist_t *nvl, *unpacked, *nvvalue;
- const char *nullkey, *numkey, *strkey, *nvkey, *binkey, *name;
- int numvalue;
- const char * strvalue;
- void *binvalue, *packed, *it;
- size_t binsize, packed_size;
- int type;
-
- nvl = nvlist_create(0);
-
- nullkey = "null";
- nvlist_add_null(nvl, nullkey);
-
- numkey = "number";
- numvalue = 939853984;
- nvlist_add_number(nvl, numkey, numvalue);
-
- strkey = "string";
- strvalue = "jfieutijf";
- nvlist_add_string(nvl, strkey, strvalue);
-
- nvkey = "nvlist";
- nvvalue = create_test_nvlist();
- nvlist_move_nvlist(nvl, nvkey, nvvalue);
-
- binkey = "binary";
- binsize = 4;
- binvalue = malloc(binsize);
- memset(binvalue, 'b', binsize);
- nvlist_move_binary(nvl, binkey, binvalue, binsize);
-
- packed = nvlist_pack(nvl, &packed_size);
- ATF_REQUIRE(packed != NULL);
-
- unpacked = nvlist_unpack(packed, packed_size);
- ATF_REQUIRE(unpacked != 0);
-
- it = NULL;
- while ((name = nvlist_next(unpacked, &type, &it)) != NULL) {
- /* Ensure that we see every key only once. */
- ATF_REQUIRE_EQ(keys_seen.count(name), 0);
-
- if (strcmp(name, nullkey) == 0)
- verify_null(unpacked, type);
- else if (strcmp(name, numkey) == 0)
- verify_number(unpacked, name, type, numvalue);
- else if (strcmp(name, strkey) == 0)
- verify_string(unpacked, name, type, strvalue);
- else if (strcmp(name, nvkey) == 0)
- verify_nvlist(unpacked, name, type);
- else if (strcmp(name, binkey) == 0)
- verify_binary(unpacked, name, type, binvalue, binsize);
- else {
- msg << "Unexpected key :'" << name << "'";
- ATF_FAIL(msg.str().c_str());
- }
-
- keys_seen.insert(name);
- }
-
- /* Ensure that we saw every key. */
- ATF_REQUIRE_EQ(keys_seen.size(), 5);
-
- nvlist_destroy(nvl);
- nvlist_destroy(unpacked);
- free(packed);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_pack__error_nvlist);
-ATF_TEST_CASE_BODY(nvlist_pack__error_nvlist)
-{
- nvlist_t *nvl;
- void *packed;
- size_t size;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- nvlist_set_error(nvl, ENOMEM);
-
- packed = nvlist_pack(nvl, &size);
- ATF_REQUIRE(packed == NULL);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_unpack__duplicate_key);
-ATF_TEST_CASE_BODY(nvlist_unpack__duplicate_key)
-{
- nvlist_t *nvl, *unpacked;
- const char *key1, *key2;
- void *packed, *keypos;
- size_t size, keylen;
-
- nvl = nvlist_create(0);
-
- key1 = "key1";
- keylen = strlen(key1);
- nvlist_add_number(nvl, key1, 5);
-
- key2 = "key2";
- ATF_REQUIRE_EQ(keylen, strlen(key2));
- nvlist_add_number(nvl, key2, 10);
-
- packed = nvlist_pack(nvl, &size);
-
- /*
- * Mangle the packed nvlist by replacing key1 with key2, creating a
- * packed nvlist with a duplicate key.
- */
- keypos = memmem(packed, size, key1, keylen);
- ATF_REQUIRE(keypos != NULL);
- memcpy(keypos, key2, keylen);
-
- unpacked = nvlist_unpack(packed, size);
- ATF_REQUIRE(nvlist_error(unpacked) != 0);
-
- free(packed);
- nvlist_destroy(nvl);
- nvlist_destroy(unpacked);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_string__single_insert);
-ATF_TEST_CASE_BODY(nvlist_move_string__single_insert)
-{
- nvlist_t *nvl;
- const char *key;
- char *value;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- key = "testkey";
- value = strdup("testval");
- ATF_REQUIRE(value != NULL);
-
- nvlist_move_string(nvl, key, value);
- ATF_REQUIRE_EQ(nvlist_get_string(nvl, key), value);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__null_child);
-ATF_TEST_CASE_BODY(nvlist_move_nvlist__null_child)
-{
- nvlist_t *parent;
-
- parent = nvlist_create(0);
-
- nvlist_move_nvlist(parent, "test", NULL);
-
- ATF_REQUIRE(nvlist_error(parent) != 0);
-
- nvlist_destroy(parent);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__child_with_error);
-ATF_TEST_CASE_BODY(nvlist_move_nvlist__child_with_error)
-{
- nvlist_t *nvl, *parent;
-
- nvl = nvlist_create(0);
- parent = nvlist_create(0);
-
- nvlist_set_error(nvl, EBADF);
- nvlist_move_nvlist(parent, "test", nvl);
- ATF_REQUIRE_EQ(nvlist_error(parent), EBADF);
-
- nvlist_destroy(parent);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_nvlist__single_insert);
-ATF_TEST_CASE_BODY(nvlist_move_nvlist__single_insert)
-{
- nvlist_t *nvl;
- const char *key;
- nvlist_t *value;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- key = "testkey";
- value = nvlist_create(0);
- ATF_REQUIRE(value != NULL);
-
- nvlist_move_nvlist(nvl, key, value);
- ATF_REQUIRE_EQ(nvlist_get_nvlist(nvl, key), value);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_move_binary__single_insert);
-ATF_TEST_CASE_BODY(nvlist_move_binary__single_insert)
-{
- nvlist_t *nvl;
- const char *key;
- void *value;
- size_t size, actual_size;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- key = "testkey";
- size = 73;
- value = malloc(size);
- ATF_REQUIRE(value != NULL);
-
- nvlist_move_binary(nvl, key, value, size);
- ATF_REQUIRE_EQ(nvlist_get_binary(nvl, key, &actual_size), value);
- ATF_REQUIRE_EQ(size, actual_size);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__single_remove);
-ATF_TEST_CASE_BODY(nvlist_take_bool__single_remove)
-{
- nvlist_t *nvl;
- const char *testkey;
- bool testval;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- testkey = "boolkey";
- testval = false;
- nvlist_add_bool(nvl, testkey, testval);
-
- ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_bool__other_keys_unchanged);
-ATF_TEST_CASE_BODY(nvlist_take_bool__other_keys_unchanged)
-{
- nvlist_t *nvl;
- const char *testkey, *otherkey1, *otherkey2;
- bool testval, otherval1;
- nvlist_t *otherval2;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- testkey = "boolkey";
- testval = true;
- nvlist_add_bool(nvl, testkey, testval);
-
- otherkey1 = "key1";
- otherval1 = false;
- nvlist_add_bool(nvl, otherkey1, otherval1);
-
- otherkey2 = "key2";
- otherval2 = create_test_nvlist();
- nvlist_move_nvlist(nvl, otherkey2, otherval2);
-
- ATF_REQUIRE_EQ(nvlist_take_bool(nvl, testkey), testval);
-
- ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey1));
- ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey1), otherval1);
-
- ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey2));
- verify_test_nvlist(nvlist_get_nvlist(nvl, otherkey2));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__single_remove);
-ATF_TEST_CASE_BODY(nvlist_take_number__single_remove)
-{
- nvlist_t *nvl;
- const char *testkey;
- uint64_t testval;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- testkey = "numkey";
- testval = std::numeric_limits<uint64_t>::max();
- nvlist_add_number(nvl, testkey, testval);
-
- ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_number__other_keys_unchanged);
-ATF_TEST_CASE_BODY(nvlist_take_number__other_keys_unchanged)
-{
- nvlist_t *nvl;
- const char *testkey, *otherkey1, *otherkey2;
- uint64_t testval, otherval1;
- const char *otherval2;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- otherkey1 = "key1";
- otherval1 = 5;
- nvlist_add_number(nvl, otherkey1, otherval1);
-
- testkey = "numkey";
- testval = 1654;
- nvlist_add_number(nvl, testkey, testval);
-
- otherkey2 = "key2";
- otherval2 = "string";
- nvlist_add_string(nvl, otherkey2, otherval2);
-
- ATF_REQUIRE_EQ(nvlist_take_number(nvl, testkey), testval);
-
- ATF_REQUIRE(nvlist_exists_number(nvl, otherkey1));
- ATF_REQUIRE_EQ(nvlist_get_number(nvl, otherkey1), otherval1);
-
- ATF_REQUIRE(nvlist_exists_string(nvl, otherkey2));
- ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey2), otherval2), 0);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__single_remove);
-ATF_TEST_CASE_BODY(nvlist_take_string__single_remove)
-{
- nvlist_t *nvl;
- const char *testkey;
- const char *testval;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- testkey = "numkey";
- testval = "nvlist";
- nvlist_add_string(nvl, testkey, testval);
-
- ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_string__other_keys_unchanged);
-ATF_TEST_CASE_BODY(nvlist_take_string__other_keys_unchanged)
-{
- nvlist_t *nvl;
- const char *testkey, *otherkey1, *otherkey2;
- const char *testval, *otherval1;
- bool otherval2;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- otherkey1 = "key1";
- otherval1 = "fjdifjdk";
- nvlist_add_string(nvl, otherkey1, otherval1);
-
- otherkey2 = "key2";
- otherval2 = true;
- nvlist_add_bool(nvl, otherkey2, otherval2);
-
- testkey = "strkey";
- testval = "1654";
- nvlist_add_string(nvl, testkey, testval);
-
- ATF_REQUIRE_EQ(strcmp(nvlist_take_string(nvl, testkey), testval), 0);
-
- ATF_REQUIRE(nvlist_exists_string(nvl, otherkey1));
- ATF_REQUIRE_EQ(strcmp(nvlist_get_string(nvl, otherkey1), otherval1), 0);
-
- ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
- ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__single_remove);
-ATF_TEST_CASE_BODY(nvlist_take_nvlist__single_remove)
-{
- nvlist_t *nvl;
- const char *testkey;
- nvlist_t *testval;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- testkey = "numkey";
- testval = create_test_nvlist();
- nvlist_move_nvlist(nvl, testkey, testval);
-
- verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_nvlist__other_keys_unchanged);
-ATF_TEST_CASE_BODY(nvlist_take_nvlist__other_keys_unchanged)
-{
- nvlist_t *nvl;
- const char *testkey, *otherkey1, *otherkey2;
- nvlist_t *testval, *otherval1;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- testkey = "strkey";
- testval = create_test_nvlist();
- nvlist_move_nvlist(nvl, testkey, testval);
-
- otherkey1 = "key1";
- otherval1 = nvlist_create(0);
- nvlist_move_nvlist(nvl, otherkey1, otherval1);
-
- otherkey2 = "key2";
- nvlist_add_null(nvl, otherkey2);
-
- verify_test_nvlist(nvlist_take_nvlist(nvl, testkey));
-
- ATF_REQUIRE(nvlist_exists_nvlist(nvl, otherkey1));
- ATF_REQUIRE(nvlist_empty(nvlist_get_nvlist(nvl, otherkey1)));
-
- ATF_REQUIRE(nvlist_exists_null(nvl, otherkey2));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__single_remove);
-ATF_TEST_CASE_BODY(nvlist_take_binary__single_remove)
-{
- nvlist_t *nvl;
- const char *testkey;
- void *testval;
- const void *actual_val;
- size_t testsize, actual_size;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- testkey = "numkey";
- testsize = 457;
- testval = malloc(testsize);
- memset(testval, '5', testsize);
- nvlist_move_binary(nvl, testkey, testval, testsize);
-
- actual_val = nvlist_take_binary(nvl, testkey, &actual_size);
- ATF_REQUIRE_EQ(testsize, actual_size);
- ATF_REQUIRE_EQ(memcmp(actual_val, testval, testsize), 0);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_take_binary__other_keys_unchanged);
-ATF_TEST_CASE_BODY(nvlist_take_binary__other_keys_unchanged)
-{
- nvlist_t *nvl;
- const char *testkey, *otherkey1, *otherkey2;
- const void *actual_value;
- char testval[] = "gjiertj";
- char otherval1[] = "fdreg";
- size_t testsize, othersize, actual_size;
- bool otherval2;
-
- nvl = nvlist_create(0);
- ATF_REQUIRE(nvl != NULL);
-
- otherkey1 = "key1";
- othersize = sizeof(otherval1);
- nvlist_add_binary(nvl, otherkey1, otherval1, othersize);
-
- otherkey2 = "key2";
- otherval2 = true;
- nvlist_add_bool(nvl, otherkey2, otherval2);
-
- testkey = "strkey";
- testsize = sizeof(testval);
- nvlist_add_binary(nvl, testkey, testval, testsize);
-
- actual_value = nvlist_take_binary(nvl, testkey, &actual_size);
- ATF_REQUIRE_EQ(testsize, actual_size);
- ATF_REQUIRE_EQ(memcmp(actual_value, testval, testsize), 0);
-
- ATF_REQUIRE(nvlist_exists_binary(nvl, otherkey1));
- actual_value = nvlist_get_binary(nvl, otherkey1, &actual_size);
- ATF_REQUIRE_EQ(othersize, actual_size);
- ATF_REQUIRE_EQ(memcmp(actual_value, otherval1, othersize), 0);
-
- ATF_REQUIRE(nvlist_exists_bool(nvl, otherkey2));
- ATF_REQUIRE_EQ(nvlist_get_bool(nvl, otherkey2), otherval2);
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_null);
-ATF_TEST_CASE_BODY(nvlist_free__single_null)
-{
- nvlist_t *nvl;
- const char *key;
-
- nvl = nvlist_create(0);
- key = "test";
- nvlist_add_null(nvl, key);
-
- nvlist_free(nvl, key);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_bool);
-ATF_TEST_CASE_BODY(nvlist_free__single_bool)
-{
- nvlist_t *nvl;
- const char *key;
-
- nvl = nvlist_create(0);
- key = "test";
- nvlist_add_bool(nvl, key, true);
-
- nvlist_free(nvl, key);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_number);
-ATF_TEST_CASE_BODY(nvlist_free__single_number)
-{
- nvlist_t *nvl;
- const char *key;
-
- nvl = nvlist_create(0);
- key = "test";
- nvlist_add_number(nvl, key, 584);
-
- nvlist_free(nvl, key);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_string);
-ATF_TEST_CASE_BODY(nvlist_free__single_string)
-{
- nvlist_t *nvl;
- const char *key;
-
- nvl = nvlist_create(0);
- key = "test";
- nvlist_add_string(nvl, key, "gjkfkjd");
-
- nvlist_free(nvl, key);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_nvlist);
-ATF_TEST_CASE_BODY(nvlist_free__single_nvlist)
-{
- nvlist_t *nvl;
- const char *key;
-
- nvl = nvlist_create(0);
- key = "test";
- nvlist_add_nvlist(nvl, key, nvlist_create(0));
-
- nvlist_free(nvl, key);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free__single_binary);
-ATF_TEST_CASE_BODY(nvlist_free__single_binary)
-{
- nvlist_t *nvl;
- const char *key;
-
- nvl = nvlist_create(0);
- key = "test";
- nvlist_add_binary(nvl, key, "jgjgfd", 6);
-
- nvlist_free(nvl, key);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_null__single_null);
-ATF_TEST_CASE_BODY(nvlist_free_null__single_null)
-{
- nvlist_t *nvl;
- const char *key;
-
- nvl = nvlist_create(0);
- key = "test";
- nvlist_add_null(nvl, key);
-
- nvlist_free_null(nvl, key);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_bool__single_bool);
-ATF_TEST_CASE_BODY(nvlist_free_bool__single_bool)
-{
- nvlist_t *nvl;
- const char *key;
-
- nvl = nvlist_create(0);
- key = "test";
- nvlist_add_bool(nvl, key, true);
-
- nvlist_free_bool(nvl, key);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_number__single_number);
-ATF_TEST_CASE_BODY(nvlist_free_number__single_number)
-{
- nvlist_t *nvl;
- const char *key;
-
- nvl = nvlist_create(0);
- key = "test";
- nvlist_add_number(nvl, key, 584);
-
- nvlist_free_number(nvl, key);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_string__single_string);
-ATF_TEST_CASE_BODY(nvlist_free_string__single_string)
-{
- nvlist_t *nvl;
- const char *key;
-
- nvl = nvlist_create(0);
- key = "test";
- nvlist_add_string(nvl, key, "gjkfkjd");
-
- nvlist_free_string(nvl, key);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_nvlist__single_nvlist);
-ATF_TEST_CASE_BODY(nvlist_free_nvlist__single_nvlist)
-{
- nvlist_t *nvl;
- const char *key;
-
- nvl = nvlist_create(0);
- key = "test";
- nvlist_add_nvlist(nvl, key, nvlist_create(0));
-
- nvlist_free_nvlist(nvl, key);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_TEST_CASE_WITHOUT_HEAD(nvlist_free_binary__single_binary);
-ATF_TEST_CASE_BODY(nvlist_free_binary__single_binary)
-{
- nvlist_t *nvl;
- const char *key;
-
- nvl = nvlist_create(0);
- key = "test";
- nvlist_add_binary(nvl, key, "jgjgfd", 6);
-
- nvlist_free_binary(nvl, key);
- ATF_REQUIRE(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-}
-
-ATF_INIT_TEST_CASES(tp)
-{
- ATF_ADD_TEST_CASE(tp, nvlist_create__is_empty);
- ATF_ADD_TEST_CASE(tp, nvlist_add_null__single_insert);
- ATF_ADD_TEST_CASE(tp, nvlist_add_bool__single_insert);
- ATF_ADD_TEST_CASE(tp, nvlist_add_number__single_insert);
- ATF_ADD_TEST_CASE(tp, nvlist_add_string__single_insert);
- ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__single_insert);
- ATF_ADD_TEST_CASE(tp, nvlist_add_nvlist__child_with_error);
- ATF_ADD_TEST_CASE(tp, nvlist_add_binary__single_insert);
-
- ATF_ADD_TEST_CASE(tp, nvlist_clone__empty_nvlist);
- ATF_ADD_TEST_CASE(tp, nvlist_clone__nonempty_nvlist);
- ATF_ADD_TEST_CASE(tp, nvlist_clone__nested_nvlist);
- ATF_ADD_TEST_CASE(tp, nvlist_clone__error_nvlist);
-
- ATF_ADD_TEST_CASE(tp, nvlist_pack__empty_nvlist);
- ATF_ADD_TEST_CASE(tp, nvlist_pack__multiple_values);
- ATF_ADD_TEST_CASE(tp, nvlist_pack__error_nvlist);
- ATF_ADD_TEST_CASE(tp, nvlist_unpack__duplicate_key);
-
- ATF_ADD_TEST_CASE(tp, nvlist_move_string__single_insert);
- ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__single_insert);
- ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__null_child);
- ATF_ADD_TEST_CASE(tp, nvlist_move_nvlist__child_with_error);
- ATF_ADD_TEST_CASE(tp, nvlist_move_binary__single_insert);
-
- ATF_ADD_TEST_CASE(tp, nvlist_take_bool__single_remove);
- ATF_ADD_TEST_CASE(tp, nvlist_take_bool__other_keys_unchanged);
- ATF_ADD_TEST_CASE(tp, nvlist_take_number__single_remove);
- ATF_ADD_TEST_CASE(tp, nvlist_take_number__other_keys_unchanged);
- ATF_ADD_TEST_CASE(tp, nvlist_take_string__single_remove);
- ATF_ADD_TEST_CASE(tp, nvlist_take_string__other_keys_unchanged);
- ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__single_remove);
- ATF_ADD_TEST_CASE(tp, nvlist_take_nvlist__other_keys_unchanged);
- ATF_ADD_TEST_CASE(tp, nvlist_take_binary__single_remove);
- ATF_ADD_TEST_CASE(tp, nvlist_take_binary__other_keys_unchanged);
-
- ATF_ADD_TEST_CASE(tp, nvlist_free__single_null);
- ATF_ADD_TEST_CASE(tp, nvlist_free__single_bool);
- ATF_ADD_TEST_CASE(tp, nvlist_free__single_number);
- ATF_ADD_TEST_CASE(tp, nvlist_free__single_string);
- ATF_ADD_TEST_CASE(tp, nvlist_free__single_nvlist);
- ATF_ADD_TEST_CASE(tp, nvlist_free__single_binary);
-
- ATF_ADD_TEST_CASE(tp, nvlist_free_null__single_null);
- ATF_ADD_TEST_CASE(tp, nvlist_free_bool__single_bool);
- ATF_ADD_TEST_CASE(tp, nvlist_free_number__single_number);
- ATF_ADD_TEST_CASE(tp, nvlist_free_string__single_string);
- ATF_ADD_TEST_CASE(tp, nvlist_free_nvlist__single_nvlist);
- ATF_ADD_TEST_CASE(tp, nvlist_free_binary__single_binary);
-}
diff --git a/external/libnv/tests/nvlist_add_test.c b/external/libnv/tests/nvlist_add_test.c
deleted file mode 100644
index 1847146d..00000000
--- a/external/libnv/tests/nvlist_add_test.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/*-
- * Copyright (c) 2013 The FreeBSD Foundation
- * All rights reserved.
- *
- * This software was developed by Pawel Jakub Dawidek under sponsorship from
- * the FreeBSD Foundation.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD: head/lib/libnv/tests/nvlist_add_test.c 269603 2014-08-05 18:41:27Z ngie $
- */
-
-#include <errno.h>
-#include <stdio.h>
-#include <unistd.h>
-
-#include <nv.h>
-
-static int ntest = 1;
-
-#define CHECK(expr) do { \
- if ((expr)) \
- printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__); \
- else \
- printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
- ntest++; \
-} while (0)
-
-int
-main(void)
-{
- const nvlist_t *cnvl;
- nvlist_t *nvl;
-
- printf("1..94\n");
-
- nvl = nvlist_create(0);
-
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- nvlist_add_null(nvl, "nvlist/null");
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_null(nvl, "nvlist/null"));
-
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool/true"));
- nvlist_add_bool(nvl, "nvlist/bool/true", true);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_bool(nvl, "nvlist/bool/true"));
-
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool/false"));
- nvlist_add_bool(nvl, "nvlist/bool/false", false);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_bool(nvl, "nvlist/bool/false"));
-
- CHECK(!nvlist_exists_number(nvl, "nvlist/number/0"));
- nvlist_add_number(nvl, "nvlist/number/0", 0);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_number(nvl, "nvlist/number/0"));
-
- CHECK(!nvlist_exists_number(nvl, "nvlist/number/1"));
- nvlist_add_number(nvl, "nvlist/number/1", 1);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_number(nvl, "nvlist/number/1"));
-
- CHECK(!nvlist_exists_number(nvl, "nvlist/number/-1"));
- nvlist_add_number(nvl, "nvlist/number/-1", -1);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_number(nvl, "nvlist/number/-1"));
-
- CHECK(!nvlist_exists_number(nvl, "nvlist/number/UINT64_MAX"));
- nvlist_add_number(nvl, "nvlist/number/UINT64_MAX", UINT64_MAX);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_number(nvl, "nvlist/number/UINT64_MAX"));
-
- CHECK(!nvlist_exists_number(nvl, "nvlist/number/INT64_MIN"));
- nvlist_add_number(nvl, "nvlist/number/INT64_MIN", INT64_MIN);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_number(nvl, "nvlist/number/INT64_MIN"));
-
- CHECK(!nvlist_exists_number(nvl, "nvlist/number/INT64_MAX"));
- nvlist_add_number(nvl, "nvlist/number/INT64_MAX", INT64_MAX);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_number(nvl, "nvlist/number/INT64_MAX"));
-
- CHECK(!nvlist_exists_string(nvl, "nvlist/string/"));
- nvlist_add_string(nvl, "nvlist/string/", "");
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_string(nvl, "nvlist/string/"));
-
- CHECK(!nvlist_exists_string(nvl, "nvlist/string/x"));
- nvlist_add_string(nvl, "nvlist/string/x", "x");
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_string(nvl, "nvlist/string/x"));
-
- CHECK(!nvlist_exists_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
- nvlist_add_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz");
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
-
- CHECK(!nvlist_exists_string(nvl, "nvlist/stringf/"));
- nvlist_add_stringf(nvl, "nvlist/stringf/", "%s", "");
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_string(nvl, "nvlist/stringf/"));
-
- CHECK(!nvlist_exists_string(nvl, "nvlist/stringf/x"));
- nvlist_add_stringf(nvl, "nvlist/stringf/x", "%s", "x");
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_string(nvl, "nvlist/stringf/x"));
-
- CHECK(!nvlist_exists_string(nvl, "nvlist/stringf/666Xabc"));
- nvlist_add_stringf(nvl, "nvlist/stringf/666Xabc", "%d%c%s", 666, 'X', "abc");
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_string(nvl, "nvlist/stringf/666Xabc"));
-
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
- nvlist_add_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO", STDERR_FILENO);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
-
- CHECK(!nvlist_exists_binary(nvl, "nvlist/binary/x"));
- nvlist_add_binary(nvl, "nvlist/binary/x", "x", 1);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary/x"));
-
- CHECK(!nvlist_exists_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
- nvlist_add_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz"));
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
-
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
-
- CHECK(nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(nvlist_exists_bool(nvl, "nvlist/bool/true"));
- CHECK(nvlist_exists_bool(nvl, "nvlist/bool/false"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number/0"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number/1"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number/-1"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number/UINT64_MAX"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number/INT64_MIN"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number/INT64_MAX"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string/"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string/x"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
- CHECK(nvlist_exists_string(nvl, "nvlist/stringf/"));
- CHECK(nvlist_exists_string(nvl, "nvlist/stringf/x"));
- CHECK(nvlist_exists_string(nvl, "nvlist/stringf/666Xabc"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary/x"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
-
- cnvl = nvlist_get_nvlist(nvl, "nvlist/nvlist");
- CHECK(nvlist_exists_null(cnvl, "nvlist/null"));
- CHECK(nvlist_exists_bool(cnvl, "nvlist/bool/true"));
- CHECK(nvlist_exists_bool(cnvl, "nvlist/bool/false"));
- CHECK(nvlist_exists_number(cnvl, "nvlist/number/0"));
- CHECK(nvlist_exists_number(cnvl, "nvlist/number/1"));
- CHECK(nvlist_exists_number(cnvl, "nvlist/number/-1"));
- CHECK(nvlist_exists_number(cnvl, "nvlist/number/UINT64_MAX"));
- CHECK(nvlist_exists_number(cnvl, "nvlist/number/INT64_MIN"));
- CHECK(nvlist_exists_number(cnvl, "nvlist/number/INT64_MAX"));
- CHECK(nvlist_exists_string(cnvl, "nvlist/string/"));
- CHECK(nvlist_exists_string(cnvl, "nvlist/string/x"));
- CHECK(nvlist_exists_string(cnvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
- CHECK(nvlist_exists_string(cnvl, "nvlist/stringf/"));
- CHECK(nvlist_exists_string(cnvl, "nvlist/stringf/x"));
- CHECK(nvlist_exists_string(cnvl, "nvlist/stringf/666Xabc"));
- CHECK(nvlist_exists_descriptor(cnvl, "nvlist/descriptor/STDERR_FILENO"));
- CHECK(nvlist_exists_binary(cnvl, "nvlist/binary/x"));
- CHECK(nvlist_exists_binary(cnvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
-
- nvlist_destroy(nvl);
-
- return (0);
-}
diff --git a/external/libnv/tests/nvlist_exists_test.c b/external/libnv/tests/nvlist_exists_test.c
deleted file mode 100644
index cd8fc363..00000000
--- a/external/libnv/tests/nvlist_exists_test.c
+++ /dev/null
@@ -1,321 +0,0 @@
-/*-
- * Copyright (c) 2013 The FreeBSD Foundation
- * All rights reserved.
- *
- * This software was developed by Pawel Jakub Dawidek under sponsorship from
- * the FreeBSD Foundation.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD: head/lib/libnv/tests/nvlist_exists_test.c 269603 2014-08-05 18:41:27Z ngie $
- */
-
-#include <stdio.h>
-#include <unistd.h>
-
-#include <nv.h>
-
-static int ntest = 1;
-
-#define CHECK(expr) do { \
- if ((expr)) \
- printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__); \
- else \
- printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
- ntest++; \
-} while (0)
-
-int
-main(void)
-{
- nvlist_t *nvl;
-
- printf("1..232\n");
-
- nvl = nvlist_create(0);
-
- CHECK(!nvlist_exists(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/null"));
- nvlist_add_null(nvl, "nvlist/null");
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists(nvl, "nvlist/null"));
- CHECK(nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/null"));
-
- CHECK(!nvlist_exists(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/bool"));
- nvlist_add_bool(nvl, "nvlist/bool", true);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/bool"));
- CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/bool"));
-
- CHECK(!nvlist_exists(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/number"));
- nvlist_add_number(nvl, "nvlist/number", 0);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/number"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/number"));
-
- CHECK(!nvlist_exists(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/string"));
- nvlist_add_string(nvl, "nvlist/string", "test");
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/string"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/string"));
-
- CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/nvlist"));
- nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/nvlist"));
-
- CHECK(!nvlist_exists(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/descriptor"));
- nvlist_add_descriptor(nvl, "nvlist/descriptor", STDERR_FILENO);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/descriptor"));
-
- CHECK(!nvlist_exists(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/binary"));
- nvlist_add_binary(nvl, "nvlist/binary", "test", 4);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/binary"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- CHECK(nvlist_exists(nvl, "nvlist/null"));
- CHECK(nvlist_exists(nvl, "nvlist/bool"));
- CHECK(nvlist_exists(nvl, "nvlist/number"));
- CHECK(nvlist_exists(nvl, "nvlist/string"));
- CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists(nvl, "nvlist/binary"));
- CHECK(nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free_null(nvl, "nvlist/null");
- CHECK(!nvlist_exists(nvl, "nvlist/null"));
- CHECK(nvlist_exists(nvl, "nvlist/bool"));
- CHECK(nvlist_exists(nvl, "nvlist/number"));
- CHECK(nvlist_exists(nvl, "nvlist/string"));
- CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free_bool(nvl, "nvlist/bool");
- CHECK(!nvlist_exists(nvl, "nvlist/null"));
- CHECK(!nvlist_exists(nvl, "nvlist/bool"));
- CHECK(nvlist_exists(nvl, "nvlist/number"));
- CHECK(nvlist_exists(nvl, "nvlist/string"));
- CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free_number(nvl, "nvlist/number");
- CHECK(!nvlist_exists(nvl, "nvlist/null"));
- CHECK(!nvlist_exists(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists(nvl, "nvlist/number"));
- CHECK(nvlist_exists(nvl, "nvlist/string"));
- CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free_string(nvl, "nvlist/string");
- CHECK(!nvlist_exists(nvl, "nvlist/null"));
- CHECK(!nvlist_exists(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists(nvl, "nvlist/number"));
- CHECK(!nvlist_exists(nvl, "nvlist/string"));
- CHECK(nvlist_exists(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free_nvlist(nvl, "nvlist/nvlist");
- CHECK(!nvlist_exists(nvl, "nvlist/null"));
- CHECK(!nvlist_exists(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists(nvl, "nvlist/number"));
- CHECK(!nvlist_exists(nvl, "nvlist/string"));
- CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free_descriptor(nvl, "nvlist/descriptor");
- CHECK(!nvlist_exists(nvl, "nvlist/null"));
- CHECK(!nvlist_exists(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists(nvl, "nvlist/number"));
- CHECK(!nvlist_exists(nvl, "nvlist/string"));
- CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free_binary(nvl, "nvlist/binary");
- CHECK(!nvlist_exists(nvl, "nvlist/null"));
- CHECK(!nvlist_exists(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists(nvl, "nvlist/number"));
- CHECK(!nvlist_exists(nvl, "nvlist/string"));
- CHECK(!nvlist_exists(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists(nvl, "nvlist/binary"));
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/binary"));
-
- CHECK(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-
- return (0);
-}
diff --git a/external/libnv/tests/nvlist_free_test.c b/external/libnv/tests/nvlist_free_test.c
deleted file mode 100644
index fe6ff9c4..00000000
--- a/external/libnv/tests/nvlist_free_test.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/*-
- * Copyright (c) 2013 The FreeBSD Foundation
- * All rights reserved.
- *
- * This software was developed by Pawel Jakub Dawidek under sponsorship from
- * the FreeBSD Foundation.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD: head/lib/libnv/tests/nvlist_free_test.c 269603 2014-08-05 18:41:27Z ngie $
- */
-
-#include <stdio.h>
-#include <unistd.h>
-
-#include <nv.h>
-
-static int ntest = 1;
-
-#define CHECK(expr) do { \
- if ((expr)) \
- printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__); \
- else \
- printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
- ntest++; \
-} while (0)
-
-int
-main(void)
-{
- nvlist_t *nvl;
-
- printf("1..114\n");
-
- nvl = nvlist_create(0);
-
- nvlist_add_null(nvl, "nvlist/null");
- nvlist_add_bool(nvl, "nvlist/bool", true);
- nvlist_add_number(nvl, "nvlist/number", 0);
- nvlist_add_string(nvl, "nvlist/string", "test");
- nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
- nvlist_add_descriptor(nvl, "nvlist/descriptor", STDERR_FILENO);
- nvlist_add_binary(nvl, "nvlist/binary", "test", 4);
-
- CHECK(nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free_null(nvl, "nvlist/null");
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free_bool(nvl, "nvlist/bool");
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free_number(nvl, "nvlist/number");
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free_string(nvl, "nvlist/string");
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free_nvlist(nvl, "nvlist/nvlist");
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free_descriptor(nvl, "nvlist/descriptor");
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free_binary(nvl, "nvlist/binary");
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/binary"));
-
- CHECK(nvlist_empty(nvl));
-
- nvlist_add_null(nvl, "nvlist/null");
- nvlist_add_bool(nvl, "nvlist/bool", true);
- nvlist_add_number(nvl, "nvlist/number", 0);
- nvlist_add_string(nvl, "nvlist/string", "test");
- nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
- nvlist_add_descriptor(nvl, "nvlist/descriptor", STDERR_FILENO);
- nvlist_add_binary(nvl, "nvlist/binary", "test", 4);
-
- CHECK(nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free(nvl, "nvlist/null");
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free(nvl, "nvlist/bool");
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free(nvl, "nvlist/number");
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free(nvl, "nvlist/string");
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free(nvl, "nvlist/nvlist");
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free(nvl, "nvlist/descriptor");
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary"));
-
- nvlist_free(nvl, "nvlist/binary");
- CHECK(!nvlist_exists_null(nvl, "nvlist/null"));
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool"));
- CHECK(!nvlist_exists_number(nvl, "nvlist/number"));
- CHECK(!nvlist_exists_string(nvl, "nvlist/string"));
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor"));
- CHECK(!nvlist_exists_binary(nvl, "nvlist/binary"));
-
- CHECK(nvlist_empty(nvl));
-
- nvlist_destroy(nvl);
-
- return (0);
-}
diff --git a/external/libnv/tests/nvlist_get_test.c b/external/libnv/tests/nvlist_get_test.c
deleted file mode 100644
index ebea8261..00000000
--- a/external/libnv/tests/nvlist_get_test.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/*-
- * Copyright (c) 2013 The FreeBSD Foundation
- * All rights reserved.
- *
- * This software was developed by Pawel Jakub Dawidek under sponsorship from
- * the FreeBSD Foundation.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD: head/lib/libnv/tests/nvlist_get_test.c 269603 2014-08-05 18:41:27Z ngie $
- */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <nv.h>
-
-static int ntest = 1;
-
-#define CHECK(expr) do { \
- if ((expr)) \
- printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__); \
- else \
- printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
- ntest++; \
-} while (0)
-
-#define fd_is_valid(fd) (fcntl((fd), F_GETFL) != -1 || errno != EBADF)
-
-int
-main(void)
-{
- const nvlist_t *cnvl;
- nvlist_t *nvl;
- size_t size;
-
- printf("1..83\n");
-
- nvl = nvlist_create(0);
-
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool/true"));
- nvlist_add_bool(nvl, "nvlist/bool/true", true);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_get_bool(nvl, "nvlist/bool/true") == true);
-
- CHECK(!nvlist_exists_bool(nvl, "nvlist/bool/false"));
- nvlist_add_bool(nvl, "nvlist/bool/false", false);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_get_bool(nvl, "nvlist/bool/false") == false);
-
- CHECK(!nvlist_exists_number(nvl, "nvlist/number/0"));
- nvlist_add_number(nvl, "nvlist/number/0", 0);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_get_number(nvl, "nvlist/number/0") == 0);
-
- CHECK(!nvlist_exists_number(nvl, "nvlist/number/1"));
- nvlist_add_number(nvl, "nvlist/number/1", 1);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_get_number(nvl, "nvlist/number/1") == 1);
-
- CHECK(!nvlist_exists_number(nvl, "nvlist/number/-1"));
- nvlist_add_number(nvl, "nvlist/number/-1", -1);
- CHECK(nvlist_error(nvl) == 0);
- CHECK((int)nvlist_get_number(nvl, "nvlist/number/-1") == -1);
-
- CHECK(!nvlist_exists_number(nvl, "nvlist/number/UINT64_MAX"));
- nvlist_add_number(nvl, "nvlist/number/UINT64_MAX", UINT64_MAX);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_get_number(nvl, "nvlist/number/UINT64_MAX") == UINT64_MAX);
-
- CHECK(!nvlist_exists_number(nvl, "nvlist/number/INT64_MIN"));
- nvlist_add_number(nvl, "nvlist/number/INT64_MIN", INT64_MIN);
- CHECK(nvlist_error(nvl) == 0);
- CHECK((int64_t)nvlist_get_number(nvl, "nvlist/number/INT64_MIN") == INT64_MIN);
-
- CHECK(!nvlist_exists_number(nvl, "nvlist/number/INT64_MAX"));
- nvlist_add_number(nvl, "nvlist/number/INT64_MAX", INT64_MAX);
- CHECK(nvlist_error(nvl) == 0);
- CHECK((int64_t)nvlist_get_number(nvl, "nvlist/number/INT64_MAX") == INT64_MAX);
-
- CHECK(!nvlist_exists_string(nvl, "nvlist/string/"));
- nvlist_add_string(nvl, "nvlist/string/", "");
- CHECK(nvlist_error(nvl) == 0);
- CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/"), "") == 0);
-
- CHECK(!nvlist_exists_string(nvl, "nvlist/string/x"));
- nvlist_add_string(nvl, "nvlist/string/x", "x");
- CHECK(nvlist_error(nvl) == 0);
- CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/x"), "x") == 0);
-
- CHECK(!nvlist_exists_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
- nvlist_add_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz");
- CHECK(nvlist_error(nvl) == 0);
- CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnopqrstuvwxyz") == 0);
-
- CHECK(!nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
- nvlist_add_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO", STDERR_FILENO);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(fd_is_valid(nvlist_get_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO")));
-
- CHECK(!nvlist_exists_binary(nvl, "nvlist/binary/x"));
- nvlist_add_binary(nvl, "nvlist/binary/x", "x", 1);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/x", NULL), "x", 1) == 0);
- CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/x", &size), "x", 1) == 0);
- CHECK(size == 1);
-
- CHECK(!nvlist_exists_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
- nvlist_add_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz"));
- CHECK(nvlist_error(nvl) == 0);
- CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", NULL), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
- CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", &size), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
- CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
-
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
- CHECK(nvlist_error(nvl) == 0);
- cnvl = nvlist_get_nvlist(nvl, "nvlist/nvlist");
- CHECK(nvlist_get_bool(cnvl, "nvlist/bool/true") == true);
- CHECK(nvlist_get_bool(cnvl, "nvlist/bool/false") == false);
- CHECK(nvlist_get_number(cnvl, "nvlist/number/0") == 0);
- CHECK(nvlist_get_number(cnvl, "nvlist/number/1") == 1);
- CHECK((int)nvlist_get_number(cnvl, "nvlist/number/-1") == -1);
- CHECK(nvlist_get_number(cnvl, "nvlist/number/UINT64_MAX") == UINT64_MAX);
- CHECK((int64_t)nvlist_get_number(cnvl, "nvlist/number/INT64_MIN") == INT64_MIN);
- CHECK((int64_t)nvlist_get_number(cnvl, "nvlist/number/INT64_MAX") == INT64_MAX);
- CHECK(strcmp(nvlist_get_string(cnvl, "nvlist/string/"), "") == 0);
- CHECK(strcmp(nvlist_get_string(cnvl, "nvlist/string/x"), "x") == 0);
- CHECK(strcmp(nvlist_get_string(cnvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnopqrstuvwxyz") == 0);
- /* TODO */
- CHECK(memcmp(nvlist_get_binary(cnvl, "nvlist/binary/x", NULL), "x", 1) == 0);
- CHECK(memcmp(nvlist_get_binary(cnvl, "nvlist/binary/x", &size), "x", 1) == 0);
- CHECK(size == 1);
- CHECK(memcmp(nvlist_get_binary(cnvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", NULL), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
- CHECK(memcmp(nvlist_get_binary(cnvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", &size), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
- CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
-
- CHECK(nvlist_get_bool(nvl, "nvlist/bool/true") == true);
- CHECK(nvlist_get_bool(nvl, "nvlist/bool/false") == false);
- CHECK(nvlist_get_number(nvl, "nvlist/number/0") == 0);
- CHECK(nvlist_get_number(nvl, "nvlist/number/1") == 1);
- CHECK((int)nvlist_get_number(nvl, "nvlist/number/-1") == -1);
- CHECK(nvlist_get_number(nvl, "nvlist/number/UINT64_MAX") == UINT64_MAX);
- CHECK((int64_t)nvlist_get_number(nvl, "nvlist/number/INT64_MIN") == INT64_MIN);
- CHECK((int64_t)nvlist_get_number(nvl, "nvlist/number/INT64_MAX") == INT64_MAX);
- CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/"), "") == 0);
- CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/x"), "x") == 0);
- CHECK(strcmp(nvlist_get_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnopqrstuvwxyz") == 0);
- CHECK(fd_is_valid(nvlist_get_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO")));
- CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/x", NULL), "x", 1) == 0);
- CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/x", &size), "x", 1) == 0);
- CHECK(size == 1);
- CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", NULL), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
- CHECK(memcmp(nvlist_get_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", &size), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
- CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
-
- nvlist_destroy(nvl);
-
- return (0);
-}
diff --git a/external/libnv/tests/nvlist_move_test.c b/external/libnv/tests/nvlist_move_test.c
deleted file mode 100644
index e6208585..00000000
--- a/external/libnv/tests/nvlist_move_test.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/*-
- * Copyright (c) 2013 The FreeBSD Foundation
- * All rights reserved.
- *
- * This software was developed by Pawel Jakub Dawidek under sponsorship from
- * the FreeBSD Foundation.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD: head/lib/libnv/tests/nvlist_move_test.c 269603 2014-08-05 18:41:27Z ngie $
- */
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <nv.h>
-
-static int ntest = 1;
-
-#define CHECK(expr) do { \
- if ((expr)) \
- printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__); \
- else \
- printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
- ntest++; \
-} while (0)
-
-int
-main(void)
-{
- const nvlist_t *cnvl;
- nvlist_t *nvl;
- void *ptr;
- size_t size;
- int fd;
-
- printf("1..52\n");
-
- nvl = nvlist_create(0);
-
- CHECK(!nvlist_exists_string(nvl, "nvlist/string/"));
- ptr = strdup("");
- CHECK(ptr != NULL);
- nvlist_move_string(nvl, "nvlist/string/", ptr);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_string(nvl, "nvlist/string/"));
- CHECK(ptr == nvlist_get_string(nvl, "nvlist/string/"));
-
- CHECK(!nvlist_exists_string(nvl, "nvlist/string/x"));
- ptr = strdup("x");
- CHECK(ptr != NULL);
- nvlist_move_string(nvl, "nvlist/string/x", ptr);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_string(nvl, "nvlist/string/x"));
- CHECK(ptr == nvlist_get_string(nvl, "nvlist/string/x"));
-
- CHECK(!nvlist_exists_string(nvl,
- "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
- ptr = strdup("abcdefghijklmnopqrstuvwxyz");
- CHECK(ptr != NULL);
- nvlist_move_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz",
- ptr);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_string(nvl,
- "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
- CHECK(ptr ==
- nvlist_get_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
-
- CHECK(!nvlist_exists_descriptor(nvl,
- "nvlist/descriptor/STDERR_FILENO"));
- fd = dup(STDERR_FILENO);
- CHECK(fd >= 0);
- nvlist_move_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO", fd);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
- CHECK(fd ==
- nvlist_get_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
-
- CHECK(!nvlist_exists_binary(nvl, "nvlist/binary/x"));
- ptr = malloc(1);
- CHECK(ptr != NULL);
- memcpy(ptr, "x", 1);
- nvlist_move_binary(nvl, "nvlist/binary/x", ptr, 1);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary/x"));
- CHECK(ptr == nvlist_get_binary(nvl, "nvlist/binary/x", NULL));
- CHECK(ptr == nvlist_get_binary(nvl, "nvlist/binary/x", &size));
- CHECK(size == 1);
-
- CHECK(!nvlist_exists_binary(nvl,
- "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
- ptr = malloc(sizeof("abcdefghijklmnopqrstuvwxyz"));
- CHECK(ptr != NULL);
- memcpy(ptr, "abcdefghijklmnopqrstuvwxyz",
- sizeof("abcdefghijklmnopqrstuvwxyz"));
- nvlist_move_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz",
- ptr, sizeof("abcdefghijklmnopqrstuvwxyz"));
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_binary(nvl,
- "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
- CHECK(ptr == nvlist_get_binary(nvl,
- "nvlist/binary/abcdefghijklmnopqrstuvwxyz", NULL));
- CHECK(ptr == nvlist_get_binary(nvl,
- "nvlist/binary/abcdefghijklmnopqrstuvwxyz", &size));
- CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
-
- CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- ptr = nvlist_clone(nvl);
- CHECK(ptr != NULL);
- nvlist_move_nvlist(nvl, "nvlist/nvlist", ptr);
- CHECK(nvlist_error(nvl) == 0);
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
- CHECK(ptr == nvlist_get_nvlist(nvl, "nvlist/nvlist"));
-
- CHECK(nvlist_exists_string(nvl, "nvlist/string/"));
- CHECK(nvlist_exists_string(nvl, "nvlist/string/x"));
- CHECK(nvlist_exists_string(nvl,
- "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
- CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO"));
- CHECK(nvlist_exists_binary(nvl, "nvlist/binary/x"));
- CHECK(nvlist_exists_binary(nvl,
- "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
- CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist"));
-
- cnvl = nvlist_get_nvlist(nvl, "nvlist/nvlist");
- CHECK(nvlist_exists_string(cnvl, "nvlist/string/"));
- CHECK(nvlist_exists_string(cnvl, "nvlist/string/x"));
- CHECK(nvlist_exists_string(cnvl,
- "nvlist/string/abcdefghijklmnopqrstuvwxyz"));
- CHECK(nvlist_exists_descriptor(cnvl,
- "nvlist/descriptor/STDERR_FILENO"));
- CHECK(nvlist_exists_binary(cnvl, "nvlist/binary/x"));
- CHECK(nvlist_exists_binary(cnvl,
- "nvlist/binary/abcdefghijklmnopqrstuvwxyz"));
-
- nvlist_destroy(nvl);
-
- return (0);
-}
diff --git a/external/libnv/tests/nvlist_send_recv_test.c b/external/libnv/tests/nvlist_send_recv_test.c
deleted file mode 100644
index b6a9f75c..00000000
--- a/external/libnv/tests/nvlist_send_recv_test.c
+++ /dev/null
@@ -1,342 +0,0 @@
-/*-
- * Copyright (c) 2013 The FreeBSD Foundation
- * All rights reserved.
- *
- * This software was developed by Pawel Jakub Dawidek under sponsorship from
- * the FreeBSD Foundation.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD: head/lib/libnv/tests/nvlist_send_recv_test.c 279432 2015-03-01 00:22:09Z rstone $
- */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/wait.h>
-
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <nv.h>
-
-static int ntest = 1;
-
-#define CHECK(expr) do { \
- if ((expr)) \
- printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__); \
- else \
- printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
- ntest++; \
-} while (0)
-
-#define fd_is_valid(fd) (fcntl((fd), F_GETFL) != -1 || errno != EBADF)
-
-static void
-child(int sock)
-{
- nvlist_t *nvl;
- nvlist_t *empty;
-
- nvl = nvlist_create(0);
- empty = nvlist_create(0);
-
- nvlist_add_bool(nvl, "nvlist/bool/true", true);
- nvlist_add_bool(nvl, "nvlist/bool/false", false);
- nvlist_add_number(nvl, "nvlist/number/0", 0);
- nvlist_add_number(nvl, "nvlist/number/1", 1);
- nvlist_add_number(nvl, "nvlist/number/-1", -1);
- nvlist_add_number(nvl, "nvlist/number/UINT64_MAX", UINT64_MAX);
- nvlist_add_number(nvl, "nvlist/number/INT64_MIN", INT64_MIN);
- nvlist_add_number(nvl, "nvlist/number/INT64_MAX", INT64_MAX);
- nvlist_add_string(nvl, "nvlist/string/", "");
- nvlist_add_string(nvl, "nvlist/string/x", "x");
- nvlist_add_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz");
- nvlist_add_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO", STDERR_FILENO);
- nvlist_add_binary(nvl, "nvlist/binary/x", "x", 1);
- nvlist_add_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz"));
- nvlist_move_nvlist(nvl, "nvlist/nvlist/empty", empty);
- nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
-
- nvlist_send(sock, nvl);
-
- nvlist_destroy(nvl);
-}
-
-static void
-parent(int sock)
-{
- nvlist_t *nvl;
- const nvlist_t *cnvl, *empty;
- const char *name, *cname;
- void *cookie, *ccookie;
- int type, ctype;
- size_t size;
-
- nvl = nvlist_recv(sock);
- CHECK(nvlist_error(nvl) == 0);
- if (nvlist_error(nvl) != 0)
- err(1, "nvlist_recv() failed");
-
- cookie = NULL;
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_BOOL);
- CHECK(strcmp(name, "nvlist/bool/true") == 0);
- CHECK(nvlist_get_bool(nvl, name) == true);
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_BOOL);
- CHECK(strcmp(name, "nvlist/bool/false") == 0);
- CHECK(nvlist_get_bool(nvl, name) == false);
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_NUMBER);
- CHECK(strcmp(name, "nvlist/number/0") == 0);
- CHECK(nvlist_get_number(nvl, name) == 0);
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_NUMBER);
- CHECK(strcmp(name, "nvlist/number/1") == 0);
- CHECK(nvlist_get_number(nvl, name) == 1);
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_NUMBER);
- CHECK(strcmp(name, "nvlist/number/-1") == 0);
- CHECK((int)nvlist_get_number(nvl, name) == -1);
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_NUMBER);
- CHECK(strcmp(name, "nvlist/number/UINT64_MAX") == 0);
- CHECK(nvlist_get_number(nvl, name) == UINT64_MAX);
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_NUMBER);
- CHECK(strcmp(name, "nvlist/number/INT64_MIN") == 0);
- CHECK((int64_t)nvlist_get_number(nvl, name) == INT64_MIN);
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_NUMBER);
- CHECK(strcmp(name, "nvlist/number/INT64_MAX") == 0);
- CHECK((int64_t)nvlist_get_number(nvl, name) == INT64_MAX);
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_STRING);
- CHECK(strcmp(name, "nvlist/string/") == 0);
- CHECK(strcmp(nvlist_get_string(nvl, name), "") == 0);
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_STRING);
- CHECK(strcmp(name, "nvlist/string/x") == 0);
- CHECK(strcmp(nvlist_get_string(nvl, name), "x") == 0);
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_STRING);
- CHECK(strcmp(name, "nvlist/string/abcdefghijklmnopqrstuvwxyz") == 0);
- CHECK(strcmp(nvlist_get_string(nvl, name), "abcdefghijklmnopqrstuvwxyz") == 0);
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_DESCRIPTOR);
- CHECK(strcmp(name, "nvlist/descriptor/STDERR_FILENO") == 0);
- CHECK(fd_is_valid(nvlist_get_descriptor(nvl, name)));
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_BINARY);
- CHECK(strcmp(name, "nvlist/binary/x") == 0);
- CHECK(memcmp(nvlist_get_binary(nvl, name, NULL), "x", 1) == 0);
- CHECK(memcmp(nvlist_get_binary(nvl, name, &size), "x", 1) == 0);
- CHECK(size == 1);
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_BINARY);
- CHECK(strcmp(name, "nvlist/binary/abcdefghijklmnopqrstuvwxyz") == 0);
- CHECK(memcmp(nvlist_get_binary(nvl, name, NULL), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
- CHECK(memcmp(nvlist_get_binary(nvl, name, &size), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
- CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_NVLIST);
- CHECK(strcmp(name, "nvlist/nvlist/empty") == 0);
- cnvl = nvlist_get_nvlist(nvl, name);
- CHECK(nvlist_empty(cnvl));
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name != NULL);
- CHECK(type == NV_TYPE_NVLIST);
- CHECK(strcmp(name, "nvlist/nvlist") == 0);
- cnvl = nvlist_get_nvlist(nvl, name);
-
- ccookie = NULL;
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_BOOL);
- CHECK(strcmp(cname, "nvlist/bool/true") == 0);
- CHECK(nvlist_get_bool(cnvl, cname) == true);
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_BOOL);
- CHECK(strcmp(cname, "nvlist/bool/false") == 0);
- CHECK(nvlist_get_bool(cnvl, cname) == false);
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_NUMBER);
- CHECK(strcmp(cname, "nvlist/number/0") == 0);
- CHECK(nvlist_get_number(cnvl, cname) == 0);
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_NUMBER);
- CHECK(strcmp(cname, "nvlist/number/1") == 0);
- CHECK(nvlist_get_number(cnvl, cname) == 1);
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_NUMBER);
- CHECK(strcmp(cname, "nvlist/number/-1") == 0);
- CHECK((int)nvlist_get_number(cnvl, cname) == -1);
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_NUMBER);
- CHECK(strcmp(cname, "nvlist/number/UINT64_MAX") == 0);
- CHECK(nvlist_get_number(cnvl, cname) == UINT64_MAX);
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_NUMBER);
- CHECK(strcmp(cname, "nvlist/number/INT64_MIN") == 0);
- CHECK((int64_t)nvlist_get_number(cnvl, cname) == INT64_MIN);
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_NUMBER);
- CHECK(strcmp(cname, "nvlist/number/INT64_MAX") == 0);
- CHECK((int64_t)nvlist_get_number(cnvl, cname) == INT64_MAX);
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_STRING);
- CHECK(strcmp(cname, "nvlist/string/") == 0);
- CHECK(strcmp(nvlist_get_string(cnvl, cname), "") == 0);
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_STRING);
- CHECK(strcmp(cname, "nvlist/string/x") == 0);
- CHECK(strcmp(nvlist_get_string(cnvl, cname), "x") == 0);
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_STRING);
- CHECK(strcmp(cname, "nvlist/string/abcdefghijklmnopqrstuvwxyz") == 0);
- CHECK(strcmp(nvlist_get_string(cnvl, cname), "abcdefghijklmnopqrstuvwxyz") == 0);
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_DESCRIPTOR);
- CHECK(strcmp(cname, "nvlist/descriptor/STDERR_FILENO") == 0);
- CHECK(fd_is_valid(nvlist_get_descriptor(cnvl, cname)));
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_BINARY);
- CHECK(strcmp(cname, "nvlist/binary/x") == 0);
- CHECK(memcmp(nvlist_get_binary(cnvl, cname, NULL), "x", 1) == 0);
- CHECK(memcmp(nvlist_get_binary(cnvl, cname, &size), "x", 1) == 0);
- CHECK(size == 1);
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_BINARY);
- CHECK(strcmp(cname, "nvlist/binary/abcdefghijklmnopqrstuvwxyz") == 0);
- CHECK(memcmp(nvlist_get_binary(cnvl, cname, NULL), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
- CHECK(memcmp(nvlist_get_binary(cnvl, cname, &size), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
- CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname != NULL);
- CHECK(ctype == NV_TYPE_NVLIST);
- CHECK(strcmp(cname, "nvlist/nvlist/empty") == 0);
- empty = nvlist_get_nvlist(cnvl, cname);
- CHECK(nvlist_empty(empty));
-
- cname = nvlist_next(cnvl, &ctype, &ccookie);
- CHECK(cname == NULL);
-
- name = nvlist_next(nvl, &type, &cookie);
- CHECK(name == NULL);
-}
-
-int
-main(void)
-{
- int status, socks[2];
- pid_t pid;
-
- printf("1..134\n");
- fflush(stdout);
-
- if (socketpair(PF_UNIX, SOCK_STREAM, 0, socks) < 0)
- err(1, "socketpair() failed");
- pid = fork();
- switch (pid) {
- case -1:
- /* Failure. */
- err(1, "unable to fork");
- case 0:
- /* Child. */
- close(socks[0]);
- child(socks[1]);
- return (0);
- default:
- /* Parent. */
- close(socks[1]);
- parent(socks[0]);
- break;
- }
-
- if (waitpid(pid, &status, 0) < 0)
- err(1, "waitpid() failed");
-
- return (0);
-}