1*7dcd0f0eSMariusz Zaborski.\" 2*7dcd0f0eSMariusz Zaborski.\" Copyright (c) 2016 Adam Starak <starak.adam@gmail.com> 3*7dcd0f0eSMariusz Zaborski.\" All rights reserved. 4*7dcd0f0eSMariusz Zaborski.\" 5*7dcd0f0eSMariusz Zaborski.\" Redistribution and use in source and binary forms, with or without 6*7dcd0f0eSMariusz Zaborski.\" modification, are permitted provided that the following conditions 7*7dcd0f0eSMariusz Zaborski.\" are met: 8*7dcd0f0eSMariusz Zaborski.\" 1. Redistributions of source code must retain the above copyright 9*7dcd0f0eSMariusz Zaborski.\" notice, this list of conditions and the following disclaimer. 10*7dcd0f0eSMariusz Zaborski.\" 2. Redistributions in binary form must reproduce the above copyright 11*7dcd0f0eSMariusz Zaborski.\" notice, this list of conditions and the following disclaimer in the 12*7dcd0f0eSMariusz Zaborski.\" documentation and/or other materials provided with the distribution. 13*7dcd0f0eSMariusz Zaborski.\" 14*7dcd0f0eSMariusz Zaborski.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*7dcd0f0eSMariusz Zaborski.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*7dcd0f0eSMariusz Zaborski.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*7dcd0f0eSMariusz Zaborski.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*7dcd0f0eSMariusz Zaborski.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*7dcd0f0eSMariusz Zaborski.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*7dcd0f0eSMariusz Zaborski.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*7dcd0f0eSMariusz Zaborski.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*7dcd0f0eSMariusz Zaborski.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*7dcd0f0eSMariusz Zaborski.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*7dcd0f0eSMariusz Zaborski.\" SUCH DAMAGE. 25*7dcd0f0eSMariusz Zaborski.\" 26*7dcd0f0eSMariusz Zaborski.\" $FreeBSD$ 27*7dcd0f0eSMariusz Zaborski.\" 28*7dcd0f0eSMariusz Zaborski.Dd July 26, 2016 29*7dcd0f0eSMariusz Zaborski.Dt CNV 9 30*7dcd0f0eSMariusz Zaborski.Os 31*7dcd0f0eSMariusz Zaborski.Sh NAME 32*7dcd0f0eSMariusz Zaborski.Nm cnvlist_get, 33*7dcd0f0eSMariusz Zaborski.Nm cnvlist_take, 34*7dcd0f0eSMariusz Zaborski.Nm cnvlist_free, 35*7dcd0f0eSMariusz Zaborski.Nd "API for managing name/value pairs by cookie." 36*7dcd0f0eSMariusz Zaborski.Sh LIBRARY 37*7dcd0f0eSMariusz Zaborski.Lb libnv 38*7dcd0f0eSMariusz Zaborski.Sh SYNOPSIS 39*7dcd0f0eSMariusz Zaborski.In sys/cnv.h 40*7dcd0f0eSMariusz Zaborski.Ft bool 41*7dcd0f0eSMariusz Zaborski.Fn cnvlist_get_bool "void *cookiep" 42*7dcd0f0eSMariusz Zaborski.Ft uint64_t 43*7dcd0f0eSMariusz Zaborski.Fn cnvlist_get_number "void *cookiep" 44*7dcd0f0eSMariusz Zaborski.Ft "const char *" 45*7dcd0f0eSMariusz Zaborski.Fn cnvlist_get_string "void *cookiep" 46*7dcd0f0eSMariusz Zaborski.Ft "const nvlist_t *" 47*7dcd0f0eSMariusz Zaborski.Fn cnvlist_get_nvlist "void *cookiep" 48*7dcd0f0eSMariusz Zaborski.Ft "const void *" 49*7dcd0f0eSMariusz Zaborski.Fn cnvlist_get_binary "void *cookiep" "size_t *sizep" 50*7dcd0f0eSMariusz Zaborski.Ft "const bool *" 51*7dcd0f0eSMariusz Zaborski.Fn cnvlist_get_bool_array "void *cookiep" "size_t *nitemsp" 52*7dcd0f0eSMariusz Zaborski.Ft "const uint64_t *" 53*7dcd0f0eSMariusz Zaborski.Fn cnvlist_get_number_array "void *cookiep" "size_t *nitemsp" 54*7dcd0f0eSMariusz Zaborski.Ft "const char * const *" 55*7dcd0f0eSMariusz Zaborski.Fn cnvlist_get_string_array "void *cookiep" "size_t *nitemsp" 56*7dcd0f0eSMariusz Zaborski.Ft "const nvlist_t * const *" 57*7dcd0f0eSMariusz Zaborski.Fn cnvlist_get_nvlist_array "void *cookiep" "size_t *nitemsp" 58*7dcd0f0eSMariusz Zaborski.Ft int 59*7dcd0f0eSMariusz Zaborski.Fn cnvlist_get_descriptor "void *cookiep" 60*7dcd0f0eSMariusz Zaborski.Ft "const int *" 61*7dcd0f0eSMariusz Zaborski.Fn cnvlist_get_descriptor_array "void *cookiep" "size_t *nitemsp" 62*7dcd0f0eSMariusz Zaborski.\" 63*7dcd0f0eSMariusz Zaborski.Ft bool 64*7dcd0f0eSMariusz Zaborski.Fn cnvlist_take_bool "void *cookiep" 65*7dcd0f0eSMariusz Zaborski.Ft uint64_t 66*7dcd0f0eSMariusz Zaborski.Fn cnvlist_take_number "void *cookiep" 67*7dcd0f0eSMariusz Zaborski.Ft "const char *" 68*7dcd0f0eSMariusz Zaborski.Fn cnvlist_take_string "void *cookiep" 69*7dcd0f0eSMariusz Zaborski.Ft "const nvlist_t *" 70*7dcd0f0eSMariusz Zaborski.Fn cnvlist_take_nvlist "void *cookiep" 71*7dcd0f0eSMariusz Zaborski.Ft "const void *" 72*7dcd0f0eSMariusz Zaborski.Fn cnvlist_take_binary "void *cookiep" "size_t *sizep" 73*7dcd0f0eSMariusz Zaborski.Ft "const bool *" 74*7dcd0f0eSMariusz Zaborski.Fn cnvlist_take_bool_array "void *cookiep" "size_t *nitemsp" 75*7dcd0f0eSMariusz Zaborski.Ft "const uint64_t *" 76*7dcd0f0eSMariusz Zaborski.Fn cnvlist_take_number_array "void *cookiep" "size_t *nitemsp" 77*7dcd0f0eSMariusz Zaborski.Ft "const char * const *" 78*7dcd0f0eSMariusz Zaborski.Fn cnvlist_take_string_array "void *cookiep" "size_t *nitemsp" 79*7dcd0f0eSMariusz Zaborski.Ft "const nvlist_t * const *" 80*7dcd0f0eSMariusz Zaborski.Fn cnvlist_take_nvlist_array "void *cookiep" "size_t *nitemsp" 81*7dcd0f0eSMariusz Zaborski.Ft int 82*7dcd0f0eSMariusz Zaborski.Fn cnvlist_take_descriptor "void *cookiep" 83*7dcd0f0eSMariusz Zaborski.Ft "const int *' 84*7dcd0f0eSMariusz Zaborski.Fn cnvlist_take_descriptor_array "void *cookiep" "size_t *nitemsp" 85*7dcd0f0eSMariusz Zaborski.\" 86*7dcd0f0eSMariusz Zaborski.Ft void 87*7dcd0f0eSMariusz Zaborski.Fn cnvlist_free_null "nvlist_t *nvl" "void *cookiep" 88*7dcd0f0eSMariusz Zaborski.Ft void 89*7dcd0f0eSMariusz Zaborski.Fn cnvlist_free_bool "nvlist_t *nvl" "void *cookiep" 90*7dcd0f0eSMariusz Zaborski.Ft void 91*7dcd0f0eSMariusz Zaborski.Fn cnvlist_free_number "nvlist_t *nvl" "void *cookiep" 92*7dcd0f0eSMariusz Zaborski.Ft void 93*7dcd0f0eSMariusz Zaborski.Fn cnvlist_free_string "nvlist_t *nvl" "void *cookiep" 94*7dcd0f0eSMariusz Zaborski.Ft void 95*7dcd0f0eSMariusz Zaborski.Fn cnvlist_free_nvlist "nvlist_t *nvl" "void *cookiep" 96*7dcd0f0eSMariusz Zaborski.Ft void 97*7dcd0f0eSMariusz Zaborski.Fn cnvlist_free_descriptor "nvlist_t *nvl" "void *cookiep" 98*7dcd0f0eSMariusz Zaborski.Ft void 99*7dcd0f0eSMariusz Zaborski.Fn cnvlist_free_binary "nvlist_t *nvl" "void *cookiep" 100*7dcd0f0eSMariusz Zaborski.Ft void 101*7dcd0f0eSMariusz Zaborski.Fn cnvlist_free_bool_array "nvlist_t *nvl" "void *cookiep" 102*7dcd0f0eSMariusz Zaborski.Ft void 103*7dcd0f0eSMariusz Zaborski.Fn cnvlist_free_number_array "nvlist_t *nvl" "void *cookiep" 104*7dcd0f0eSMariusz Zaborski.Ft void 105*7dcd0f0eSMariusz Zaborski.Fn cnvlist_free_string_array "nvlist_t *nvl" "void *cookiep" 106*7dcd0f0eSMariusz Zaborski.Ft void 107*7dcd0f0eSMariusz Zaborski.Fn cnvlist_free_nvlist_array "nvlist_t *nvl" "void *cookiep" 108*7dcd0f0eSMariusz Zaborski.Ft void 109*7dcd0f0eSMariusz Zaborski.Fn cnvlist_free_descriptor_array "nvlist_t *nvl" "void *cookiep" 110*7dcd0f0eSMariusz Zaborski.Sh DESCRIPTION 111*7dcd0f0eSMariusz ZaborskiThe 112*7dcd0f0eSMariusz Zaborski.Nm libnv 113*7dcd0f0eSMariusz Zaborskilibrary permits easy management of name/value pairs and can send and receive 114*7dcd0f0eSMariusz Zaborskithem over sockets. 115*7dcd0f0eSMariusz ZaborskiFor more information, also see 116*7dcd0f0eSMariusz Zaborski.Xr nv 9 . 117*7dcd0f0eSMariusz Zaborski.Pp 118*7dcd0f0eSMariusz ZaborskiThe concept of cookies is explained in 119*7dcd0f0eSMariusz Zaborski.Fn nvlist_next , 120*7dcd0f0eSMariusz Zaborski.Fn nvlist_get_parent , 121*7dcd0f0eSMariusz Zaborskiand 122*7dcd0f0eSMariusz Zaborski.Fn nvlist_get_pararr 123*7dcd0f0eSMariusz Zaborskifrom 124*7dcd0f0eSMariusz Zaborski.Xr nv 9 . 125*7dcd0f0eSMariusz Zaborski.Pp 126*7dcd0f0eSMariusz ZaborskiThe 127*7dcd0f0eSMariusz Zaborski.Nm cnvlist_get 128*7dcd0f0eSMariusz Zaborskifamily of functions obtains the value associated with the given cookie. 129*7dcd0f0eSMariusz ZaborskiReturned strings, nvlists, descriptors, binaries, or arrays must not be modified 130*7dcd0f0eSMariusz Zaborskiby the user, since they still belong to the nvlist. 131*7dcd0f0eSMariusz ZaborskiThe nvlist must not be in an error state. 132*7dcd0f0eSMariusz Zaborski.Pp 133*7dcd0f0eSMariusz ZaborskiThe 134*7dcd0f0eSMariusz Zaborski.Nm cnvlist_take 135*7dcd0f0eSMariusz Zaborskifamily of functions returns the value associated with the given cookie and 136*7dcd0f0eSMariusz Zaborskiremoves the element from the nvlist. 137*7dcd0f0eSMariusz ZaborskiWhen the value is a string, binary, or array value, the caller is responsible 138*7dcd0f0eSMariusz Zaborskifor freeing the returned memory with 139*7dcd0f0eSMariusz Zaborski.Fn free 3 . 140*7dcd0f0eSMariusz ZaborskiWhen the value is an nvlist, the caller is responsible for destroying the 141*7dcd0f0eSMariusz Zaborskireturned nvlist with 142*7dcd0f0eSMariusz Zaborski.Fn nvlist_destroy . 143*7dcd0f0eSMariusz ZaborskiWhen the value is a descriptor, the caller is responsible for closing the 144*7dcd0f0eSMariusz Zaborskireturned descriptor with the 145*7dcd0f0eSMariusz Zaborski.Fn close 2 . 146*7dcd0f0eSMariusz Zaborski.Pp 147*7dcd0f0eSMariusz ZaborskiThe 148*7dcd0f0eSMariusz Zaborski.Nm cnvlist_free 149*7dcd0f0eSMariusz Zaborskifamily of functions removes an element of the supplied cookie and frees all 150*7dcd0f0eSMariusz Zaborskiresources. 151*7dcd0f0eSMariusz ZaborskiIf an element of the given cookie has the wrong type or does not exist, the 152*7dcd0f0eSMariusz Zaborskiprogram 153*7dcd0f0eSMariusz Zaborskiis aborted. 154*7dcd0f0eSMariusz Zaborski.Sh EXAMPLE 155*7dcd0f0eSMariusz ZaborskiThe following example demonstrates how to deal with cnvlist API. 156*7dcd0f0eSMariusz Zaborski.Bd -literal 157*7dcd0f0eSMariusz Zaborskiint type; 158*7dcd0f0eSMariusz Zaborskivoid *cookie, *scookie, *bcookie; 159*7dcd0f0eSMariusz Zaborskinvlist_t *nvl; 160*7dcd0f0eSMariusz Zaborskichar *name; 161*7dcd0f0eSMariusz Zaborski 162*7dcd0f0eSMariusz Zaborskinvl = nvlist_create(0); 163*7dcd0f0eSMariusz Zaborskinvlist_add_bool(nvl, "test", 1 == 2); 164*7dcd0f0eSMariusz Zaborskinvlist_add_string(nvl, "test2", "cnvlist"); 165*7dcd0f0eSMariusz Zaborskicookie = NULL; 166*7dcd0f0eSMariusz Zaborski 167*7dcd0f0eSMariusz Zaborskiwhile (nvlist_next(nvl, &type, &cookie) != NULL) { 168*7dcd0f0eSMariusz Zaborski switch (type) { 169*7dcd0f0eSMariusz Zaborski case NV_TYPE_BOOL: 170*7dcd0f0eSMariusz Zaborski printf("test: %d\\n", cnvlist_get_bool(cookie)); 171*7dcd0f0eSMariusz Zaborski bcookie = cookie; 172*7dcd0f0eSMariusz Zaborski break; 173*7dcd0f0eSMariusz Zaborski case NV_TYPE_STRING: 174*7dcd0f0eSMariusz Zaborski printf("test2: %s\\n", cnvlist_get_string(cookie)); 175*7dcd0f0eSMariusz Zaborski scookie = cookie; 176*7dcd0f0eSMariusz Zaborski break; 177*7dcd0f0eSMariusz Zaborski } 178*7dcd0f0eSMariusz Zaborski} 179*7dcd0f0eSMariusz Zaborski 180*7dcd0f0eSMariusz Zaborskiname = cnvlist_take_string(nvl, scookie); 181*7dcd0f0eSMariusz Zaborskicnvlist_free_bool(nvl, bcookie); 182*7dcd0f0eSMariusz Zaborski 183*7dcd0f0eSMariusz Zaborskiprintf("test2: %s\\n", name); 184*7dcd0f0eSMariusz Zaborskifree(name); 185*7dcd0f0eSMariusz Zaborski 186*7dcd0f0eSMariusz Zaborskiprintf("nvlist_empty = %d\\n", nvlist_empty(nvl)); 187*7dcd0f0eSMariusz Zaborskinvlist_destroy(nvl); 188*7dcd0f0eSMariusz Zaborski 189*7dcd0f0eSMariusz Zaborskireturn (0); 190*7dcd0f0eSMariusz Zaborski.Ed 191*7dcd0f0eSMariusz Zaborski.Sh SEE ALSO 192*7dcd0f0eSMariusz Zaborski.Xr nv 9 , 193*7dcd0f0eSMariusz Zaborski.Xr close 2 , 194*7dcd0f0eSMariusz Zaborski.Xr free 3 195*7dcd0f0eSMariusz Zaborski.Sh AUTHORS 196*7dcd0f0eSMariusz Zaborski.An -nosplit 197*7dcd0f0eSMariusz ZaborskiThe 198*7dcd0f0eSMariusz Zaborski.Nm cnv 199*7dcd0f0eSMariusz ZaborskiAPI was created during the Google Summer Of Code 2016 by 200