1258065Spjd/*-
2258065Spjd * Copyright (c) 2013 The FreeBSD Foundation
3258065Spjd * All rights reserved.
4258065Spjd *
5258065Spjd * This software was developed by Pawel Jakub Dawidek under sponsorship from
6258065Spjd * the FreeBSD Foundation.
7258065Spjd *
8258065Spjd * Redistribution and use in source and binary forms, with or without
9258065Spjd * modification, are permitted provided that the following conditions
10258065Spjd * are met:
11258065Spjd * 1. Redistributions of source code must retain the above copyright
12258065Spjd *    notice, this list of conditions and the following disclaimer.
13258065Spjd * 2. Redistributions in binary form must reproduce the above copyright
14258065Spjd *    notice, this list of conditions and the following disclaimer in the
15258065Spjd *    documentation and/or other materials provided with the distribution.
16258065Spjd *
17258065Spjd * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
18258065Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19258065Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20258065Spjd * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
21258065Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22258065Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23258065Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24258065Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25258065Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26258065Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27258065Spjd * SUCH DAMAGE.
28258065Spjd *
29258065Spjd * $FreeBSD$
30258065Spjd */
31258065Spjd
32258065Spjd#ifndef	_NV_IMPL_H_
33258065Spjd#define	_NV_IMPL_H_
34258065Spjd
35258065Spjd#ifndef	_NVPAIR_T_DECLARED
36258065Spjd#define	_NVPAIR_T_DECLARED
37258065Spjdstruct nvpair;
38258065Spjd
39258065Spjdtypedef struct nvpair nvpair_t;
40258065Spjd#endif
41258065Spjd
42271579Spjd#define	NV_TYPE_NVLIST_UP		255
43271579Spjd
44258065Spjd#define	NV_TYPE_FIRST		NV_TYPE_NULL
45258065Spjd#define	NV_TYPE_LAST		NV_TYPE_BINARY
46258065Spjd
47258065Spjd#define	NV_FLAG_BIG_ENDIAN		0x80
48258065Spjd
49279438Srstone#ifdef _KERNEL
50279438Srstone#define	nv_malloc(size)			malloc((size), M_NVLIST, M_NOWAIT)
51279438Srstone#define	nv_calloc(n, size)		malloc((n) * (size), M_NVLIST, \
52279438Srstone					    M_NOWAIT | M_ZERO)
53279438Srstone#define	nv_realloc(buf, size)		realloc((buf), (size), M_NVLIST, \
54279438Srstone					    M_NOWAIT)
55279438Srstone#define	nv_free(buf)			free((buf), M_NVLIST)
56279438Srstone#define	nv_strdup(buf)			strdup((buf), M_NVLIST)
57279438Srstone#define	nv_vasprintf(ptr, ...)		vasprintf(ptr, M_NVLIST, __VA_ARGS__)
58279438Srstone
59279438Srstone#define	SAVE_ERRNO(var)			((void)(var))
60279438Srstone#define	RESTORE_ERRNO(var)		((void)(var))
61279438Srstone
62279438Srstone#define	ERRNO_OR_DEFAULT(default)	(default)
63279438Srstone
64279438Srstone#else
65279438Srstone
66279438Srstone#define	nv_malloc(size)			malloc((size))
67279438Srstone#define	nv_calloc(n, size)		calloc((n), (size))
68279438Srstone#define	nv_realloc(buf, size)		realloc((buf), (size))
69279438Srstone#define	nv_free(buf)			free((buf))
70279438Srstone#define	nv_strdup(buf)			strdup((buf))
71279438Srstone#define	nv_vasprintf(ptr, ...)		vasprintf(ptr, __VA_ARGS__)
72279438Srstone
73279438Srstone#define	SAVE_ERRNO(var) 		(var) = errno
74279438Srstone#define	RESTORE_ERRNO(var) 		errno = (var)
75279438Srstone
76279438Srstone#define	ERRNO_OR_DEFAULT(default)	(errno == 0 ? (default) : errno)
77279438Srstone
78279438Srstone#endif
79279438Srstone
80258065Spjdint	*nvlist_descriptors(const nvlist_t *nvl, size_t *nitemsp);
81258065Spjdsize_t	 nvlist_ndescriptors(const nvlist_t *nvl);
82258065Spjd
83258065Spjdnvpair_t *nvlist_first_nvpair(const nvlist_t *nvl);
84258065Spjdnvpair_t *nvlist_next_nvpair(const nvlist_t *nvl, const nvpair_t *nvp);
85258065Spjdnvpair_t *nvlist_prev_nvpair(const nvlist_t *nvl, const nvpair_t *nvp);
86258065Spjd
87258065Spjdvoid nvlist_add_nvpair(nvlist_t *nvl, const nvpair_t *nvp);
88258065Spjd
89258065Spjdvoid nvlist_move_nvpair(nvlist_t *nvl, nvpair_t *nvp);
90258065Spjd
91271579Spjdvoid nvlist_set_parent(nvlist_t *nvl, nvpair_t *parent);
92271579Spjd
93258065Spjdconst nvpair_t *nvlist_get_nvpair(const nvlist_t *nvl, const char *name);
94258065Spjd
95258065Spjdnvpair_t *nvlist_take_nvpair(nvlist_t *nvl, const char *name);
96258065Spjd
97258065Spjd/* Function removes the given nvpair from the nvlist. */
98258065Spjdvoid nvlist_remove_nvpair(nvlist_t *nvl, nvpair_t *nvp);
99258065Spjd
100258065Spjdvoid nvlist_free_nvpair(nvlist_t *nvl, nvpair_t *nvp);
101258065Spjd
102258065Spjdint nvpair_type(const nvpair_t *nvp);
103258065Spjdconst char *nvpair_name(const nvpair_t *nvp);
104258065Spjd
105258065Spjdnvpair_t *nvpair_clone(const nvpair_t *nvp);
106258065Spjd
107258065Spjdnvpair_t *nvpair_create_null(const char *name);
108258065Spjdnvpair_t *nvpair_create_bool(const char *name, bool value);
109258065Spjdnvpair_t *nvpair_create_number(const char *name, uint64_t value);
110258065Spjdnvpair_t *nvpair_create_string(const char *name, const char *value);
111258065Spjdnvpair_t *nvpair_create_stringf(const char *name, const char *valuefmt, ...) __printflike(2, 3);
112258065Spjdnvpair_t *nvpair_create_stringv(const char *name, const char *valuefmt, va_list valueap) __printflike(2, 0);
113258065Spjdnvpair_t *nvpair_create_nvlist(const char *name, const nvlist_t *value);
114258065Spjdnvpair_t *nvpair_create_descriptor(const char *name, int value);
115258065Spjdnvpair_t *nvpair_create_binary(const char *name, const void *value, size_t size);
116258065Spjd
117258065Spjdnvpair_t *nvpair_move_string(const char *name, char *value);
118258065Spjdnvpair_t *nvpair_move_nvlist(const char *name, nvlist_t *value);
119258065Spjdnvpair_t *nvpair_move_descriptor(const char *name, int value);
120258065Spjdnvpair_t *nvpair_move_binary(const char *name, void *value, size_t size);
121258065Spjd
122258065Spjdbool		 nvpair_get_bool(const nvpair_t *nvp);
123258065Spjduint64_t	 nvpair_get_number(const nvpair_t *nvp);
124258065Spjdconst char	*nvpair_get_string(const nvpair_t *nvp);
125258065Spjdconst nvlist_t	*nvpair_get_nvlist(const nvpair_t *nvp);
126258065Spjdint		 nvpair_get_descriptor(const nvpair_t *nvp);
127258065Spjdconst void	*nvpair_get_binary(const nvpair_t *nvp, size_t *sizep);
128258065Spjd
129258065Spjdvoid nvpair_free(nvpair_t *nvp);
130258065Spjd
131258065Spjd#endif	/* !_NV_IMPL_H_ */
132