14d6a976eSRyan Stone /*- 29b10f59aSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause 39b10f59aSPedro F. Giffuni * 44d6a976eSRyan Stone * Copyright (c) 2009-2013 The FreeBSD Foundation 5347a39b4SMariusz Zaborski * Copyright (c) 2013-2015 Mariusz Zaborski <oshogbo@FreeBSD.org> 64d6a976eSRyan Stone * All rights reserved. 74d6a976eSRyan Stone * 84d6a976eSRyan Stone * This software was developed by Pawel Jakub Dawidek under sponsorship from 94d6a976eSRyan Stone * the FreeBSD Foundation. 104d6a976eSRyan Stone * 114d6a976eSRyan Stone * Redistribution and use in source and binary forms, with or without 124d6a976eSRyan Stone * modification, are permitted provided that the following conditions 134d6a976eSRyan Stone * are met: 144d6a976eSRyan Stone * 1. Redistributions of source code must retain the above copyright 154d6a976eSRyan Stone * notice, this list of conditions and the following disclaimer. 164d6a976eSRyan Stone * 2. Redistributions in binary form must reproduce the above copyright 174d6a976eSRyan Stone * notice, this list of conditions and the following disclaimer in the 184d6a976eSRyan Stone * documentation and/or other materials provided with the distribution. 194d6a976eSRyan Stone * 204d6a976eSRyan Stone * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 214d6a976eSRyan Stone * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 224d6a976eSRyan Stone * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 234d6a976eSRyan Stone * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 244d6a976eSRyan Stone * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 254d6a976eSRyan Stone * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 264d6a976eSRyan Stone * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 274d6a976eSRyan Stone * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 284d6a976eSRyan Stone * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 294d6a976eSRyan Stone * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 304d6a976eSRyan Stone * SUCH DAMAGE. 314d6a976eSRyan Stone */ 324d6a976eSRyan Stone 334d6a976eSRyan Stone #ifndef _NV_H_ 344d6a976eSRyan Stone #define _NV_H_ 354d6a976eSRyan Stone 364d6a976eSRyan Stone #include <sys/cdefs.h> 374d6a976eSRyan Stone 384d6a976eSRyan Stone #ifndef _KERNEL 394d6a976eSRyan Stone #include <stdarg.h> 404d6a976eSRyan Stone #include <stdbool.h> 414d6a976eSRyan Stone #include <stdint.h> 424d6a976eSRyan Stone #include <stdio.h> 43000321baSReid Linnemann #include <sys/nv_namespace.h> 444d6a976eSRyan Stone #endif 454d6a976eSRyan Stone 464d6a976eSRyan Stone #ifndef _NVLIST_T_DECLARED 474d6a976eSRyan Stone #define _NVLIST_T_DECLARED 484d6a976eSRyan Stone struct nvlist; 494d6a976eSRyan Stone 504d6a976eSRyan Stone typedef struct nvlist nvlist_t; 514d6a976eSRyan Stone #endif 524d6a976eSRyan Stone 534d6a976eSRyan Stone #define NV_NAME_MAX 2048 544d6a976eSRyan Stone 554d6a976eSRyan Stone #define NV_TYPE_NONE 0 564d6a976eSRyan Stone 574d6a976eSRyan Stone #define NV_TYPE_NULL 1 584d6a976eSRyan Stone #define NV_TYPE_BOOL 2 594d6a976eSRyan Stone #define NV_TYPE_NUMBER 3 604d6a976eSRyan Stone #define NV_TYPE_STRING 4 614d6a976eSRyan Stone #define NV_TYPE_NVLIST 5 624d6a976eSRyan Stone #define NV_TYPE_DESCRIPTOR 6 634d6a976eSRyan Stone #define NV_TYPE_BINARY 7 64347a39b4SMariusz Zaborski #define NV_TYPE_BOOL_ARRAY 8 65347a39b4SMariusz Zaborski #define NV_TYPE_NUMBER_ARRAY 9 66347a39b4SMariusz Zaborski #define NV_TYPE_STRING_ARRAY 10 67347a39b4SMariusz Zaborski #define NV_TYPE_NVLIST_ARRAY 11 68347a39b4SMariusz Zaborski #define NV_TYPE_DESCRIPTOR_ARRAY 12 694d6a976eSRyan Stone 704d6a976eSRyan Stone /* 714d6a976eSRyan Stone * Perform case-insensitive lookups of provided names. 724d6a976eSRyan Stone */ 734d6a976eSRyan Stone #define NV_FLAG_IGNORE_CASE 0x01 74169c153bSMariusz Zaborski /* 75169c153bSMariusz Zaborski * Names don't have to be unique. 76169c153bSMariusz Zaborski */ 77169c153bSMariusz Zaborski #define NV_FLAG_NO_UNIQUE 0x02 784d6a976eSRyan Stone 794d6a976eSRyan Stone #if defined(_KERNEL) && defined(MALLOC_DECLARE) 804d6a976eSRyan Stone MALLOC_DECLARE(M_NVLIST); 814d6a976eSRyan Stone #endif 824d6a976eSRyan Stone 834d6a976eSRyan Stone __BEGIN_DECLS 844d6a976eSRyan Stone 854d6a976eSRyan Stone nvlist_t *nvlist_create(int flags); 864d6a976eSRyan Stone void nvlist_destroy(nvlist_t *nvl); 874d6a976eSRyan Stone int nvlist_error(const nvlist_t *nvl); 884d6a976eSRyan Stone bool nvlist_empty(const nvlist_t *nvl); 8924f93ee7SMariusz Zaborski int nvlist_flags(const nvlist_t *nvl); 904d6a976eSRyan Stone void nvlist_set_error(nvlist_t *nvl, int error); 914d6a976eSRyan Stone 924d6a976eSRyan Stone nvlist_t *nvlist_clone(const nvlist_t *nvl); 934d6a976eSRyan Stone 944d6a976eSRyan Stone #ifndef _KERNEL 954d6a976eSRyan Stone void nvlist_dump(const nvlist_t *nvl, int fd); 964d6a976eSRyan Stone void nvlist_fdump(const nvlist_t *nvl, FILE *fp); 974d6a976eSRyan Stone #endif 984d6a976eSRyan Stone 994d6a976eSRyan Stone size_t nvlist_size(const nvlist_t *nvl); 1004d6a976eSRyan Stone void *nvlist_pack(const nvlist_t *nvl, size_t *sizep); 101bd1da0a0SMariusz Zaborski nvlist_t *nvlist_unpack(const void *buf, size_t size, int flags); 1024d6a976eSRyan Stone 1034d6a976eSRyan Stone int nvlist_send(int sock, const nvlist_t *nvl); 104bd1da0a0SMariusz Zaborski nvlist_t *nvlist_recv(int sock, int flags); 105bd1da0a0SMariusz Zaborski nvlist_t *nvlist_xfer(int sock, nvlist_t *nvl, int flags); 1064d6a976eSRyan Stone 1074d6a976eSRyan Stone const char *nvlist_next(const nvlist_t *nvl, int *typep, void **cookiep); 1084d6a976eSRyan Stone 1094d6a976eSRyan Stone const nvlist_t *nvlist_get_parent(const nvlist_t *nvl, void **cookiep); 1104d6a976eSRyan Stone 111347a39b4SMariusz Zaborski const nvlist_t *nvlist_get_array_next(const nvlist_t *nvl); 112347a39b4SMariusz Zaborski bool nvlist_in_array(const nvlist_t *nvl); 113347a39b4SMariusz Zaborski 114347a39b4SMariusz Zaborski const nvlist_t *nvlist_get_pararr(const nvlist_t *nvl, void **cookiep); 115347a39b4SMariusz Zaborski 1164d6a976eSRyan Stone /* 1174d6a976eSRyan Stone * The nvlist_exists functions check if the given name (optionally of the given 1184d6a976eSRyan Stone * type) exists on nvlist. 1194d6a976eSRyan Stone */ 1204d6a976eSRyan Stone 1214d6a976eSRyan Stone bool nvlist_exists(const nvlist_t *nvl, const char *name); 1224d6a976eSRyan Stone bool nvlist_exists_type(const nvlist_t *nvl, const char *name, int type); 1234d6a976eSRyan Stone 1244d6a976eSRyan Stone bool nvlist_exists_null(const nvlist_t *nvl, const char *name); 1254d6a976eSRyan Stone bool nvlist_exists_bool(const nvlist_t *nvl, const char *name); 1264d6a976eSRyan Stone bool nvlist_exists_number(const nvlist_t *nvl, const char *name); 1274d6a976eSRyan Stone bool nvlist_exists_string(const nvlist_t *nvl, const char *name); 1284d6a976eSRyan Stone bool nvlist_exists_nvlist(const nvlist_t *nvl, const char *name); 129347a39b4SMariusz Zaborski bool nvlist_exists_binary(const nvlist_t *nvl, const char *name); 130347a39b4SMariusz Zaborski bool nvlist_exists_bool_array(const nvlist_t *nvl, const char *name); 131347a39b4SMariusz Zaborski bool nvlist_exists_number_array(const nvlist_t *nvl, const char *name); 132347a39b4SMariusz Zaborski bool nvlist_exists_string_array(const nvlist_t *nvl, const char *name); 133347a39b4SMariusz Zaborski bool nvlist_exists_nvlist_array(const nvlist_t *nvl, const char *name); 1344d6a976eSRyan Stone #ifndef _KERNEL 1354d6a976eSRyan Stone bool nvlist_exists_descriptor(const nvlist_t *nvl, const char *name); 136347a39b4SMariusz Zaborski bool nvlist_exists_descriptor_array(const nvlist_t *nvl, const char *name); 1374d6a976eSRyan Stone #endif 1384d6a976eSRyan Stone 1394d6a976eSRyan Stone /* 1404d6a976eSRyan Stone * The nvlist_add functions add the given name/value pair. 1414d6a976eSRyan Stone * If a pointer is provided, nvlist_add will internally allocate memory for the 1424d6a976eSRyan Stone * given data (in other words it won't consume provided buffer). 1434d6a976eSRyan Stone */ 1444d6a976eSRyan Stone 1454d6a976eSRyan Stone void nvlist_add_null(nvlist_t *nvl, const char *name); 1464d6a976eSRyan Stone void nvlist_add_bool(nvlist_t *nvl, const char *name, bool value); 1474d6a976eSRyan Stone void nvlist_add_number(nvlist_t *nvl, const char *name, uint64_t value); 1484d6a976eSRyan Stone void nvlist_add_string(nvlist_t *nvl, const char *name, const char *value); 1494d6a976eSRyan Stone void nvlist_add_stringf(nvlist_t *nvl, const char *name, const char *valuefmt, ...) __printflike(3, 4); 1501f2c9264SBryan Drewery #if !defined(_KERNEL) || defined(_VA_LIST_DECLARED) 1514d6a976eSRyan Stone void nvlist_add_stringv(nvlist_t *nvl, const char *name, const char *valuefmt, va_list valueap) __printflike(3, 0); 1524d6a976eSRyan Stone #endif 1534d6a976eSRyan Stone void nvlist_add_nvlist(nvlist_t *nvl, const char *name, const nvlist_t *value); 154347a39b4SMariusz Zaborski void nvlist_add_binary(nvlist_t *nvl, const char *name, const void *value, size_t size); 155347a39b4SMariusz Zaborski void nvlist_add_bool_array(nvlist_t *nvl, const char *name, const bool *value, size_t nitems); 156347a39b4SMariusz Zaborski void nvlist_add_number_array(nvlist_t *nvl, const char *name, const uint64_t *value, size_t nitems); 157347a39b4SMariusz Zaborski void nvlist_add_string_array(nvlist_t *nvl, const char *name, const char * const *value, size_t nitems); 158347a39b4SMariusz Zaborski void nvlist_add_nvlist_array(nvlist_t *nvl, const char *name, const nvlist_t * const *value, size_t nitems); 1594d6a976eSRyan Stone #ifndef _KERNEL 1604d6a976eSRyan Stone void nvlist_add_descriptor(nvlist_t *nvl, const char *name, int value); 161347a39b4SMariusz Zaborski void nvlist_add_descriptor_array(nvlist_t *nvl, const char *name, const int *value, size_t nitems); 1624d6a976eSRyan Stone #endif 1634d6a976eSRyan Stone 16424881c06SMariusz Zaborski void nvlist_append_bool_array(nvlist_t *nvl, const char *name, const bool value); 16524881c06SMariusz Zaborski void nvlist_append_number_array(nvlist_t *nvl, const char *name, const uint64_t value); 16624881c06SMariusz Zaborski void nvlist_append_string_array(nvlist_t *nvl, const char *name, const char * const value); 16724881c06SMariusz Zaborski void nvlist_append_nvlist_array(nvlist_t *nvl, const char *name, const nvlist_t * const value); 16824881c06SMariusz Zaborski #ifndef _KERNEL 16924881c06SMariusz Zaborski void nvlist_append_descriptor_array(nvlist_t *nvl, const char *name, int value); 17024881c06SMariusz Zaborski #endif 17124881c06SMariusz Zaborski 1724d6a976eSRyan Stone /* 1734d6a976eSRyan Stone * The nvlist_move functions add the given name/value pair. 1744d6a976eSRyan Stone * The functions consumes provided buffer. 1754d6a976eSRyan Stone */ 1764d6a976eSRyan Stone 1774d6a976eSRyan Stone void nvlist_move_string(nvlist_t *nvl, const char *name, char *value); 1784d6a976eSRyan Stone void nvlist_move_nvlist(nvlist_t *nvl, const char *name, nvlist_t *value); 179347a39b4SMariusz Zaborski void nvlist_move_binary(nvlist_t *nvl, const char *name, void *value, size_t size); 180347a39b4SMariusz Zaborski void nvlist_move_bool_array(nvlist_t *nvl, const char *name, bool *value, size_t nitems); 181347a39b4SMariusz Zaborski void nvlist_move_string_array(nvlist_t *nvl, const char *name, char **value, size_t nitems); 182347a39b4SMariusz Zaborski void nvlist_move_nvlist_array(nvlist_t *nvl, const char *name, nvlist_t **value, size_t nitems); 183347a39b4SMariusz Zaborski void nvlist_move_number_array(nvlist_t *nvl, const char *name, uint64_t *value, size_t nitems); 1844d6a976eSRyan Stone #ifndef _KERNEL 1854d6a976eSRyan Stone void nvlist_move_descriptor(nvlist_t *nvl, const char *name, int value); 186347a39b4SMariusz Zaborski void nvlist_move_descriptor_array(nvlist_t *nvl, const char *name, int *value, size_t nitems); 1874d6a976eSRyan Stone #endif 1884d6a976eSRyan Stone 1894d6a976eSRyan Stone /* 1904d6a976eSRyan Stone * The nvlist_get functions returns value associated with the given name. 1914d6a976eSRyan Stone * If it returns a pointer, the pointer represents internal buffer and should 1924d6a976eSRyan Stone * not be freed by the caller. 1934d6a976eSRyan Stone */ 1944d6a976eSRyan Stone 1954d6a976eSRyan Stone bool nvlist_get_bool(const nvlist_t *nvl, const char *name); 1964d6a976eSRyan Stone uint64_t nvlist_get_number(const nvlist_t *nvl, const char *name); 1974d6a976eSRyan Stone const char *nvlist_get_string(const nvlist_t *nvl, const char *name); 1984d6a976eSRyan Stone const nvlist_t *nvlist_get_nvlist(const nvlist_t *nvl, const char *name); 199347a39b4SMariusz Zaborski const void *nvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep); 200347a39b4SMariusz Zaborski const bool *nvlist_get_bool_array(const nvlist_t *nvl, const char *name, size_t *nitemsp); 201347a39b4SMariusz Zaborski const uint64_t *nvlist_get_number_array(const nvlist_t *nvl, const char *name, size_t *nitemsp); 202347a39b4SMariusz Zaborski const char * const *nvlist_get_string_array(const nvlist_t *nvl, const char *name, size_t *nitemsp); 203347a39b4SMariusz Zaborski const nvlist_t * const *nvlist_get_nvlist_array(const nvlist_t *nvl, const char *name, size_t *nitemsp); 2044d6a976eSRyan Stone #ifndef _KERNEL 2054d6a976eSRyan Stone int nvlist_get_descriptor(const nvlist_t *nvl, const char *name); 206347a39b4SMariusz Zaborski const int *nvlist_get_descriptor_array(const nvlist_t *nvl, const char *name, size_t *nitemsp); 2074d6a976eSRyan Stone #endif 2084d6a976eSRyan Stone 2094d6a976eSRyan Stone /* 2104d6a976eSRyan Stone * The nvlist_take functions returns value associated with the given name and 2114d6a976eSRyan Stone * remove the given entry from the nvlist. 2124d6a976eSRyan Stone * The caller is responsible for freeing received data. 2134d6a976eSRyan Stone */ 2144d6a976eSRyan Stone 2154d6a976eSRyan Stone bool nvlist_take_bool(nvlist_t *nvl, const char *name); 2164d6a976eSRyan Stone uint64_t nvlist_take_number(nvlist_t *nvl, const char *name); 2174d6a976eSRyan Stone char *nvlist_take_string(nvlist_t *nvl, const char *name); 2184d6a976eSRyan Stone nvlist_t *nvlist_take_nvlist(nvlist_t *nvl, const char *name); 219347a39b4SMariusz Zaborski void *nvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep); 220347a39b4SMariusz Zaborski bool *nvlist_take_bool_array(nvlist_t *nvl, const char *name, size_t *nitemsp); 221347a39b4SMariusz Zaborski uint64_t *nvlist_take_number_array(nvlist_t *nvl, const char *name, size_t *nitemsp); 222347a39b4SMariusz Zaborski char **nvlist_take_string_array(nvlist_t *nvl, const char *name, size_t *nitemsp); 223347a39b4SMariusz Zaborski nvlist_t **nvlist_take_nvlist_array(nvlist_t *nvl, const char *name, size_t *nitemsp); 2244d6a976eSRyan Stone #ifndef _KERNEL 2254d6a976eSRyan Stone int nvlist_take_descriptor(nvlist_t *nvl, const char *name); 226347a39b4SMariusz Zaborski int *nvlist_take_descriptor_array(nvlist_t *nvl, const char *name, size_t *nitemsp); 2274d6a976eSRyan Stone #endif 2284d6a976eSRyan Stone 2294d6a976eSRyan Stone /* 2304d6a976eSRyan Stone * The nvlist_free functions removes the given name/value pair from the nvlist 2314d6a976eSRyan Stone * and frees memory associated with it. 2324d6a976eSRyan Stone */ 2334d6a976eSRyan Stone 2344d6a976eSRyan Stone void nvlist_free(nvlist_t *nvl, const char *name); 2354d6a976eSRyan Stone void nvlist_free_type(nvlist_t *nvl, const char *name, int type); 2364d6a976eSRyan Stone 2374d6a976eSRyan Stone void nvlist_free_null(nvlist_t *nvl, const char *name); 2384d6a976eSRyan Stone void nvlist_free_bool(nvlist_t *nvl, const char *name); 2394d6a976eSRyan Stone void nvlist_free_number(nvlist_t *nvl, const char *name); 2404d6a976eSRyan Stone void nvlist_free_string(nvlist_t *nvl, const char *name); 2414d6a976eSRyan Stone void nvlist_free_nvlist(nvlist_t *nvl, const char *name); 242347a39b4SMariusz Zaborski void nvlist_free_binary(nvlist_t *nvl, const char *name); 243347a39b4SMariusz Zaborski void nvlist_free_bool_array(nvlist_t *nvl, const char *name); 244347a39b4SMariusz Zaborski void nvlist_free_number_array(nvlist_t *nvl, const char *name); 245347a39b4SMariusz Zaborski void nvlist_free_string_array(nvlist_t *nvl, const char *name); 246347a39b4SMariusz Zaborski void nvlist_free_nvlist_array(nvlist_t *nvl, const char *name); 247347a39b4SMariusz Zaborski void nvlist_free_binary_array(nvlist_t *nvl, const char *name); 2484d6a976eSRyan Stone #ifndef _KERNEL 2494d6a976eSRyan Stone void nvlist_free_descriptor(nvlist_t *nvl, const char *name); 250347a39b4SMariusz Zaborski void nvlist_free_descriptor_array(nvlist_t *nvl, const char *name); 2514d6a976eSRyan Stone #endif 2524d6a976eSRyan Stone 2534d6a976eSRyan Stone __END_DECLS 2544d6a976eSRyan Stone 2554d6a976eSRyan Stone #endif /* !_NV_H_ */ 256