4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright (c) 2012, 2018 by Delphix. All rights reserved.
26 #include <sys/nvpair.h>
28 #include <sys/debug.h>
29 #include <sys/param.h>
35 * "Force" nvlist wrapper.
37 * These functions wrap the nvlist_* functions with assertions that assume
38 * the operation is successful. This allows the caller's code to be much
39 * more readable, especially for the fnvlist_lookup_* and fnvpair_value_*
40 * functions, which can return the requested value (rather than filling in
43 * These functions use NV_UNIQUE_NAME, encoding NV_ENCODE_NATIVE, and allocate
46 * More wrappers should be added as needed -- for example
47 * nvlist_lookup_*_array and nvpair_value_*_array.
54 VERIFY0(nvlist_alloc(&nvl
, NV_UNIQUE_NAME
, KM_SLEEP
));
59 fnvlist_free(nvlist_t
*nvl
)
65 fnvlist_size(nvlist_t
*nvl
)
68 VERIFY0(nvlist_size(nvl
, &size
, NV_ENCODE_NATIVE
));
73 * Returns allocated buffer of size *sizep. Caller must free the buffer with
74 * fnvlist_pack_free().
77 fnvlist_pack(nvlist_t
*nvl
, size_t *sizep
)
80 VERIFY3U(nvlist_pack(nvl
, &packed
, sizep
, NV_ENCODE_NATIVE
,
87 fnvlist_pack_free(char *pack
, size_t size
)
90 kmem_free(pack
, size
);
97 fnvlist_unpack(char *buf
, size_t buflen
)
100 VERIFY0(nvlist_unpack(buf
, buflen
, &rv
, KM_SLEEP
));
105 fnvlist_dup(nvlist_t
*nvl
)
108 VERIFY0(nvlist_dup(nvl
, &rv
, KM_SLEEP
));
113 fnvlist_merge(nvlist_t
*dst
, nvlist_t
*src
)
115 VERIFY0(nvlist_merge(dst
, src
, KM_SLEEP
));
119 fnvlist_num_pairs(nvlist_t
*nvl
)
124 for (pair
= nvlist_next_nvpair(nvl
, 0); pair
!= NULL
;
125 pair
= nvlist_next_nvpair(nvl
, pair
))
131 fnvlist_add_boolean(nvlist_t
*nvl
, const char *name
)
133 VERIFY0(nvlist_add_boolean(nvl
, name
));
137 fnvlist_add_boolean_value(nvlist_t
*nvl
, const char *name
, boolean_t val
)
139 VERIFY0(nvlist_add_boolean_value(nvl
, name
, val
));
143 fnvlist_add_byte(nvlist_t
*nvl
, const char *name
, uchar_t val
)
145 VERIFY0(nvlist_add_byte(nvl
, name
, val
));
149 fnvlist_add_int8(nvlist_t
*nvl
, const char *name
, int8_t val
)
151 VERIFY0(nvlist_add_int8(nvl
, name
, val
));
155 fnvlist_add_uint8(nvlist_t
*nvl
, const char *name
, uint8_t val
)
157 VERIFY0(nvlist_add_uint8(nvl
, name
, val
));
161 fnvlist_add_int16(nvlist_t
*nvl
, const char *name
, int16_t val
)
163 VERIFY0(nvlist_add_int16(nvl
, name
, val
));
167 fnvlist_add_uint16(nvlist_t
*nvl
, const char *name
, uint16_t val
)
169 VERIFY0(nvlist_add_uint16(nvl
, name
, val
));
173 fnvlist_add_int32(nvlist_t
*nvl
, const char *name
, int32_t val
)
175 VERIFY0(nvlist_add_int32(nvl
, name
, val
));
179 fnvlist_add_uint32(nvlist_t
*nvl
, const char *name
, uint32_t val
)
181 VERIFY0(nvlist_add_uint32(nvl
, name
, val
));
185 fnvlist_add_int64(nvlist_t
*nvl
, const char *name
, int64_t val
)
187 VERIFY0(nvlist_add_int64(nvl
, name
, val
));
191 fnvlist_add_uint64(nvlist_t
*nvl
, const char *name
, uint64_t val
)
193 VERIFY0(nvlist_add_uint64(nvl
, name
, val
));
197 fnvlist_add_string(nvlist_t
*nvl
, const char *name
, const char *val
)
199 VERIFY0(nvlist_add_string(nvl
, name
, val
));
203 fnvlist_add_nvlist(nvlist_t
*nvl
, const char *name
, nvlist_t
*val
)
205 VERIFY0(nvlist_add_nvlist(nvl
, name
, val
));
209 fnvlist_add_nvpair(nvlist_t
*nvl
, nvpair_t
*pair
)
211 VERIFY0(nvlist_add_nvpair(nvl
, pair
));
215 fnvlist_add_boolean_array(nvlist_t
*nvl
, const char *name
,
216 boolean_t
*val
, uint_t n
)
218 VERIFY0(nvlist_add_boolean_array(nvl
, name
, val
, n
));
222 fnvlist_add_byte_array(nvlist_t
*nvl
, const char *name
, uchar_t
*val
, uint_t n
)
224 VERIFY0(nvlist_add_byte_array(nvl
, name
, val
, n
));
228 fnvlist_add_int8_array(nvlist_t
*nvl
, const char *name
, int8_t *val
, uint_t n
)
230 VERIFY0(nvlist_add_int8_array(nvl
, name
, val
, n
));
234 fnvlist_add_uint8_array(nvlist_t
*nvl
, const char *name
, uint8_t *val
, uint_t n
)
236 VERIFY0(nvlist_add_uint8_array(nvl
, name
, val
, n
));
240 fnvlist_add_int16_array(nvlist_t
*nvl
, const char *name
, int16_t *val
, uint_t n
)
242 VERIFY0(nvlist_add_int16_array(nvl
, name
, val
, n
));
246 fnvlist_add_uint16_array(nvlist_t
*nvl
, const char *name
,
247 uint16_t *val
, uint_t n
)
249 VERIFY0(nvlist_add_uint16_array(nvl
, name
, val
, n
));
253 fnvlist_add_int32_array(nvlist_t
*nvl
, const char *name
, int32_t *val
, uint_t n
)
255 VERIFY0(nvlist_add_int32_array(nvl
, name
, val
, n
));
259 fnvlist_add_uint32_array(nvlist_t
*nvl
, const char *name
,
260 uint32_t *val
, uint_t n
)
262 VERIFY0(nvlist_add_uint32_array(nvl
, name
, val
, n
));
266 fnvlist_add_int64_array(nvlist_t
*nvl
, const char *name
, int64_t *val
, uint_t n
)
268 VERIFY0(nvlist_add_int64_array(nvl
, name
, val
, n
));
272 fnvlist_add_uint64_array(nvlist_t
*nvl
, const char *name
,
273 uint64_t *val
, uint_t n
)
275 VERIFY0(nvlist_add_uint64_array(nvl
, name
, val
, n
));
279 fnvlist_add_string_array(nvlist_t
*nvl
, const char *name
,
280 char * const *val
, uint_t n
)
282 VERIFY0(nvlist_add_string_array(nvl
, name
, val
, n
));
286 fnvlist_add_nvlist_array(nvlist_t
*nvl
, const char *name
,
287 nvlist_t
**val
, uint_t n
)
289 VERIFY0(nvlist_add_nvlist_array(nvl
, name
, val
, n
));
293 fnvlist_remove(nvlist_t
*nvl
, const char *name
)
295 VERIFY0(nvlist_remove_all(nvl
, name
));
299 fnvlist_remove_nvpair(nvlist_t
*nvl
, nvpair_t
*pair
)
301 VERIFY0(nvlist_remove_nvpair(nvl
, pair
));
305 fnvlist_lookup_nvpair(nvlist_t
*nvl
, const char *name
)
308 VERIFY0(nvlist_lookup_nvpair(nvl
, name
, &rv
));
312 /* returns B_TRUE if the entry exists */
314 fnvlist_lookup_boolean(nvlist_t
*nvl
, const char *name
)
316 return (nvlist_lookup_boolean(nvl
, name
) == 0);
320 fnvlist_lookup_boolean_value(nvlist_t
*nvl
, const char *name
)
323 VERIFY0(nvlist_lookup_boolean_value(nvl
, name
, &rv
));
328 fnvlist_lookup_byte(nvlist_t
*nvl
, const char *name
)
331 VERIFY0(nvlist_lookup_byte(nvl
, name
, &rv
));
336 fnvlist_lookup_int8(nvlist_t
*nvl
, const char *name
)
339 VERIFY0(nvlist_lookup_int8(nvl
, name
, &rv
));
344 fnvlist_lookup_int16(nvlist_t
*nvl
, const char *name
)
347 VERIFY0(nvlist_lookup_int16(nvl
, name
, &rv
));
352 fnvlist_lookup_int32(nvlist_t
*nvl
, const char *name
)
355 VERIFY0(nvlist_lookup_int32(nvl
, name
, &rv
));
360 fnvlist_lookup_int64(nvlist_t
*nvl
, const char *name
)
363 VERIFY0(nvlist_lookup_int64(nvl
, name
, &rv
));
368 fnvlist_lookup_uint8(nvlist_t
*nvl
, const char *name
)
371 VERIFY0(nvlist_lookup_uint8(nvl
, name
, &rv
));
376 fnvlist_lookup_uint16(nvlist_t
*nvl
, const char *name
)
379 VERIFY0(nvlist_lookup_uint16(nvl
, name
, &rv
));
384 fnvlist_lookup_uint32(nvlist_t
*nvl
, const char *name
)
387 VERIFY0(nvlist_lookup_uint32(nvl
, name
, &rv
));
392 fnvlist_lookup_uint64(nvlist_t
*nvl
, const char *name
)
395 VERIFY0(nvlist_lookup_uint64(nvl
, name
, &rv
));
400 fnvlist_lookup_string(nvlist_t
*nvl
, const char *name
)
403 VERIFY0(nvlist_lookup_string(nvl
, name
, &rv
));
408 fnvlist_lookup_nvlist(nvlist_t
*nvl
, const char *name
)
411 VERIFY0(nvlist_lookup_nvlist(nvl
, name
, &rv
));
415 fnvlist_lookup_boolean_array(nvlist_t
*nvl
, const char *name
, uint_t
*n
)
418 VERIFY0(nvlist_lookup_boolean_array(nvl
, name
, &rv
, n
));
423 fnvlist_lookup_byte_array(nvlist_t
*nvl
, const char *name
, uint_t
*n
)
426 VERIFY0(nvlist_lookup_byte_array(nvl
, name
, &rv
, n
));
431 fnvlist_lookup_int8_array(nvlist_t
*nvl
, const char *name
, uint_t
*n
)
434 VERIFY0(nvlist_lookup_int8_array(nvl
, name
, &rv
, n
));
439 fnvlist_lookup_uint8_array(nvlist_t
*nvl
, const char *name
, uint_t
*n
)
442 VERIFY0(nvlist_lookup_uint8_array(nvl
, name
, &rv
, n
));
447 fnvlist_lookup_int16_array(nvlist_t
*nvl
, const char *name
, uint_t
*n
)
450 VERIFY0(nvlist_lookup_int16_array(nvl
, name
, &rv
, n
));
455 fnvlist_lookup_uint16_array(nvlist_t
*nvl
, const char *name
, uint_t
*n
)
458 VERIFY0(nvlist_lookup_uint16_array(nvl
, name
, &rv
, n
));
463 fnvlist_lookup_int32_array(nvlist_t
*nvl
, const char *name
, uint_t
*n
)
466 VERIFY0(nvlist_lookup_int32_array(nvl
, name
, &rv
, n
));
471 fnvlist_lookup_uint32_array(nvlist_t
*nvl
, const char *name
, uint_t
*n
)
474 VERIFY0(nvlist_lookup_uint32_array(nvl
, name
, &rv
, n
));
479 fnvlist_lookup_int64_array(nvlist_t
*nvl
, const char *name
, uint_t
*n
)
482 VERIFY0(nvlist_lookup_int64_array(nvl
, name
, &rv
, n
));
487 fnvlist_lookup_uint64_array(nvlist_t
*nvl
, const char *name
, uint_t
*n
)
490 VERIFY0(nvlist_lookup_uint64_array(nvl
, name
, &rv
, n
));
495 fnvpair_value_boolean_value(nvpair_t
*nvp
)
498 VERIFY0(nvpair_value_boolean_value(nvp
, &rv
));
503 fnvpair_value_byte(nvpair_t
*nvp
)
506 VERIFY0(nvpair_value_byte(nvp
, &rv
));
511 fnvpair_value_int8(nvpair_t
*nvp
)
514 VERIFY0(nvpair_value_int8(nvp
, &rv
));
519 fnvpair_value_int16(nvpair_t
*nvp
)
522 VERIFY0(nvpair_value_int16(nvp
, &rv
));
527 fnvpair_value_int32(nvpair_t
*nvp
)
530 VERIFY0(nvpair_value_int32(nvp
, &rv
));
535 fnvpair_value_int64(nvpair_t
*nvp
)
538 VERIFY0(nvpair_value_int64(nvp
, &rv
));
543 fnvpair_value_uint8(nvpair_t
*nvp
)
546 VERIFY0(nvpair_value_uint8(nvp
, &rv
));
551 fnvpair_value_uint16(nvpair_t
*nvp
)
554 VERIFY0(nvpair_value_uint16(nvp
, &rv
));
559 fnvpair_value_uint32(nvpair_t
*nvp
)
562 VERIFY0(nvpair_value_uint32(nvp
, &rv
));
567 fnvpair_value_uint64(nvpair_t
*nvp
)
570 VERIFY0(nvpair_value_uint64(nvp
, &rv
));
575 fnvpair_value_string(nvpair_t
*nvp
)
578 VERIFY0(nvpair_value_string(nvp
, &rv
));
583 fnvpair_value_nvlist(nvpair_t
*nvp
)
586 VERIFY0(nvpair_value_nvlist(nvp
, &rv
));
592 EXPORT_SYMBOL(fnvlist_alloc
);
593 EXPORT_SYMBOL(fnvlist_free
);
594 EXPORT_SYMBOL(fnvlist_size
);
595 EXPORT_SYMBOL(fnvlist_pack
);
596 EXPORT_SYMBOL(fnvlist_pack_free
);
597 EXPORT_SYMBOL(fnvlist_unpack
);
598 EXPORT_SYMBOL(fnvlist_dup
);
599 EXPORT_SYMBOL(fnvlist_merge
);
601 EXPORT_SYMBOL(fnvlist_add_nvpair
);
602 EXPORT_SYMBOL(fnvlist_add_boolean
);
603 EXPORT_SYMBOL(fnvlist_add_boolean_value
);
604 EXPORT_SYMBOL(fnvlist_add_byte
);
605 EXPORT_SYMBOL(fnvlist_add_int8
);
606 EXPORT_SYMBOL(fnvlist_add_uint8
);
607 EXPORT_SYMBOL(fnvlist_add_int16
);
608 EXPORT_SYMBOL(fnvlist_add_uint16
);
609 EXPORT_SYMBOL(fnvlist_add_int32
);
610 EXPORT_SYMBOL(fnvlist_add_uint32
);
611 EXPORT_SYMBOL(fnvlist_add_int64
);
612 EXPORT_SYMBOL(fnvlist_add_uint64
);
613 EXPORT_SYMBOL(fnvlist_add_string
);
614 EXPORT_SYMBOL(fnvlist_add_nvlist
);
615 EXPORT_SYMBOL(fnvlist_add_boolean_array
);
616 EXPORT_SYMBOL(fnvlist_add_byte_array
);
617 EXPORT_SYMBOL(fnvlist_add_int8_array
);
618 EXPORT_SYMBOL(fnvlist_add_uint8_array
);
619 EXPORT_SYMBOL(fnvlist_add_int16_array
);
620 EXPORT_SYMBOL(fnvlist_add_uint16_array
);
621 EXPORT_SYMBOL(fnvlist_add_int32_array
);
622 EXPORT_SYMBOL(fnvlist_add_uint32_array
);
623 EXPORT_SYMBOL(fnvlist_add_int64_array
);
624 EXPORT_SYMBOL(fnvlist_add_uint64_array
);
625 EXPORT_SYMBOL(fnvlist_add_string_array
);
626 EXPORT_SYMBOL(fnvlist_add_nvlist_array
);
628 EXPORT_SYMBOL(fnvlist_remove
);
629 EXPORT_SYMBOL(fnvlist_remove_nvpair
);
631 EXPORT_SYMBOL(fnvlist_lookup_nvpair
);
632 EXPORT_SYMBOL(fnvlist_lookup_boolean
);
633 EXPORT_SYMBOL(fnvlist_lookup_boolean_value
);
634 EXPORT_SYMBOL(fnvlist_lookup_byte
);
635 EXPORT_SYMBOL(fnvlist_lookup_int8
);
636 EXPORT_SYMBOL(fnvlist_lookup_uint8
);
637 EXPORT_SYMBOL(fnvlist_lookup_int16
);
638 EXPORT_SYMBOL(fnvlist_lookup_uint16
);
639 EXPORT_SYMBOL(fnvlist_lookup_int32
);
640 EXPORT_SYMBOL(fnvlist_lookup_uint32
);
641 EXPORT_SYMBOL(fnvlist_lookup_int64
);
642 EXPORT_SYMBOL(fnvlist_lookup_uint64
);
643 EXPORT_SYMBOL(fnvlist_lookup_string
);
644 EXPORT_SYMBOL(fnvlist_lookup_nvlist
);
646 EXPORT_SYMBOL(fnvpair_value_boolean_value
);
647 EXPORT_SYMBOL(fnvpair_value_byte
);
648 EXPORT_SYMBOL(fnvpair_value_int8
);
649 EXPORT_SYMBOL(fnvpair_value_uint8
);
650 EXPORT_SYMBOL(fnvpair_value_int16
);
651 EXPORT_SYMBOL(fnvpair_value_uint16
);
652 EXPORT_SYMBOL(fnvpair_value_int32
);
653 EXPORT_SYMBOL(fnvpair_value_uint32
);
654 EXPORT_SYMBOL(fnvpair_value_int64
);
655 EXPORT_SYMBOL(fnvpair_value_uint64
);
656 EXPORT_SYMBOL(fnvpair_value_string
);
657 EXPORT_SYMBOL(fnvpair_value_nvlist
);
658 EXPORT_SYMBOL(fnvlist_num_pairs
);