1 | /* $NetBSD: dnvlist.c,v 1.4 2018/09/08 14:32:25 christos Exp $ */ |
2 | |
3 | /*- |
4 | * SPDX-License-Identifier: BSD-2-Clause-FreeBSD |
5 | * |
6 | * Copyright (c) 2013 The FreeBSD Foundation |
7 | * All rights reserved. |
8 | * |
9 | * This software was developed by Pawel Jakub Dawidek under sponsorship from |
10 | * the FreeBSD Foundation. |
11 | * |
12 | * Redistribution and use in source and binary forms, with or without |
13 | * modification, are permitted provided that the following conditions |
14 | * are met: |
15 | * 1. Redistributions of source code must retain the above copyright |
16 | * notice, this list of conditions and the following disclaimer. |
17 | * 2. Redistributions in binary form must reproduce the above copyright |
18 | * notice, this list of conditions and the following disclaimer in the |
19 | * documentation and/or other materials provided with the distribution. |
20 | * |
21 | * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND |
22 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
23 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
24 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE |
25 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
26 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
27 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
28 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
30 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
31 | * SUCH DAMAGE. |
32 | */ |
33 | |
34 | #include <sys/cdefs.h> |
35 | #ifdef __FreeBSD__ |
36 | __FBSDID("$FreeBSD: head/sys/contrib/libnv/dnvlist.c 328474 2018-01-27 12:58:21Z oshogbo $" ); |
37 | #else |
38 | __RCSID("$NetBSD: dnvlist.c,v 1.4 2018/09/08 14:32:25 christos Exp $" ); |
39 | #endif |
40 | |
41 | #if defined(_KERNEL) || defined(_STANDALONE) |
42 | |
43 | #include <sys/types.h> |
44 | #include <sys/param.h> |
45 | #include <sys/kernel.h> |
46 | #include <sys/systm.h> |
47 | #include <sys/malloc.h> |
48 | |
49 | #ifdef __FreeBSD__ |
50 | #include <machine/stdarg.h> |
51 | #endif |
52 | |
53 | #else |
54 | #include <stdarg.h> |
55 | #include <stdbool.h> |
56 | #include <stdint.h> |
57 | #include <stdlib.h> |
58 | #endif |
59 | |
60 | #ifdef __FreeBSD__ |
61 | #include <sys/dnv.h> |
62 | #include <sys/nv.h> |
63 | #else |
64 | #include "dnv.h" |
65 | #include "nv.h" |
66 | #endif |
67 | |
68 | #include "nv_impl.h" |
69 | |
70 | #define DNVLIST_GET(ftype, type) \ |
71 | ftype \ |
72 | dnvlist_get_##type(const nvlist_t *nvl, const char *name, ftype defval) \ |
73 | { \ |
74 | \ |
75 | if (nvlist_exists_##type(nvl, name)) \ |
76 | return (nvlist_get_##type(nvl, name)); \ |
77 | else \ |
78 | return (defval); \ |
79 | } |
80 | |
81 | DNVLIST_GET(bool, bool) |
82 | DNVLIST_GET(uint64_t, number) |
83 | DNVLIST_GET(const char *, string) |
84 | DNVLIST_GET(const nvlist_t *, nvlist) |
85 | #if !defined(_KERNEL) && !defined(_STANDALONE) |
86 | DNVLIST_GET(int, descriptor) |
87 | #endif |
88 | |
89 | #undef DNVLIST_GET |
90 | |
91 | const void * |
92 | dnvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep, |
93 | const void *defval, size_t defsize) |
94 | { |
95 | const void *value; |
96 | |
97 | if (nvlist_exists_binary(nvl, name)) |
98 | value = nvlist_get_binary(nvl, name, sizep); |
99 | else { |
100 | if (sizep != NULL) |
101 | *sizep = defsize; |
102 | value = defval; |
103 | } |
104 | return (value); |
105 | } |
106 | |
107 | #define DNVLIST_TAKE(ftype, type) \ |
108 | ftype \ |
109 | dnvlist_take_##type(nvlist_t *nvl, const char *name, ftype defval) \ |
110 | { \ |
111 | \ |
112 | if (nvlist_exists_##type(nvl, name)) \ |
113 | return (nvlist_take_##type(nvl, name)); \ |
114 | else \ |
115 | return (defval); \ |
116 | } |
117 | |
118 | DNVLIST_TAKE(bool, bool) |
119 | DNVLIST_TAKE(uint64_t, number) |
120 | DNVLIST_TAKE(char *, string) |
121 | DNVLIST_TAKE(nvlist_t *, nvlist) |
122 | #if !defined(_KERNEL) && !defined(_STANDALONE) |
123 | DNVLIST_TAKE(int, descriptor) |
124 | #endif |
125 | |
126 | #undef DNVLIST_TAKE |
127 | |
128 | void * |
129 | dnvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep, |
130 | void *defval, size_t defsize) |
131 | { |
132 | void *value; |
133 | |
134 | if (nvlist_exists_binary(nvl, name)) |
135 | value = nvlist_take_binary(nvl, name, sizep); |
136 | else { |
137 | if (sizep != NULL) |
138 | *sizep = defsize; |
139 | value = defval; |
140 | } |
141 | return (value); |
142 | } |
143 | |
144 | |