NVLIST_ALLOC(3NVPAIR)                      Name-value Pair Library Functions
NAME
       nvlist_alloc, nvlist_free, nvlist_size, nvlist_pack, nvlist_unpack,
       nvlist_dup, nvlist_merge, nvlist_xalloc, nvlist_xpack,
       nvlist_xunpack, nvlist_xdup, nvlist_lookup_nv_alloc, nv_alloc_init,
       nv_alloc_reset, nv_alloc_fini - manage a name-value pair list
SYNOPSIS
       cc [ 
flag... ] 
file... 
-lnvpair [ 
library... ]
       #include <libnvpair.h>       
int nvlist_alloc(
nvlist_t **nvlp, 
uint_t nvflag, 
int flag);       
int nvlist_xalloc(
nvlist_t **nvlp, 
uint_t nvflag,            
nv_alloc_t * nva);       
void nvlist_free(
nvlist_t *nvl);       
int nvlist_size(
nvlist_t *nvl, 
size_t *size, 
int encoding);       
int nvlist_pack(
nvlist_t *nvl, 
char **bufp, 
size_t *buflen,            
int encoding, 
int flag);       
int nvlist_xpack(
nvlist_t *nvl, 
char **bufp, 
size_t *buflen,            
int encoding, 
nv_alloc_t * nva);       
int nvlist_unpack(
char *buf, 
size_t buflen, 
nvlist_t **nvlp,            
int flag);       
int nvlist_xunpack(
char *buf, 
size_t buflen, 
nvlist_t **nvlp,            
nv_alloc_t * nva);       
int nvlist_dup(
nvlist_t *nvl, 
nvlist_t **nvlp, 
int flag);       
int nvlist_xdup(
nvlist_t *nvl, 
nvlist_t **nvlp,            
nv_alloc_t * nva);       
int nvlist_merge(
nvlist_t *dst, 
nvlist_t *nvl, 
int flag);       
nv_alloc_t * nvlist_lookup_nv_alloc(
nvlist_t *nvl);       
int nv_alloc_init(
nv_alloc_t *nva, 
const nv_alloc_ops_t *nvo,            
/* args */ ...);       
void nv_alloc_reset(
nv_alloc_t *nva);       
void nv_alloc_fini(
nv_alloc_t *nva);
PARAMETERS
       nvlp                   Address of a pointer to 
nvlist_t.       
nvflag                   Specify bit fields defining 
nvlist properties:                   
NV_UNIQUE_NAME                                          The 
nvpair names are unique.                   
NV_UNIQUE_NAME_TYPE                                          Name-data type combination is
                                          unique.       
flag                   Specify 0. Reserved for future use.       
nvl                   The 
nvlist_t to be processed.       
dst                   The destination 
nvlist_t.       
size                   Pointer to buffer to contain the encoded size.       
bufp                   Address of buffer to pack 
nvlist into. Must be 8-byte
                   aligned. If 
NULL, library will allocate memory.       
buf                   Buffer containing packed 
nvlist.       
buflen                   Size of buffer 
bufp or 
buf points to.       
encoding                   Encoding method for packing.       
nvo                   Pluggable allocator operations pointer (
nv_alloc_ops_t).       
nva                   A pointer to an 
nv_alloc_t structure to be used for the
                   specified 
nvlist_t.
DESCRIPTION
   List Manipulation
       The 
nvlist_alloc() function allocates a new name-value pair list and
       updates 
nvlp to point to the handle. The 
nvflag argument specifies       
nvlist properties to remain persistent across packing, unpacking, and
       duplication. If 
NV_UNIQUE_NAME was specified for 
nvflag, existing
       nvpairs with matching names are removed before the new nvpair is
       added. If 
NV_UNIQUE_NAME_TYPE was specified for 
nvflag, existing
       nvpairs with matching names and data types are removed before the new
       nvpair is added. See 
nvlist_add_byte(3NVPAIR) for more information.
       The 
nvlist_xalloc() function is identical to 
nvlist_alloc() except
       that 
nvlist_xalloc() can use a different allocator, as described in
       the Pluggable Allocators section.
       The 
nvlist_free() function frees a name-value pair list. If 
nvl is a
       null pointer, no action occurs.
       The 
nvlist_size() function returns the minimum size of a contiguous
       buffer large enough to pack 
nvl. The 
encoding parameter specifies the
       method of encoding when packing 
nvl. Supported encoding methods are:       
NV_ENCODE_NATIVE                           Straight 
bcopy() as described in 
bcopy(3C).       
NV_ENCODE_XDR                           Use XDR encoding, suitable for sending to another
                           host.
       The 
