Changeset View
Changeset View
Standalone View
Standalone View
head/lib/libnv/dnvlist.c
Show All 27 Lines | |||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include <stdarg.h> | #include <stdarg.h> | ||||
#include <stdbool.h> | #include <stdbool.h> | ||||
#include <stdint.h> | #include <stdint.h> | ||||
#include <stdlib.h> | |||||
#include "nv.h" | #include "nv.h" | ||||
#include "nv_impl.h" | #include "nv_impl.h" | ||||
#include "dnv.h" | #include "dnv.h" | ||||
#define DNVLIST_GET(ftype, type) \ | #define DNVLIST_GET(ftype, type) \ | ||||
ftype \ | ftype \ | ||||
dnvlist_get_##type(const nvlist_t *nvl, const char *name, ftype defval) \ | dnvlist_get_##type(const nvlist_t *nvl, const char *name, ftype defval) \ | ||||
{ \ | { \ | ||||
\ | \ | ||||
return (dnvlist_getf_##type(nvl, defval, "%s", name)); \ | if (nvlist_exists_##type(nvl, name)) \ | ||||
return (nvlist_get_##type(nvl, name)); \ | |||||
else \ | |||||
return (defval); \ | |||||
} | } | ||||
DNVLIST_GET(bool, bool) | DNVLIST_GET(bool, bool) | ||||
DNVLIST_GET(uint64_t, number) | DNVLIST_GET(uint64_t, number) | ||||
DNVLIST_GET(const char *, string) | DNVLIST_GET(const char *, string) | ||||
DNVLIST_GET(const nvlist_t *, nvlist) | DNVLIST_GET(const nvlist_t *, nvlist) | ||||
DNVLIST_GET(int, descriptor) | DNVLIST_GET(int, descriptor) | ||||
#undef DNVLIST_GET | #undef DNVLIST_GET | ||||
const void * | const void * | ||||
dnvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep, | dnvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep, | ||||
const void *defval, size_t defsize) | const void *defval, size_t defsize) | ||||
{ | { | ||||
const void *value; | |||||
return (dnvlist_getf_binary(nvl, sizep, defval, defsize, "%s", name)); | if (nvlist_exists_binary(nvl, name)) | ||||
value = nvlist_get_binary(nvl, name, sizep); | |||||
else { | |||||
if (sizep != NULL) | |||||
*sizep = defsize; | |||||
value = defval; | |||||
} | } | ||||
return (value); | |||||
} | |||||
#define DNVLIST_GETF(ftype, type) \ | #define DNVLIST_GETF(ftype, type) \ | ||||
ftype \ | ftype \ | ||||
dnvlist_getf_##type(const nvlist_t *nvl, ftype defval, \ | dnvlist_getf_##type(const nvlist_t *nvl, ftype defval, \ | ||||
const char *namefmt, ...) \ | const char *namefmt, ...) \ | ||||
{ \ | { \ | ||||
va_list nameap; \ | va_list nameap; \ | ||||
ftype value; \ | ftype value; \ | ||||
Show All 28 Lines | dnvlist_getf_binary(const nvlist_t *nvl, size_t *sizep, const void *defval, | ||||
return (value); | return (value); | ||||
} | } | ||||
#define DNVLIST_GETV(ftype, type) \ | #define DNVLIST_GETV(ftype, type) \ | ||||
ftype \ | ftype \ | ||||
dnvlist_getv_##type(const nvlist_t *nvl, ftype defval, \ | dnvlist_getv_##type(const nvlist_t *nvl, ftype defval, \ | ||||
const char *namefmt, va_list nameap) \ | const char *namefmt, va_list nameap) \ | ||||
{ \ | { \ | ||||
va_list cnameap; \ | char *name; \ | ||||
ftype value; \ | ftype value; \ | ||||
\ | \ | ||||
va_copy(cnameap, nameap); \ | vasprintf(&name, namefmt, nameap); \ | ||||
if (nvlist_existsv_##type(nvl, namefmt, cnameap)) \ | if (name == NULL) \ | ||||
value = nvlist_getv_##type(nvl, namefmt, nameap); \ | return (defval); \ | ||||
else \ | value = dnvlist_get_##type(nvl, name, defval); \ | ||||
value = defval; \ | free(name); \ | ||||
va_end(cnameap); \ | |||||
return (value); \ | return (value); \ | ||||
} | } | ||||
DNVLIST_GETV(bool, bool) | DNVLIST_GETV(bool, bool) | ||||
DNVLIST_GETV(uint64_t, number) | DNVLIST_GETV(uint64_t, number) | ||||
DNVLIST_GETV(const char *, string) | DNVLIST_GETV(const char *, string) | ||||
DNVLIST_GETV(const nvlist_t *, nvlist) | DNVLIST_GETV(const nvlist_t *, nvlist) | ||||
DNVLIST_GETV(int, descriptor) | DNVLIST_GETV(int, descriptor) | ||||
#undef DNVLIST_GETV | #undef DNVLIST_GETV | ||||
const void * | const void * | ||||
dnvlist_getv_binary(const nvlist_t *nvl, size_t *sizep, const void *defval, | dnvlist_getv_binary(const nvlist_t *nvl, size_t *sizep, const void *defval, | ||||
size_t defsize, const char *namefmt, va_list nameap) | size_t defsize, const char *namefmt, va_list nameap) | ||||
{ | { | ||||
va_list cnameap; | char *name; | ||||
const void *value; | const void *value; | ||||
va_copy(cnameap, nameap); | vasprintf(&name, namefmt, nameap); | ||||
if (nvlist_existsv_binary(nvl, namefmt, cnameap)) { | if (name != NULL) { | ||||
value = nvlist_getv_binary(nvl, sizep, namefmt, nameap); | value = dnvlist_get_binary(nvl, name, sizep, defval, defsize); | ||||
free(name); | |||||
} else { | } else { | ||||
if (sizep != NULL) | if (sizep != NULL) | ||||
*sizep = defsize; | *sizep = defsize; | ||||
value = defval; | value = defval; | ||||
} | } | ||||
va_end(cnameap); | |||||
return (value); | return (value); | ||||
} | } | ||||
#define DNVLIST_TAKE(ftype, type) \ | #define DNVLIST_TAKE(ftype, type) \ | ||||
ftype \ | ftype \ | ||||
dnvlist_take_##type(nvlist_t *nvl, const char *name, ftype defval) \ | dnvlist_take_##type(nvlist_t *nvl, const char *name, ftype defval) \ | ||||
{ \ | { \ | ||||
\ | \ | ||||
return (dnvlist_takef_##type(nvl, defval, "%s", name)); \ | if (nvlist_exists_##type(nvl, name)) \ | ||||
return (nvlist_take_##type(nvl, name)); \ | |||||
else \ | |||||
return (defval); \ | |||||
} | } | ||||
DNVLIST_TAKE(bool, bool) | DNVLIST_TAKE(bool, bool) | ||||
DNVLIST_TAKE(uint64_t, number) | DNVLIST_TAKE(uint64_t, number) | ||||
DNVLIST_TAKE(char *, string) | DNVLIST_TAKE(char *, string) | ||||
DNVLIST_TAKE(nvlist_t *, nvlist) | DNVLIST_TAKE(nvlist_t *, nvlist) | ||||
DNVLIST_TAKE(int, descriptor) | DNVLIST_TAKE(int, descriptor) | ||||
#undef DNVLIST_TAKE | #undef DNVLIST_TAKE | ||||
void * | void * | ||||
dnvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep, | dnvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep, | ||||
void *defval, size_t defsize) | void *defval, size_t defsize) | ||||
{ | { | ||||
void *value; | |||||
return (dnvlist_takef_binary(nvl, sizep, defval, defsize, "%s", name)); | if (nvlist_exists_binary(nvl, name)) | ||||
value = nvlist_take_binary(nvl, name, sizep); | |||||
else { | |||||
if (sizep != NULL) | |||||
*sizep = defsize; | |||||
value = defval; | |||||
} | } | ||||
return (value); | |||||
} | |||||
#define DNVLIST_TAKEF(ftype, type) \ | #define DNVLIST_TAKEF(ftype, type) \ | ||||
ftype \ | ftype \ | ||||
dnvlist_takef_##type(nvlist_t *nvl, ftype defval, \ | dnvlist_takef_##type(nvlist_t *nvl, ftype defval, \ | ||||
const char *namefmt, ...) \ | const char *namefmt, ...) \ | ||||
{ \ | { \ | ||||
va_list nameap; \ | va_list nameap; \ | ||||
ftype value; \ | ftype value; \ | ||||
Show All 28 Lines | dnvlist_takef_binary(nvlist_t *nvl, size_t *sizep, void *defval, | ||||
return (value); | return (value); | ||||
} | } | ||||
#define DNVLIST_TAKEV(ftype, type) \ | #define DNVLIST_TAKEV(ftype, type) \ | ||||
ftype \ | ftype \ | ||||
dnvlist_takev_##type(nvlist_t *nvl, ftype defval, const char *namefmt, \ | dnvlist_takev_##type(nvlist_t *nvl, ftype defval, const char *namefmt, \ | ||||
va_list nameap) \ | va_list nameap) \ | ||||
{ \ | { \ | ||||
va_list cnameap; \ | char *name; \ | ||||
ftype value; \ | ftype value; \ | ||||
\ | \ | ||||
va_copy(cnameap, nameap); \ | vasprintf(&name, namefmt, nameap); \ | ||||
if (nvlist_existsv_##type(nvl, namefmt, cnameap)) \ | if (name == NULL) \ | ||||
value = nvlist_takev_##type(nvl, namefmt, nameap); \ | return (defval); \ | ||||
else \ | value = dnvlist_take_##type(nvl, name, defval); \ | ||||
value = defval; \ | free(name); \ | ||||
va_end(cnameap); \ | |||||
return (value); \ | return (value); \ | ||||
} | } | ||||
DNVLIST_TAKEV(bool, bool) | DNVLIST_TAKEV(bool, bool) | ||||
DNVLIST_TAKEV(uint64_t, number) | DNVLIST_TAKEV(uint64_t, number) | ||||
DNVLIST_TAKEV(char *, string) | DNVLIST_TAKEV(char *, string) | ||||
DNVLIST_TAKEV(nvlist_t *, nvlist) | DNVLIST_TAKEV(nvlist_t *, nvlist) | ||||
DNVLIST_TAKEV(int, descriptor) | DNVLIST_TAKEV(int, descriptor) | ||||
#undef DNVLIST_TAKEV | #undef DNVLIST_TAKEV | ||||
void * | void * | ||||
dnvlist_takev_binary(nvlist_t *nvl, size_t *sizep, void *defval, | dnvlist_takev_binary(nvlist_t *nvl, size_t *sizep, void *defval, | ||||
size_t defsize, const char *namefmt, va_list nameap) | size_t defsize, const char *namefmt, va_list nameap) | ||||
{ | { | ||||
va_list cnameap; | char *name; | ||||
void *value; | void *value; | ||||
va_copy(cnameap, nameap); | vasprintf(&name, namefmt, nameap); | ||||
if (nvlist_existsv_binary(nvl, namefmt, cnameap)) { | if (name != NULL) { | ||||
value = nvlist_takev_binary(nvl, sizep, namefmt, nameap); | value = dnvlist_take_binary(nvl, name, sizep, defval, defsize); | ||||
free(name); | |||||
} else { | } else { | ||||
if (sizep != NULL) | if (sizep != NULL) | ||||
*sizep = defsize; | *sizep = defsize; | ||||
value = defval; | value = defval; | ||||
} | } | ||||
va_end(cnameap); | |||||
return (value); | return (value); | ||||
} | } |