Template Version: @(#)sac_nextcase 1.66 04/17/08 SMI
This information is Copyright 2008 Sun Microsystems
1. Introduction
1.1. Project/Component Working Name:
Extending libnvpair for type double
1.2. Name of Document Author/Supplier:
Author: Robert Johnston
1.3 Date of This Document:
08 July, 2008
4. Technical Description
The key components of Solaris FMA (e.g.the fault manager and libtopo)
maintain their property and state information using libnvpair. As part of the
work to develop a sensor abstraction layer for FMA, we require the ability
to represent analog sensor readings, which are typically expressed as
floating point values. Therefore it has become necessary to extend libnvpair
to allow floating point values.
This case seeks to extend libnvpair with three new interfaces to <libnvpair.h>:
int nvlist_add_double(nvlist_t *nvl, const char *name, double val);
int nvlist_lookup_double(nvlist_t *nvl , const char *name, double *);
int nvpair_value_double(nvpair_t *nvpair, double *val);
Because use of floating point types is discouraged in the kernel, and all of
the FMA components that will be consuming these new interfaces live in
userland, they will be made available via libnvpair but not in the kernel DDI.
Preprocessor guards will be used to ensure the new code is not compiled
into the kernel.
The libnvpair(3LIB) man page will be updated to include the new functions.
The man pages for the nvlist_add/lookup_* and nvpair_value_* functions all
link to one of the following three man pages, respectively, which
includes content that covers the various forms of the interfaces for all
of the different data types:
nvlist_add_boolean(3NVPAIR)
nvlist_lookup_boolean(3NVPAIR)
nvpair_value_byte(3NVPAIR)
These three man pages will be updated to include the new interfaces for
DATA_TYPE_DOUBLE. The updated man page conent is included below.
Name-value Pair Library Functions nvlist_add_boolean(3NVPAIR)
NAME
nvlist_add_boolean, nvlist_add_boolean_value,
nvlist_add_byte, nvlist_add_int8, nvlist_add_uint8,
nvlist_add_int16, nvlist_add_uint16, nvlist_add_int32,
nvlist_add_uint32, nvlist_add_int64, nvlist_add_uint64,
nvlist_add_double, nvlist_add_string, nvlist_add_nvlist,
nvlist_add_nvpair, nvlist_add_boolean_array,
nvlist_add_byte_array, nvlist_add_int8_array,
nvlist_add_uint8_array, nvlist_add_int16_array,
nvlist_add_uint16_array, nvlist_add_int32_array,
nvlist_add_uint32_array, nvlist_add_int64_array,
nvlist_add_uint64_array, nvlist_add_string_array,
nvlist_add_nvlist_array - add new name-value pair to nvlist_t
SYNOPSIS
cc [ flag... ] file... -lnvpair [ library... ]
#include <libnvpair.h>
int nvlist_add_boolean(nvlist_t *nvl, const char *name);
int nvlist_add_boolean_value(nvlist_t *nvl,
const char *name, boolean_t val);
int nvlist_add_byte(nvlist_t *nvl, const char *name,
uchar_t val);
int nvlist_add_int8(nvlist_t *nvl, const char *name,
int8_t val);
int nvlist_add_uint8(nvlist_t *nvl, const char *name,
uint8_t val);
int nvlist_add_int16(nvlist_t *nvl, const char *name,
int16_t val);
int nvlist_add_uint16(nvlist_t *nvl, const char *name,
uint16_t val);
int nvlist_add_int32(nvlist_t *nvl, const char *name,
int32_t val);
int nvlist_add_uint32(nvlist_t *nvl, const char *name,
uint32_t val);
int nvlist_add_int64(nvlist_t *nvl, const char *name,
int64_t val);
int nvlist_add_uint64(nvlist_t *nvl, const char *name,
uint64_t val);
int nvlist_add_double(nvlist_t *nvl, const char *name,
double val);
int nvlist_add_string(nvlist_t *nvl, const char *name,
const char *val);
int nvlist_add_nvlist(nvlist_t *nvl, const char *name,
nvlist_t *val);
int nvlist_add_nvpair(nvlist_t *nvl, nvpair_t *nvp);
int nvlist_add_boolean_array(nvlist_t *nvl, const char *name,
boolean_t *val, uint_t nelem);
int nvlist_add_byte_array(nvlist_t *nvl, const char *name,
uchar_t *val, uint_t nelem);
int nvlist_add_int8_array(nvlist_t *nvl, const char *name,
int8_t *val, uint_t nelem);
int nvlist_add_uint8_array(nvlist_t *nvl, const char *name,
uint8_t *val, uint_t nelem);
int nvlist_add_int16_array(nvlist_t *nvl, const char *name,
int16_t *val, uint_t nelem);
int nvlist_add_uint16_array(nvlist_t *nvl, const char *name,
uint16_t *val, uint_t nelem);
int nvlist_add_int32_array(nvlist_t *nvl, const char *name,
int32_t *val, uint_t nelem);
int nvlist_add_uint32_array(nvlist_t *nvl, const char *name,
uint32_t *val, uint_t nelem);
int nvlist_add_int64_array(nvlist_t *nvl, const char *name,
int64_t *val, uint_t nelem);
int nvlist_add_uint64_array(nvlist_t *nvl, const char *name,
uint64_t *val, uint_t nelem);
int nvlist_add_string_array(nvlist_t *nvl, const char *name,
char *const *val, uint_t nelem);
int nvlist_add_nvlist_array(nvlist_t *nvl, const char *name,
nvlist_t **val, uint_t nelem);
PARAMETERS
nvl The nvlist_t (name-value pair list) to be pro-
cessed.
nvp The nvpair_t (name-value pair) to be processed.
name Name of the nvpair (name-value pair).
nelem Number of elements in value (that is, array size).
val Value or starting address of the array value.
DESCRIPTION
These functions add a new name-value pair to an nvlist_t.
The uniqueness of nvpair name and data types follows the
nvflag argument specified for nvlist_alloc(). See
nvlist_alloc(3NVPAIR).
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.
If neither was specified for nvflag, the new nvpair is
unconditionally added at the end of the list. The library
preserves the order of the name-value pairs across packing,
unpacking, and duplication.
Multiple threads can simultaneously read the same nvlist_t,
but only one thread can actively change a given nvlist_t at
a time. The caller is responsible for the synchronization.
The nvlist_add_boolean() function is deprecated. The
nvlist_add_boolean_value() function should be used instead.
RETURN VALUES
These functions return 0 on success and an error value on
failure.
ERRORS
These functions will fail if:
EINVAL There is an invalid argument.
ENOMEM There is insufficient memory.
ATTRIBUTES
See attributes(5) for descriptions of the following attri-
butes:
____________________________________________________________
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
|____________________________|______________________________|
| Interface Stability | Evolving |
|____________________________|______________________________|
| MT-Level | MT-Safe |
|____________________________|______________________________|
SEE ALSO
libnvpair(3LIB), attributes(5)
Name-value Pair Library Functions nvlist_lookup_boolean(3NVPAIR)
NAME
nvlist_lookup_boolean, nvlist_lookup_boolean_value,
nvlist_lookup_byte, nvlist_lookup_int8, nvlist_lookup_uint8,
nvlist_lookup_int16, nvlist_lookup_uint16,
nvlist_lookup_int32, nvlist_lookup_uint32,
nvlist_lookup_int64, nvlist_lookup_uint64,
nvlist_lookup_double, nvlist_lookup_string,
nvlist_lookup_nvlist, nvlist_lookup_boolean_array,
nvlist_lookup_byte_array, nvlist_lookup_int8_array,
nvlist_lookup_uint8_array, nvlist_lookup_int16_array,
nvlist_lookup_uint16_array, nvlist_lookup_int32_array,
nvlist_lookup_uint32_array, nvlist_lookup_int64_array,
nvlist_lookup_uint64_array, nvlist_lookup_nvlist_array,
nvlist_lookup_string_array,
nvlist_lookup_pairs - match name and type indicated by the
interface name and retrieve data value
SYNOPSIS
cc [ flag... ] file... -lnvpair [ library... ]
#include <libnvpair.h>
int nvlist_lookup_boolean(nvlist_t *nvl, const char *name);
int nvlist_lookup_boolean_value(nvlist_t *nvl,
const char *name, boolean_t *val);
int nvlist_lookup_byte(nvlist_t *nvl, const char *name,
uchar_t *val);
int nvlist_lookup_int8(nvlist_t *nvl, const char *name,
int8_t *val);
int nvlist_lookup_uint8(nvlist_t *nvl, const char *name,
uint8_t *val);
int nvlist_lookup_int16(nvlist_t *nvl, const char *name,
int16_t *val);
int nvlist_lookup_uint16(nvlist_t *nvl, const char *name,
uint16_t *val);
int nvlist_lookup_int32(nvlist_t *nvl, const char *name,
int32_t *val);
int nvlist_lookup_uint32(nvlist_t *nvl, const char *name,
uint32_t *val);
int nvlist_lookup_int64(nvlist_t *nvl, const char *name,
int64_t *val);
int nvlist_lookup_uint64(nvlist_t *nvl, const char *name,
uint64_t *val);
int nvlist_lookup_double(nvlist_t *nvl , const char *name,
double *);
int nvlist_lookup_string(nvlist_t *nvl, const char *name,
char **val);
int nvlist_lookup_nvlist(nvlist_t *nvl, const char *name,
nvlist_t **val);
int nvlist_lookup_boolean_array(nvlist_t *nvl, const char *name,
boolean_t **val, uint_t *nelem);
int nvlist_lookup_byte_array(nvlist_t *nvl, const char *name,
uchar_t **val, uint_t *nelem);
int nvlist_lookup_int8_array(nvlist_t *nvl, const char *name,
int8_t **val, uint_t *nelem);
int nvlist_lookup_uint8_array(nvlist_t *nvl, const char *name,
uint8_t **val, uint_t *nelem);
int nvlist_lookup_int16_array(nvlist_t *nvl, const char *name,
int16_t **val, uint_t *nelem);
int nvlist_lookup_uint16_array(nvlist_t *nvl, const char *name,
uint16_t **val, uint_t *nelem);
int nvlist_lookup_int32_array(nvlist_t *nvl, const char *name,
int32_t **val, uint_t *nelem);
int nvlist_lookup_uint32_array(nvlist_t *nvl, const char *name,
uint32_t **val, uint_t *nelem);
int nvlist_lookup_int64_array(nvlist_t *nvl, const char *name,
int64_t **val, uint_t *nelem);
int nvlist_lookup_uint64_array(nvlist_t *nvl, const char *name,
uint64_t **val, uint_t *nelem);
int nvlist_lookup_string_array(nvlist_t *nvl, const char *name,
char ***val, uint_t *nelem);
int nvlist_lookup_nvlist_array(nvlist_t *nvl, const char *name,
nvlist_t ***val, uint_t *nelem);
int nvlist_lookup_pairs(nvlist_t *nvl, int flag...);
PARAMETERS
nvl The nvlist_t to be processed.
name Name of the name-value pair to search.
nelem Address to store the number of elements in value.
val Address to store the starting address of the value.
flag Specify bit fields defining lookup behavior:
NV_FLAG_NOENTOK The retrival function will not
fail if no matching name-value
pair is found.
DESCRIPTION
These functions find the nvpair (name-value pair) that
matches the name and type as indicated by the interface
name. If one is found, nelem and val are modified to contain
the number of elements in value and the starting address of
data, respectively.
These functions work for nvlists (lists of name-value pairs)
allocated with NV_UNIQUE_NAME or NV_UNIQUE_NAME_TYPE speci-
fied in nvlist_alloc(). (See nvlist_alloc(3NVPAIR).) If this
is not the case, the function returns ENOTSUP because the
list potentially contains multiple nvpairs with the same
name and type.
Multiple threads can simultaneously read the same nvlist_t
but only one thread can actively change a given nvlist_t at
a time. The caller is responsible for the synchronization.
All memory required for storing the array elements, includ-
ing string value, are managed by the library. References to
such data remain valid until nvlist_free() is called on nvl.
The nvlist_lookup_pairs() function retrieves a set of
nvpairs. The arguments are a null-terminated list of pairs
(data type DATA_TYPE_BOOLEAN), triples (non-array data
types) or quads (array data types). The interpretation of
the arguments depends on the value of type (see
nvpair_type(3NVPAIR)) as follows:
name Name of the name-value pair to search.
type Data type (see nvpair_type(3NVPAIR)).
val Address to store the starting address of the value.
When using data type DATA_TYPE_BOOLEAN, the val
argument is omitted.
nelem Address to store the number of elements in value.
Non-array data types have only one argument and
nelem is omitted.
The order of the arguments is name, type, [val], [nelem].
When using NV_FLAG_NOENTOK and no matching name-value pair
is found, the memory pointed to by val and nelem is left
untouched.
RETURN VALUES
These functions return 0 on success and an error value on
failure.
ERRORS
These functions will fail if:
EINVAL There is an invalid argument.
ENOENT No matching name-value pair is found
ENOTSUP An encode/decode method is not supported.
ATTRIBUTES
See attributes(5) for descriptions of the following attri-
butes:
____________________________________________________________
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
|____________________________|______________________________|
| Interface Stability | Evolving |
|____________________________|______________________________|
| MT-Level | MT-Safe |
|____________________________|______________________________|
SEE ALSO
libnvpair(3LIB), nvpair_type(3NVPAIR), attributes(5)
Name-value Pair Library Functions nvpair_value_byte(3NVPAIR)
NAME
nvpair_value_byte, nvpair_value_boolean_value,
nvpair_value_int8, nvpair_value_uint8, nvpair_value_int16,
nvpair_value_uint16, nvpair_value_int32,
nvpair_value_uint32, nvpair_value_int64,
nvpair_value_uint64, nvpair_value_double,
nvpair_value_string, nvpair_value_nvlist,
nvpair_value_boolean_array, nvpair_value_byte_array,
nvpair_value_int8_array, nvpair_value_uint8_array,
nvpair_value_int16_array, nvpair_value_uint16_array,
nvpair_value_int32_array, nvpair_value_uint32_array,
nvpair_value_int64_array, nvpair_value_uint64_array,
nvpair_value_string_array,
nvpair_value_nvlist_array - retrieve value from a name-value
pair
SYNOPSIS
cc [ flag... ] file... -lnvpair [ library... ]
#include <libnvpair.h>
int nvpair_value_byte(nvpair_t *nvpair, uchar_t *val);
int nvpair_value_boolean_value(nvpair_t *nvpair,
boolean_t *val);
int nvpair_value_int8(nvpair_t *nvpair, int8_t *val);
int nvpair_value_uint8(nvpair_t *nvpair, uint8_t *val);
int nvpair_value_int16(nvpair_t *nvpair, int16_t *val);
int nvpair_value_uint16(nvpair_t *nvpair, uint16_t *val);
int nvpair_value_int32(nvpair_t *nvpair, int32_t *val);
int nvpair_value_uint32(nvpair_t *nvpair, uint32_t *val);
int nvpair_value_int64(nvpair_t *nvpair, int64_t *val);
int nvpair_value_uint64(nvpair_t *nvpair, uint64_t *val);
int nvpair_value_double(nvpair_t *nvpair, double *val);
int nvpair_value_string(nvpair_t *nvpair, char **val);
int nvpair_value_nvlist(nvpair_t *nvpair, nvlist_t **val);
int nvpair_value_boolean_array(nvpair_t *nvpair,
boolean_t **val, uint_t *nelem);
int nvpair_value_byte_array(nvpair_t *nvpair, uchar_t **val,
uint_t *nelem);
int nvpair_value_int8_array(nvpair_t *nvpair, int8_t **val,
uint_t *nelem);
int nvpair_value_uint8_array(nvpair_t *nvpair, uint8_t **val,
uint_t *nelem);
int nvpair_value_int16_array(nvpair_t *nvpair, int16_t **val,
uint_t *nelem);
int nvpair_value_uint16_array(nvpair_t *nvpair,
uint16_t **val, uint_t *nelem);
int nvpair_value_int32_array(nvpair_t *nvpair,
int32_t **val, uint_t *nelem);
int nvpair_value_uint32_array(nvpair_t *nvpair,
uint32_t **val, uint_t *nelem);
int nvpair_value_int64_array(nvpair_t *nvpair,
int64_t **val, uint_t *nelem);
int nvpair_value_uint64_array(nvpair_t *nvpair,
uint64_t **val, uint_t *nelem);
int nvpair_value_string_array(nvpair_t *nvpair,
char ***val, uint_t *nelem);
int nvpair_value_nvlist_array(nvpair_t *nvpair,
nvlist_t ***val, uint_t *nelem);
PARAMETERS
nvpair Name-value pair to be processed.
nelem Address to store the number of elements in value.
val Address to store the value or the starting address
of the array value.
DESCRIPTION
These functions retrieve the value of nvpair. The data type
of nvpair must match the interface name for the call to be
successful.
There is no nvpair_value_boolean(); the existence of the
name implies the value is true.
For array data types, including string, the memory contain-
ing the data is managed by the library and references to the
value remains valid until nvlist_free() is called on the
nvlist_t from which nvpair is obtained. See
nvlist_free(3NVPAIR).
The value of an nvpair may not be retrieved after the nvpair
has been removed from or replaced in an nvlist. Replacement
can occur during pair additions to nvlists created with
NV_UNIQUE_NAME_TYPE and NV_UNIQUE_NAME. See
nvlist_alloc(3NVPAIR).
RETURN VALUES
These functions return 0 on success and an error value on
failure.
ERRORS
These functions will fail if:
EINVAL Either one of the arguments is NULL or the type of
nvpair does not match the function name.
ATTRIBUTES
See attributes(5) for descriptions of the following attri-
butes:
____________________________________________________________
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
|____________________________|______________________________|
| Interface Stability | Evolving |
|____________________________|______________________________|
| MT-Level | MT-Safe |
|____________________________|______________________________|
SEE ALSO
libnvpair(3LIB), nvlist_alloc(3NVPAIR), attributes(5)
These interfaces are Committed and seek patch binding.
6. Resources and Schedule
6.4. Steering Committee requested information
6.4.1. Consolidation C-team Name:
ON
6.5. ARC review type: FastTrack
6.6. ARC Exposure: open