nvlist_pack() function packs 
nvl into contiguous memory starting
       at *
bufp. The 
encoding parameter specifies the method of encoding
       (see above).
           o      If *
bufp is not 
NULL, *
bufp is expected to be a caller-
                  allocated buffer of size *
buflen.
           o      If *
bufp is 
NULL, the library will allocate memory and
                  update *
bufp to point to the memory and update *
buflen to
                  contain the size of the allocated memory.
       The 
nvlist_xpack() function is identical to 
nvlist_pack() except that       
nvlist_xpack() can use a different allocator.
       The 
nvlist_unpack() function takes a buffer with a packed 
nvlist_t       and unpacks it into a searchable 
nvlist_t. The library allocates
       memory for 
nvlist_t. The caller is responsible for freeing the memory
       by calling 
nvlist_free().
       The 
nvlist_xunpack() function is identical to 
nvlist_unpack() except
       that 
nvlist_xunpack() can use a different allocator.
       The 
nvlist_dup() function makes a copy of 
nvl and updates 
nvlp to
       point to the copy.
       The 
nvlist_xdup() function is identical to 
nvlist_dup() except that       
nvlist_xdup() can use a different allocator.
       The 
nvlist_merge() function adds copies of all name-value pairs from       
nvl to 
dst.  Name-value pairs in 
dst are replaced with name-value
       pairs from 
nvl that have identical names (if 
dst has the type       
NV_UNIQUE_NAME) or identical names and types (if 
dst has the type       
NV_UNIQUE_NAME_TYPE).
       The 
nvlist_lookup_nv_alloc() function retrieves the pointer to the
       allocator that was used when manipulating a name-value pair list.
   Pluggable Allocators
   Using Pluggable Allocators
       The 
nv_alloc_init(), 
nv_alloc_reset() and 
nv_alloc_fini() functions
       provide an interface to specify the allocator to be used when
       manipulating a name-value pair list.
       The 
nv_alloc_init() function determines the allocator properties and
       puts them into the 
nva argument. The application must specify the       
nv_arg and 
nvo arguments and an optional variable argument list. The
       optional arguments are passed to the (*
nv_ao_init()) function.
       The 
nva argument must be passed to 
nvlist_xalloc(), 
nvlist_xpack(),       
nvlist_xunpack() and 
nvlist_xdup().
       The 
nv_alloc_reset() function is responsible for resetting the
       allocator properties to the data specified by 
nv_alloc_init(). When
       no (*
nv_ao_reset()) function is specified, 
nv_alloc_reset() has no
       effect.
       The 
nv_alloc_fini() function destroys the allocator properties
       determined by 
nv_alloc_init(). When a (*
nv_ao_fini()) function is
       specified, it is called from 
nv_alloc_fini().
       The disposition of the allocated objects and the memory used to store
       them is left to the allocator implementation.
       The 
nv_alloc_nosleep nv_alloc_t can be used with 
nvlist_xalloc() to
       mimic the behavior of 
nvlist_alloc().
       The nvpair allocator framework provides a pointer to the operation
       structure of a fixed buffer allocator. This allocator, 
nv_fixed_ops,
       uses a pre-allocated buffer for memory allocations. It is intended
       primarily for kernel use and is described on 
nvlist_alloc(9F).
       An example program that uses the pluggable allocator functionality is
       provided on 
nvlist_alloc(9F).
   Creating Pluggable Allocators
       Any producer of name-value pairs can specify its own allocator
       functions. The application must provide the following pluggable
       allocator operations:
         int (*nv_ao_init)(nv_alloc_t *nva, va_list nv_valist);
         void (*nv_ao_fini)(nv_alloc_t *nva);
         void *(*nv_ao_alloc)(nv_alloc_t *nva, size_t sz);
         void (*nv_ao_reset)(nv_alloc_t *nva);
         void (*nv_ao_free)(nv_alloc_t *nva, void *buf, size_t sz);
       The 
nva argument of the allocator implementation is always the first
       argument.
       The optional (*
nv_ao_init()) function is responsible for filling the
       data specified by 
nv_alloc_init() into the 
nva_arg argument.  The
       (*
nv_ao_init()) function is only called when 
nv_alloc_init() is
       executed.
       The optional (*
nv_ao_fini()) function is responsible for the cleanup
       of the allocator implementation. It is called by 
nv_alloc_fini().
       The required (*
nv_ao_alloc()) function is used in the nvpair
       allocation framework for memory allocation. The 
sz argument specifies
       the size of the requested buffer.
       The optional (*
nv_ao_reset()) function is responsible for resetting
       the 
nva_arg argument to the data specified by 
nv_alloc_init().
       The required (*
nv_ao_free()) function is used in the nvpair allocator
       framework for memory deallocation. The 
