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