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