buf argument is a pointer to a
       block previously allocated by the (*
nv_ao_alloc()) function. The size
       argument 
sz must exactly match the original allocation.
       The disposition of the allocated objects and the memory used to store
       them is left to the allocator implementation.
RETURN VALUES
       These functions return 0 on success and an error value on failure.
       The 
nvlist_lookup_nv_alloc() function returns a pointer to an
       allocator.
ERRORS
       These functions will fail if:       
EINVAL                 There is an invalid argument.
       The 
nvlist_alloc(), 
nvlist_dup(), 
nvlist_pack(), 
nvlist_unpack(),       
nvlist_merge(), 
nvlist_xalloc(), 
nvlist_xdup(), 
nvlist_xpack(), and       
nvlist_xunpack() functions will fail if:       
ENOMEM                 There is insufficient memory.
       The 
nvlist_pack(), 
nvlist_unpack(), 
nvlist_xpack(), and       
nvlist_xunpack() functions will fail if:       
EFAULT                  An encode/decode error occurs.       
ENOTSUP                  An encode/decode method is not supported.
EXAMPLES
         /*
          * Program to create an nvlist.
          */
         #include <stdio.h>
         #include <sys/types.h>
         #include <string.h>
         #include <libnvpair.h>
         /* generate a packed nvlist */
         static int
         create_packed_nvlist(char **buf, uint_t *buflen, int encode)
         {
             uchar_t bytes[] = {0xaa, 0xbb, 0xcc, 0xdd};
             int32_t int32[] = {3, 4, 5};
             char *strs[] = {"child0", "child1", "child2"};
             int err;
             nvlist_t *nvl;
             err = nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0);    /* allocate list */
             if (err) {
                 (void) printf("nvlist_alloc() failed\n");
                 return (err);
             }
             /* add a value of some types */
             if ((nvlist_add_byte(nvl, "byte", bytes[0]) != 0) ||
                 (nvlist_add_int32(nvl, "int32", int32[0]) != 0) ||
                 (nvlist_add_int32_array(nvl, "int32_array", int32, 3) != 0) ||
                 (nvlist_add_string_array(nvl, "string_array", strs, 3) != 0)) {
                 nvlist_free(nvl);
                 return (-1);
             }
             err = nvlist_size(nvl, buflen, encode);
             if (err) {
                 (void) printf("nvlist_size: %s\n", strerror(err));
                 nvlist_free(nvl);
                 return (err);
             }
             /* pack into contig. memory */
             err = nvlist_pack(nvl, buf, buflen, encode, 0);
             if (err)
                 (void) printf("nvlist_pack: %s\n", strerror(err));
             /* free the original list */
             nvlist_free(nvl);
             return (err);
         }
         /* selectively print nvpairs */
         static void
         nvlist_lookup_and_print(nvlist_t *nvl)
         {
             char **str_val;
             int i, int_val;
             uint_t nval;
             if (nvlist_lookup_int32(nvl, "int32", &int_val) == 0)
                 (void) printf("int32 = %d\n", int_val);
             if (nvlist_lookup_string_array(nvl, "string_array", &str_val, &nval)
                 == 0) {
                     (void) printf("string_array =");
                     for (i = 0; i < nval; i++)
                             (void) printf(" %s", str_val[i]);
                     (void) printf("\n");
             }
         }
         /*ARGSUSED*/
         int
         main(int argc, char *argv[])
         {
             int err;
             char *buf = NULL;
             size_t buflen;
             nvlist_t *nvl = NULL;
             if (create_packed_nvlist(&buf, &buflen, NV_ENCODE_XDR) != 0) {
                 (void) printf("cannot create packed nvlist buffer\n");
                 return(-1);
                 }
             /* unpack into an nvlist_t */
             err = nvlist_unpack(buf, buflen, &nvl, 0);
             if (err) {
                 (void) printf("nvlist_unpack(): %s\n", strerror(err));
                 return(-1);
             }
             /* selectively print out attributes */
             nvlist_lookup_and_print(nvl);
             return(0);
         }
ATTRIBUTES
       See 
attributes(7) for descriptions of the following attributes:
       +--------------------+-----------------+
       |  ATTRIBUTE TYPE    | ATTRIBUTE VALUE |
       +--------------------+-----------------+
       |Interface Stability | Evolving        |
       +--------------------+-----------------+
       |MT-Level            | MT-Safe         |
       +--------------------+-----------------+
SEE ALSO
       libnvpair(3LIB), 
attributes(7), 
nvlist_alloc(9F)                              February 15, 2016        NVLIST_ALLOC(3NVPAIR)