xref: /aosp_15_r20/external/libnl/include/base/nl-base-utils.h (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */
2*4dc78e53SAndroid Build Coastguard Worker /*
3*4dc78e53SAndroid Build Coastguard Worker  * Copyright (c) 2003-2012 Thomas Graf <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker  */
5*4dc78e53SAndroid Build Coastguard Worker 
6*4dc78e53SAndroid Build Coastguard Worker #ifndef __NETLINK_BASE_NL_BASE_UTILS_H__
7*4dc78e53SAndroid Build Coastguard Worker #define __NETLINK_BASE_NL_BASE_UTILS_H__
8*4dc78e53SAndroid Build Coastguard Worker 
9*4dc78e53SAndroid Build Coastguard Worker #include <byteswap.h>
10*4dc78e53SAndroid Build Coastguard Worker #include <stdlib.h>
11*4dc78e53SAndroid Build Coastguard Worker #include <stdarg.h>
12*4dc78e53SAndroid Build Coastguard Worker #include <limits.h>
13*4dc78e53SAndroid Build Coastguard Worker #include <inttypes.h>
14*4dc78e53SAndroid Build Coastguard Worker #include <assert.h>
15*4dc78e53SAndroid Build Coastguard Worker #include <unistd.h>
16*4dc78e53SAndroid Build Coastguard Worker #include <errno.h>
17*4dc78e53SAndroid Build Coastguard Worker #include <string.h>
18*4dc78e53SAndroid Build Coastguard Worker #include <stdbool.h>
19*4dc78e53SAndroid Build Coastguard Worker #include <stdint.h>
20*4dc78e53SAndroid Build Coastguard Worker #include <netinet/in.h>
21*4dc78e53SAndroid Build Coastguard Worker #include <arpa/inet.h>
22*4dc78e53SAndroid Build Coastguard Worker 
23*4dc78e53SAndroid Build Coastguard Worker #ifndef DISABLE_PTHREADS
24*4dc78e53SAndroid Build Coastguard Worker #include <pthread.h>
25*4dc78e53SAndroid Build Coastguard Worker #endif
26*4dc78e53SAndroid Build Coastguard Worker 
27*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
28*4dc78e53SAndroid Build Coastguard Worker 
29*4dc78e53SAndroid Build Coastguard Worker #if __BYTE_ORDER == __BIG_ENDIAN
30*4dc78e53SAndroid Build Coastguard Worker #define ntohll(x) (x)
31*4dc78e53SAndroid Build Coastguard Worker #elif __BYTE_ORDER == __LITTLE_ENDIAN
32*4dc78e53SAndroid Build Coastguard Worker #define ntohll(x) bswap_64((x))
33*4dc78e53SAndroid Build Coastguard Worker #endif
34*4dc78e53SAndroid Build Coastguard Worker #define htonll(x) ntohll(x)
35*4dc78e53SAndroid Build Coastguard Worker 
36*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
37*4dc78e53SAndroid Build Coastguard Worker 
38*4dc78e53SAndroid Build Coastguard Worker #define _NL_STRINGIFY_ARG(contents) #contents
39*4dc78e53SAndroid Build Coastguard Worker #define _NL_STRINGIFY(macro_or_string) _NL_STRINGIFY_ARG(macro_or_string)
40*4dc78e53SAndroid Build Coastguard Worker 
41*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
42*4dc78e53SAndroid Build Coastguard Worker 
43*4dc78e53SAndroid Build Coastguard Worker #if defined(__GNUC__)
44*4dc78e53SAndroid Build Coastguard Worker #define _NL_PRAGMA_WARNING_DO(warning) \
45*4dc78e53SAndroid Build Coastguard Worker 	_NL_STRINGIFY(GCC diagnostic ignored warning)
46*4dc78e53SAndroid Build Coastguard Worker #elif defined(__clang__)
47*4dc78e53SAndroid Build Coastguard Worker #define _NL_PRAGMA_WARNING_DO(warning) \
48*4dc78e53SAndroid Build Coastguard Worker 	_NL_STRINGIFY(clang diagnostic ignored warning)
49*4dc78e53SAndroid Build Coastguard Worker #endif
50*4dc78e53SAndroid Build Coastguard Worker 
51*4dc78e53SAndroid Build Coastguard Worker /* you can only suppress a specific warning that the compiler
52*4dc78e53SAndroid Build Coastguard Worker  * understands. Otherwise you will get another compiler warning
53*4dc78e53SAndroid Build Coastguard Worker  * about invalid pragma option.
54*4dc78e53SAndroid Build Coastguard Worker  * It's not that bad however, because gcc and clang often have the
55*4dc78e53SAndroid Build Coastguard Worker  * same name for the same warning. */
56*4dc78e53SAndroid Build Coastguard Worker 
57*4dc78e53SAndroid Build Coastguard Worker #if defined(__GNUC__) && \
58*4dc78e53SAndroid Build Coastguard Worker 	(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
59*4dc78e53SAndroid Build Coastguard Worker #define _NL_PRAGMA_WARNING_DISABLE(warning)                 \
60*4dc78e53SAndroid Build Coastguard Worker 	_Pragma("GCC diagnostic push")                      \
61*4dc78e53SAndroid Build Coastguard Worker 		_Pragma(_NL_PRAGMA_WARNING_DO("-Wpragmas")) \
62*4dc78e53SAndroid Build Coastguard Worker 			_Pragma(_NL_PRAGMA_WARNING_DO(warning))
63*4dc78e53SAndroid Build Coastguard Worker #elif defined(__clang__)
64*4dc78e53SAndroid Build Coastguard Worker #define _NL_PRAGMA_WARNING_DISABLE(warning)                                \
65*4dc78e53SAndroid Build Coastguard Worker 	_Pragma("clang diagnostic push")                                   \
66*4dc78e53SAndroid Build Coastguard Worker 		_Pragma(_NL_PRAGMA_WARNING_DO("-Wunknown-warning-option")) \
67*4dc78e53SAndroid Build Coastguard Worker 			_Pragma(_NL_PRAGMA_WARNING_DO(warning))
68*4dc78e53SAndroid Build Coastguard Worker #else
69*4dc78e53SAndroid Build Coastguard Worker #define _NL_PRAGMA_WARNING_DISABLE(warning)
70*4dc78e53SAndroid Build Coastguard Worker #endif
71*4dc78e53SAndroid Build Coastguard Worker 
72*4dc78e53SAndroid Build Coastguard Worker #if defined(__GNUC__) && \
73*4dc78e53SAndroid Build Coastguard Worker 	(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
74*4dc78e53SAndroid Build Coastguard Worker #define _NL_PRAGMA_WARNING_REENABLE _Pragma("GCC diagnostic pop")
75*4dc78e53SAndroid Build Coastguard Worker #elif defined(__clang__)
76*4dc78e53SAndroid Build Coastguard Worker #define _NL_PRAGMA_WARNING_REENABLE _Pragma("clang diagnostic pop")
77*4dc78e53SAndroid Build Coastguard Worker #else
78*4dc78e53SAndroid Build Coastguard Worker #define _NL_PRAGMA_WARNING_REENABLE
79*4dc78e53SAndroid Build Coastguard Worker #endif
80*4dc78e53SAndroid Build Coastguard Worker 
81*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
82*4dc78e53SAndroid Build Coastguard Worker 
83*4dc78e53SAndroid Build Coastguard Worker #define _nl_packed __attribute__((__packed__))
84*4dc78e53SAndroid Build Coastguard Worker #define _nl_unused __attribute__((__unused__))
85*4dc78e53SAndroid Build Coastguard Worker #define _nl_always_inline __attribute__((__always_inline__))
86*4dc78e53SAndroid Build Coastguard Worker #define _nl_used __attribute__((__used__))
87*4dc78e53SAndroid Build Coastguard Worker #define _nl_pure __attribute__((__pure__))
88*4dc78e53SAndroid Build Coastguard Worker #define _nl_const __attribute__((__const__))
89*4dc78e53SAndroid Build Coastguard Worker #define _nl_noreturn __attribute__((__noreturn__))
90*4dc78e53SAndroid Build Coastguard Worker #define _nl_warn_unused_result __attribute__((__warn_unused_result__))
91*4dc78e53SAndroid Build Coastguard Worker #define _nl_printf(a, b) __attribute__((__format__(__printf__, a, b)))
92*4dc78e53SAndroid Build Coastguard Worker #define _nl_align(s) __attribute__((__aligned__(s)))
93*4dc78e53SAndroid Build Coastguard Worker #define _nl_section(s) __attribute__((__section__(s)))
94*4dc78e53SAndroid Build Coastguard Worker #define _nl_alignof(type) __alignof(type)
95*4dc78e53SAndroid Build Coastguard Worker #define _nl_alignas(type) _nl_align(_nl_alignof(type))
96*4dc78e53SAndroid Build Coastguard Worker #define _nl_deprecated(msg) __attribute__((__deprecated__(msg)))
97*4dc78e53SAndroid Build Coastguard Worker #define _nl_init __attribute__((constructor))
98*4dc78e53SAndroid Build Coastguard Worker #define _nl_exit __attribute__((destructor))
99*4dc78e53SAndroid Build Coastguard Worker #define _nl_auto(fcn) __attribute__((__cleanup__(fcn)))
100*4dc78e53SAndroid Build Coastguard Worker 
101*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
102*4dc78e53SAndroid Build Coastguard Worker 
103*4dc78e53SAndroid Build Coastguard Worker #ifdef thread_local
104*4dc78e53SAndroid Build Coastguard Worker #define _nl_thread_local thread_local
105*4dc78e53SAndroid Build Coastguard Worker /*
106*4dc78e53SAndroid Build Coastguard Worker  * Don't break on glibc < 2.16 that doesn't define __STDC_NO_THREADS__
107*4dc78e53SAndroid Build Coastguard Worker  * see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53769
108*4dc78e53SAndroid Build Coastguard Worker  */
109*4dc78e53SAndroid Build Coastguard Worker #elif __STDC_VERSION__ >= 201112L &&                     \
110*4dc78e53SAndroid Build Coastguard Worker 	!(defined(__STDC_NO_THREADS__) ||                \
111*4dc78e53SAndroid Build Coastguard Worker 	  (defined(__GNU_LIBRARY__) && __GLIBC__ == 2 && \
112*4dc78e53SAndroid Build Coastguard Worker 	   __GLIBC_MINOR__ < 16))
113*4dc78e53SAndroid Build Coastguard Worker #define _nl_thread_local _Thread_local
114*4dc78e53SAndroid Build Coastguard Worker #else
115*4dc78e53SAndroid Build Coastguard Worker #define _nl_thread_local __thread
116*4dc78e53SAndroid Build Coastguard Worker #endif
117*4dc78e53SAndroid Build Coastguard Worker 
118*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
119*4dc78e53SAndroid Build Coastguard Worker 
120*4dc78e53SAndroid Build Coastguard Worker #define _NL_STATIC_ASSERT(cond) ((void)sizeof(char[(cond) ? 1 : -1]))
121*4dc78e53SAndroid Build Coastguard Worker 
122*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
123*4dc78e53SAndroid Build Coastguard Worker 
124*4dc78e53SAndroid Build Coastguard Worker #if defined(NL_MORE_ASSERTS) && NL_MORE_ASSERTS > 0
125*4dc78e53SAndroid Build Coastguard Worker #define _nl_assert(cond) assert(cond)
126*4dc78e53SAndroid Build Coastguard Worker #else
127*4dc78e53SAndroid Build Coastguard Worker #define _nl_assert(cond)              \
128*4dc78e53SAndroid Build Coastguard Worker 	do {                          \
129*4dc78e53SAndroid Build Coastguard Worker 		if (0) {              \
130*4dc78e53SAndroid Build Coastguard Worker 			assert(cond); \
131*4dc78e53SAndroid Build Coastguard Worker 		}                     \
132*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
133*4dc78e53SAndroid Build Coastguard Worker #endif
134*4dc78e53SAndroid Build Coastguard Worker 
135*4dc78e53SAndroid Build Coastguard Worker #define _nl_assert_not_reached() assert(0)
136*4dc78e53SAndroid Build Coastguard Worker 
137*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
138*4dc78e53SAndroid Build Coastguard Worker 
139*4dc78e53SAndroid Build Coastguard Worker #define _NL_BIT(n) (1ull << (n))
140*4dc78e53SAndroid Build Coastguard Worker 
141*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
142*4dc78e53SAndroid Build Coastguard Worker 
143*4dc78e53SAndroid Build Coastguard Worker #define _NL_PASTE_ARGS(identifier1, identifier2) identifier1##identifier2
144*4dc78e53SAndroid Build Coastguard Worker #define _NL_PASTE(identifier1, identifier2) \
145*4dc78e53SAndroid Build Coastguard Worker 	_NL_PASTE_ARGS(identifier1, identifier2)
146*4dc78e53SAndroid Build Coastguard Worker 
147*4dc78e53SAndroid Build Coastguard Worker /* Taken from systemd's UNIQ_T and UNIQ macros. */
148*4dc78e53SAndroid Build Coastguard Worker 
149*4dc78e53SAndroid Build Coastguard Worker #define _NL_UNIQ_T(x, uniq) _NL_PASTE(__unique_prefix_, _NL_PASTE(x, uniq))
150*4dc78e53SAndroid Build Coastguard Worker #define _NL_UNIQ __COUNTER__
151*4dc78e53SAndroid Build Coastguard Worker 
152*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
153*4dc78e53SAndroid Build Coastguard Worker 
154*4dc78e53SAndroid Build Coastguard Worker #define _nl_assert_addr_family_or_unspec(addr_family)             \
155*4dc78e53SAndroid Build Coastguard Worker 	do {                                                      \
156*4dc78e53SAndroid Build Coastguard Worker 		typeof(addr_family) _addr_family = (addr_family); \
157*4dc78e53SAndroid Build Coastguard Worker                                                                   \
158*4dc78e53SAndroid Build Coastguard Worker 		_nl_assert(_addr_family == AF_UNSPEC ||           \
159*4dc78e53SAndroid Build Coastguard Worker 			   _addr_family == AF_INET ||             \
160*4dc78e53SAndroid Build Coastguard Worker 			   _addr_family == AF_INET6);             \
161*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
162*4dc78e53SAndroid Build Coastguard Worker 
163*4dc78e53SAndroid Build Coastguard Worker #define _nl_assert_addr_family(addr_family)                       \
164*4dc78e53SAndroid Build Coastguard Worker 	do {                                                      \
165*4dc78e53SAndroid Build Coastguard Worker 		typeof(addr_family) _addr_family = (addr_family); \
166*4dc78e53SAndroid Build Coastguard Worker                                                                   \
167*4dc78e53SAndroid Build Coastguard Worker 		_nl_assert(_addr_family == AF_INET ||             \
168*4dc78e53SAndroid Build Coastguard Worker 			   _addr_family == AF_INET6);             \
169*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
170*4dc78e53SAndroid Build Coastguard Worker 
171*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
172*4dc78e53SAndroid Build Coastguard Worker 
173*4dc78e53SAndroid Build Coastguard Worker #define _NL_SWAP(pa, pb)                   \
174*4dc78e53SAndroid Build Coastguard Worker 	do {                               \
175*4dc78e53SAndroid Build Coastguard Worker 		typeof(*(pa)) *_pa = (pa); \
176*4dc78e53SAndroid Build Coastguard Worker 		typeof(*(pb)) *_pb = (pb); \
177*4dc78e53SAndroid Build Coastguard Worker 		typeof(*_pa) _tmp;         \
178*4dc78e53SAndroid Build Coastguard Worker                                            \
179*4dc78e53SAndroid Build Coastguard Worker 		_nl_assert(_pa);           \
180*4dc78e53SAndroid Build Coastguard Worker 		_nl_assert(_pb);           \
181*4dc78e53SAndroid Build Coastguard Worker 		_tmp = *_pa;               \
182*4dc78e53SAndroid Build Coastguard Worker 		*_pa = *_pb;               \
183*4dc78e53SAndroid Build Coastguard Worker 		*_pb = _tmp;               \
184*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
185*4dc78e53SAndroid Build Coastguard Worker 
186*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
187*4dc78e53SAndroid Build Coastguard Worker 
188*4dc78e53SAndroid Build Coastguard Worker #define _NL_N_ELEMENTS(arr) (sizeof(arr) / sizeof((arr)[0]))
189*4dc78e53SAndroid Build Coastguard Worker 
190*4dc78e53SAndroid Build Coastguard Worker #define ARRAY_SIZE(arr) _NL_N_ELEMENTS(arr)
191*4dc78e53SAndroid Build Coastguard Worker 
192*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
193*4dc78e53SAndroid Build Coastguard Worker 
194*4dc78e53SAndroid Build Coastguard Worker /* This is also defined in stddef.h */
195*4dc78e53SAndroid Build Coastguard Worker #ifndef offsetof
196*4dc78e53SAndroid Build Coastguard Worker #define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER)
197*4dc78e53SAndroid Build Coastguard Worker #endif
198*4dc78e53SAndroid Build Coastguard Worker 
199*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
200*4dc78e53SAndroid Build Coastguard Worker 
_nl_ptr_to_uintptr(const void * p)201*4dc78e53SAndroid Build Coastguard Worker static inline uintptr_t _nl_ptr_to_uintptr(const void *p)
202*4dc78e53SAndroid Build Coastguard Worker {
203*4dc78e53SAndroid Build Coastguard Worker 	/* in C, pointers can only be compared (with less-than or greater-than) under certain
204*4dc78e53SAndroid Build Coastguard Worker 	 * circumstances. Since uintptr_t is supposed to be able to represent the pointer
205*4dc78e53SAndroid Build Coastguard Worker 	 * as a plain integer and also support to convert the integer back to the pointer,
206*4dc78e53SAndroid Build Coastguard Worker 	 * it should be safer to compare the pointers directly.
207*4dc78e53SAndroid Build Coastguard Worker 	 *
208*4dc78e53SAndroid Build Coastguard Worker 	 * Of course, this function isn't very useful beyond that its use makes it clear
209*4dc78e53SAndroid Build Coastguard Worker 	 * that we want to compare pointers by value, which otherwise may not be valid. */
210*4dc78e53SAndroid Build Coastguard Worker 	return (uintptr_t)p;
211*4dc78e53SAndroid Build Coastguard Worker }
212*4dc78e53SAndroid Build Coastguard Worker 
213*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
214*4dc78e53SAndroid Build Coastguard Worker 
_nl_strcmp0(const char * s1,const char * s2)215*4dc78e53SAndroid Build Coastguard Worker static inline int _nl_strcmp0(const char *s1, const char *s2)
216*4dc78e53SAndroid Build Coastguard Worker {
217*4dc78e53SAndroid Build Coastguard Worker 	int c;
218*4dc78e53SAndroid Build Coastguard Worker 
219*4dc78e53SAndroid Build Coastguard Worker 	/* like g_strcmp0(), but this is inlinable.
220*4dc78e53SAndroid Build Coastguard Worker 	 *
221*4dc78e53SAndroid Build Coastguard Worker 	 * Also, it is guaranteed to return either -1, 0, or 1. */
222*4dc78e53SAndroid Build Coastguard Worker 	if (s1 == s2)
223*4dc78e53SAndroid Build Coastguard Worker 		return 0;
224*4dc78e53SAndroid Build Coastguard Worker 	if (!s1)
225*4dc78e53SAndroid Build Coastguard Worker 		return -1;
226*4dc78e53SAndroid Build Coastguard Worker 	if (!s2)
227*4dc78e53SAndroid Build Coastguard Worker 		return 1;
228*4dc78e53SAndroid Build Coastguard Worker 	c = strcmp(s1, s2);
229*4dc78e53SAndroid Build Coastguard Worker 	if (c < 0)
230*4dc78e53SAndroid Build Coastguard Worker 		return -1;
231*4dc78e53SAndroid Build Coastguard Worker 	if (c > 0)
232*4dc78e53SAndroid Build Coastguard Worker 		return 1;
233*4dc78e53SAndroid Build Coastguard Worker 	return 0;
234*4dc78e53SAndroid Build Coastguard Worker }
235*4dc78e53SAndroid Build Coastguard Worker 
_nl_streq(const char * a,const char * b)236*4dc78e53SAndroid Build Coastguard Worker static inline bool _nl_streq(const char *a, const char *b)
237*4dc78e53SAndroid Build Coastguard Worker {
238*4dc78e53SAndroid Build Coastguard Worker 	return !strcmp(a, b);
239*4dc78e53SAndroid Build Coastguard Worker }
240*4dc78e53SAndroid Build Coastguard Worker 
_nl_streq0(const char * a,const char * b)241*4dc78e53SAndroid Build Coastguard Worker static inline bool _nl_streq0(const char *a, const char *b)
242*4dc78e53SAndroid Build Coastguard Worker {
243*4dc78e53SAndroid Build Coastguard Worker 	return a == b || (a && b && _nl_streq(a, b));
244*4dc78e53SAndroid Build Coastguard Worker }
245*4dc78e53SAndroid Build Coastguard Worker 
_nl_memcmp(const void * s1,const void * s2,size_t n)246*4dc78e53SAndroid Build Coastguard Worker static inline int _nl_memcmp(const void *s1, const void *s2, size_t n)
247*4dc78e53SAndroid Build Coastguard Worker {
248*4dc78e53SAndroid Build Coastguard Worker 	/* Workaround undefined behavior in memcmp() with NULL pointers. */
249*4dc78e53SAndroid Build Coastguard Worker 	if (n == 0)
250*4dc78e53SAndroid Build Coastguard Worker 		return 0;
251*4dc78e53SAndroid Build Coastguard Worker 	_nl_assert(s1);
252*4dc78e53SAndroid Build Coastguard Worker 	_nl_assert(s2);
253*4dc78e53SAndroid Build Coastguard Worker 	return memcmp(s1, s2, n);
254*4dc78e53SAndroid Build Coastguard Worker }
255*4dc78e53SAndroid Build Coastguard Worker 
_nl_memeq(const void * s1,const void * s2,size_t len)256*4dc78e53SAndroid Build Coastguard Worker static inline bool _nl_memeq(const void *s1, const void *s2, size_t len)
257*4dc78e53SAndroid Build Coastguard Worker {
258*4dc78e53SAndroid Build Coastguard Worker 	return _nl_memcmp(s1, s2, len) == 0;
259*4dc78e53SAndroid Build Coastguard Worker }
260*4dc78e53SAndroid Build Coastguard Worker 
_nl_memcpy(void * restrict dest,const void * restrict src,size_t n)261*4dc78e53SAndroid Build Coastguard Worker static inline void *_nl_memcpy(void *restrict dest, const void *restrict src,
262*4dc78e53SAndroid Build Coastguard Worker 			       size_t n)
263*4dc78e53SAndroid Build Coastguard Worker {
264*4dc78e53SAndroid Build Coastguard Worker 	/* Workaround undefined behavior in memcpy() with NULL pointers. */
265*4dc78e53SAndroid Build Coastguard Worker 	if (n == 0)
266*4dc78e53SAndroid Build Coastguard Worker 		return dest;
267*4dc78e53SAndroid Build Coastguard Worker 
268*4dc78e53SAndroid Build Coastguard Worker 	_nl_assert(src);
269*4dc78e53SAndroid Build Coastguard Worker 	return memcpy(dest, src, n);
270*4dc78e53SAndroid Build Coastguard Worker }
271*4dc78e53SAndroid Build Coastguard Worker 
272*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
273*4dc78e53SAndroid Build Coastguard Worker 
274*4dc78e53SAndroid Build Coastguard Worker #define _NL_INT_IS_SIGNED(arg) (!(((typeof(arg))-1) > 0))
275*4dc78e53SAndroid Build Coastguard Worker 
276*4dc78e53SAndroid Build Coastguard Worker #define _NL_INT_SAME_SIGNEDNESS(arg1, arg2) \
277*4dc78e53SAndroid Build Coastguard Worker 	(_NL_INT_IS_SIGNED(arg1) == _NL_INT_IS_SIGNED(arg2))
278*4dc78e53SAndroid Build Coastguard Worker 
279*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
280*4dc78e53SAndroid Build Coastguard Worker 
281*4dc78e53SAndroid Build Coastguard Worker /* glib's MIN()/MAX() macros don't have function-like behavior, in that they evaluate
282*4dc78e53SAndroid Build Coastguard Worker  * the argument possibly twice.
283*4dc78e53SAndroid Build Coastguard Worker  *
284*4dc78e53SAndroid Build Coastguard Worker  * Taken from systemd's MIN()/MAX() macros. */
285*4dc78e53SAndroid Build Coastguard Worker 
286*4dc78e53SAndroid Build Coastguard Worker #define _NL_MIN(a, b) __NL_MIN(_NL_UNIQ, a, _NL_UNIQ, b)
287*4dc78e53SAndroid Build Coastguard Worker #define __NL_MIN(aq, a, bq, b)                                                 \
288*4dc78e53SAndroid Build Coastguard Worker 	({                                                                     \
289*4dc78e53SAndroid Build Coastguard Worker 		typeof(a) _NL_UNIQ_T(A, aq) = (a);                             \
290*4dc78e53SAndroid Build Coastguard Worker 		typeof(b) _NL_UNIQ_T(B, bq) = (b);                             \
291*4dc78e53SAndroid Build Coastguard Worker                                                                                \
292*4dc78e53SAndroid Build Coastguard Worker 		_NL_STATIC_ASSERT(_NL_INT_SAME_SIGNEDNESS(_NL_UNIQ_T(A, aq),   \
293*4dc78e53SAndroid Build Coastguard Worker 							  _NL_UNIQ_T(B, bq))); \
294*4dc78e53SAndroid Build Coastguard Worker                                                                                \
295*4dc78e53SAndroid Build Coastguard Worker 		((_NL_UNIQ_T(A, aq) < _NL_UNIQ_T(B, bq)) ? _NL_UNIQ_T(A, aq) : \
296*4dc78e53SAndroid Build Coastguard Worker 							   _NL_UNIQ_T(B, bq)); \
297*4dc78e53SAndroid Build Coastguard Worker 	})
298*4dc78e53SAndroid Build Coastguard Worker 
299*4dc78e53SAndroid Build Coastguard Worker #define _NL_MAX(a, b) __NL_MAX(_NL_UNIQ, a, _NL_UNIQ, b)
300*4dc78e53SAndroid Build Coastguard Worker #define __NL_MAX(aq, a, bq, b)                                                 \
301*4dc78e53SAndroid Build Coastguard Worker 	({                                                                     \
302*4dc78e53SAndroid Build Coastguard Worker 		typeof(a) _NL_UNIQ_T(A, aq) = (a);                             \
303*4dc78e53SAndroid Build Coastguard Worker 		typeof(b) _NL_UNIQ_T(B, bq) = (b);                             \
304*4dc78e53SAndroid Build Coastguard Worker                                                                                \
305*4dc78e53SAndroid Build Coastguard Worker 		_NL_STATIC_ASSERT(_NL_INT_SAME_SIGNEDNESS(_NL_UNIQ_T(A, aq),   \
306*4dc78e53SAndroid Build Coastguard Worker 							  _NL_UNIQ_T(B, bq))); \
307*4dc78e53SAndroid Build Coastguard Worker                                                                                \
308*4dc78e53SAndroid Build Coastguard Worker 		((_NL_UNIQ_T(A, aq) > _NL_UNIQ_T(B, bq)) ? _NL_UNIQ_T(A, aq) : \
309*4dc78e53SAndroid Build Coastguard Worker 							   _NL_UNIQ_T(B, bq)); \
310*4dc78e53SAndroid Build Coastguard Worker 	})
311*4dc78e53SAndroid Build Coastguard Worker 
312*4dc78e53SAndroid Build Coastguard Worker #define _NL_CLAMP(x, low, high) \
313*4dc78e53SAndroid Build Coastguard Worker 	__NL_CLAMP(_NL_UNIQ, x, _NL_UNIQ, low, _NL_UNIQ, high)
314*4dc78e53SAndroid Build Coastguard Worker #define __NL_CLAMP(xq, x, lowq, low, highq, high)                     \
315*4dc78e53SAndroid Build Coastguard Worker 	({                                                            \
316*4dc78e53SAndroid Build Coastguard Worker 		typeof(x) _NL_UNIQ_T(X, xq) = (x);                    \
317*4dc78e53SAndroid Build Coastguard Worker 		typeof(low) _NL_UNIQ_T(LOW, lowq) = (low);            \
318*4dc78e53SAndroid Build Coastguard Worker 		typeof(high) _NL_UNIQ_T(HIGH, highq) = (high);        \
319*4dc78e53SAndroid Build Coastguard Worker                                                                       \
320*4dc78e53SAndroid Build Coastguard Worker 		_NL_STATIC_ASSERT(_NL_INT_SAME_SIGNEDNESS(            \
321*4dc78e53SAndroid Build Coastguard Worker 			_NL_UNIQ_T(X, xq), _NL_UNIQ_T(LOW, lowq)));   \
322*4dc78e53SAndroid Build Coastguard Worker 		_NL_STATIC_ASSERT(_NL_INT_SAME_SIGNEDNESS(            \
323*4dc78e53SAndroid Build Coastguard Worker 			_NL_UNIQ_T(X, xq), _NL_UNIQ_T(HIGH, highq))); \
324*4dc78e53SAndroid Build Coastguard Worker                                                                       \
325*4dc78e53SAndroid Build Coastguard Worker 		((_NL_UNIQ_T(X, xq) > _NL_UNIQ_T(HIGH, highq)) ?      \
326*4dc78e53SAndroid Build Coastguard Worker 			 _NL_UNIQ_T(HIGH, highq) :                    \
327*4dc78e53SAndroid Build Coastguard Worker 		 (_NL_UNIQ_T(X, xq) < _NL_UNIQ_T(LOW, lowq)) ?        \
328*4dc78e53SAndroid Build Coastguard Worker 			 _NL_UNIQ_T(LOW, lowq) :                      \
329*4dc78e53SAndroid Build Coastguard Worker 			 _NL_UNIQ_T(X, xq));                          \
330*4dc78e53SAndroid Build Coastguard Worker 	})
331*4dc78e53SAndroid Build Coastguard Worker 
332*4dc78e53SAndroid Build Coastguard Worker #define _NL_MAX_WITH_CMP(cmp, a, b)               \
333*4dc78e53SAndroid Build Coastguard Worker 	({                                        \
334*4dc78e53SAndroid Build Coastguard Worker 		typeof(a) _a = (a);               \
335*4dc78e53SAndroid Build Coastguard Worker 		typeof(b) _b = (b);               \
336*4dc78e53SAndroid Build Coastguard Worker                                                   \
337*4dc78e53SAndroid Build Coastguard Worker 		(((cmp(_a, _b)) >= 0) ? _a : _b); \
338*4dc78e53SAndroid Build Coastguard Worker 	})
339*4dc78e53SAndroid Build Coastguard Worker 
340*4dc78e53SAndroid Build Coastguard Worker /* evaluates to (void) if _A or _B are not constant or of different types */
341*4dc78e53SAndroid Build Coastguard Worker #define _NL_CONST_MAX(_A, _B)                                            \
342*4dc78e53SAndroid Build Coastguard Worker 	(__builtin_choose_expr(                                          \
343*4dc78e53SAndroid Build Coastguard Worker 		(__builtin_constant_p(_A) && __builtin_constant_p(_B) && \
344*4dc78e53SAndroid Build Coastguard Worker 		 __builtin_types_compatible_p(typeof(_A), typeof(_B))),  \
345*4dc78e53SAndroid Build Coastguard Worker 		((_A) > (_B)) ? (_A) : (_B), ((void)0)))
346*4dc78e53SAndroid Build Coastguard Worker 
347*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
348*4dc78e53SAndroid Build Coastguard Worker 
349*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_RETURN(c)                        \
350*4dc78e53SAndroid Build Coastguard Worker 	do {                                     \
351*4dc78e53SAndroid Build Coastguard Worker 		const int _cc = (c);             \
352*4dc78e53SAndroid Build Coastguard Worker                                                  \
353*4dc78e53SAndroid Build Coastguard Worker 		if (_cc)                         \
354*4dc78e53SAndroid Build Coastguard Worker 			return _cc < 0 ? -1 : 1; \
355*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
356*4dc78e53SAndroid Build Coastguard Worker 
357*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_RETURN_DIRECT(c)                                  \
358*4dc78e53SAndroid Build Coastguard Worker 	/* Usually we want that our CMP functions return strictly
359*4dc78e53SAndroid Build Coastguard Worker 	 * -1, 0, or 1. _NL_CMP_RETURN_DIRECT() is like _NL_CMP_RETURN(),
360*4dc78e53SAndroid Build Coastguard Worker 	 *  except, it does not clamp the integer value. */ \
361*4dc78e53SAndroid Build Coastguard Worker 	do {                                                      \
362*4dc78e53SAndroid Build Coastguard Worker 		const int _cc = (c);                              \
363*4dc78e53SAndroid Build Coastguard Worker                                                                   \
364*4dc78e53SAndroid Build Coastguard Worker 		if (_cc)                                          \
365*4dc78e53SAndroid Build Coastguard Worker 			return _cc;                               \
366*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
367*4dc78e53SAndroid Build Coastguard Worker 
368*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_SELF(a, b)          \
369*4dc78e53SAndroid Build Coastguard Worker 	do {                        \
370*4dc78e53SAndroid Build Coastguard Worker 		typeof(a) _a = (a); \
371*4dc78e53SAndroid Build Coastguard Worker 		typeof(b) _b = (b); \
372*4dc78e53SAndroid Build Coastguard Worker                                     \
373*4dc78e53SAndroid Build Coastguard Worker 		if (_a == _b)       \
374*4dc78e53SAndroid Build Coastguard Worker 			return 0;   \
375*4dc78e53SAndroid Build Coastguard Worker 		if (!_a)            \
376*4dc78e53SAndroid Build Coastguard Worker 			return -1;  \
377*4dc78e53SAndroid Build Coastguard Worker 		if (!_b)            \
378*4dc78e53SAndroid Build Coastguard Worker 			return 1;   \
379*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
380*4dc78e53SAndroid Build Coastguard Worker 
381*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
382*4dc78e53SAndroid Build Coastguard Worker 
383*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_DIRECT(a, b)                                        \
384*4dc78e53SAndroid Build Coastguard Worker 	do {                                                        \
385*4dc78e53SAndroid Build Coastguard Worker 		typeof(a) _a = (a);                                 \
386*4dc78e53SAndroid Build Coastguard Worker 		typeof(b) _b = (b);                                 \
387*4dc78e53SAndroid Build Coastguard Worker                                                                     \
388*4dc78e53SAndroid Build Coastguard Worker 		_NL_STATIC_ASSERT(_NL_INT_SAME_SIGNEDNESS(_a, _b)); \
389*4dc78e53SAndroid Build Coastguard Worker                                                                     \
390*4dc78e53SAndroid Build Coastguard Worker 		if (_a != _b)                                       \
391*4dc78e53SAndroid Build Coastguard Worker 			return (_a < _b) ? -1 : 1;                  \
392*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
393*4dc78e53SAndroid Build Coastguard Worker 
394*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_DIRECT_UNSAFE(a, b)                                                     \
395*4dc78e53SAndroid Build Coastguard Worker 	/* This variant is "unsafe", because it evaluates the arguments more then once.
396*4dc78e53SAndroid Build Coastguard Worker 	 * This is only useful for bitfields, for which typeof() doesn't work.
397*4dc78e53SAndroid Build Coastguard Worker 	 * Don't use otherwise. */ \
398*4dc78e53SAndroid Build Coastguard Worker 	do {                                                                            \
399*4dc78e53SAndroid Build Coastguard Worker 		if ((a) != (b))                                                         \
400*4dc78e53SAndroid Build Coastguard Worker 			return ((a) < (b)) ? -1 : 1;                                    \
401*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
402*4dc78e53SAndroid Build Coastguard Worker 
403*4dc78e53SAndroid Build Coastguard Worker /* In the general case, direct pointer comparison is undefined behavior in C.
404*4dc78e53SAndroid Build Coastguard Worker  * Avoid that by casting pointers to void* and then to uintptr_t. This comparison
405*4dc78e53SAndroid Build Coastguard Worker  * is not really meaningful, except that it provides some kind of stable sort order
406*4dc78e53SAndroid Build Coastguard Worker  * between pointers (that can otherwise not be compared). */
407*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_DIRECT_PTR(a, b) \
408*4dc78e53SAndroid Build Coastguard Worker 	_NL_CMP_DIRECT(_nl_ptr_to_uintptr(a), _nl_ptr_to_uintptr(b))
409*4dc78e53SAndroid Build Coastguard Worker 
410*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_DIRECT_BOOL(a, b) _NL_CMP_DIRECT(!!(a), !!(b))
411*4dc78e53SAndroid Build Coastguard Worker 
412*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_DIRECT_MEMCMP(a, b, size) \
413*4dc78e53SAndroid Build Coastguard Worker 	_NL_CMP_RETURN(_nl_memcmp((a), (b), (size)))
414*4dc78e53SAndroid Build Coastguard Worker 
415*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_DIRECT_STRCMP(a, b) _NL_CMP_RETURN_DIRECT(strcmp((a), (b)))
416*4dc78e53SAndroid Build Coastguard Worker 
417*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_DIRECT_STRCMP0(a, b) \
418*4dc78e53SAndroid Build Coastguard Worker 	_NL_CMP_RETURN_DIRECT(_nl_strcmp0((a), (b)))
419*4dc78e53SAndroid Build Coastguard Worker 
420*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_DIRECT_STR_INTERNED(a, b)                                                    \
421*4dc78e53SAndroid Build Coastguard Worker 	/* This is interned strings, which are first checked for equality only using pointer
422*4dc78e53SAndroid Build Coastguard Worker      * comparison. Only in case of differences, the sort order is still determined by strcmp(). */ \
423*4dc78e53SAndroid Build Coastguard Worker 	do {                                                                                 \
424*4dc78e53SAndroid Build Coastguard Worker 		const char *const _a = (a);                                                  \
425*4dc78e53SAndroid Build Coastguard Worker 		const char *const _b = (b);                                                  \
426*4dc78e53SAndroid Build Coastguard Worker                                                                                              \
427*4dc78e53SAndroid Build Coastguard Worker 		if (_a != _b)                                                                \
428*4dc78e53SAndroid Build Coastguard Worker 			_NL_CMP_RETURN_DIRECT(_nl_strcmp0(_a, _b));                          \
429*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
430*4dc78e53SAndroid Build Coastguard Worker 
431*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_DIRECT_IN6ADDR(a, b)                                     \
432*4dc78e53SAndroid Build Coastguard Worker 	do {                                                             \
433*4dc78e53SAndroid Build Coastguard Worker 		const struct in6_addr *const _a = (a);                   \
434*4dc78e53SAndroid Build Coastguard Worker 		const struct in6_addr *const _b = (b);                   \
435*4dc78e53SAndroid Build Coastguard Worker                                                                          \
436*4dc78e53SAndroid Build Coastguard Worker 		_NL_CMP_RETURN(memcmp(_a, _b, sizeof(struct in6_addr))); \
437*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
438*4dc78e53SAndroid Build Coastguard Worker 
439*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
440*4dc78e53SAndroid Build Coastguard Worker 
441*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_FIELD(a, b, field) _NL_CMP_DIRECT(((a)->field), ((b)->field))
442*4dc78e53SAndroid Build Coastguard Worker 
443*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_FIELD_UNSAFE(a, b, field)                                               \
444*4dc78e53SAndroid Build Coastguard Worker 	/* This variant is "unsafe", because it evaluates the arguments more then once.
445*4dc78e53SAndroid Build Coastguard Worker 	 * This is only useful for bitfields, for which typeof() doesn't work.
446*4dc78e53SAndroid Build Coastguard Worker 	 * Don't use otherwise. */ \
447*4dc78e53SAndroid Build Coastguard Worker 	_NL_CMP_DIRECT_UNSAFE(((a)->field), ((b)->field))
448*4dc78e53SAndroid Build Coastguard Worker 
449*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_FIELD_BOOL(a, b, field) \
450*4dc78e53SAndroid Build Coastguard Worker 	_NL_CMP_DIRECT_BOOL(((a)->field), ((b)->field))
451*4dc78e53SAndroid Build Coastguard Worker 
452*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_FIELD_STR(a, b, field) \
453*4dc78e53SAndroid Build Coastguard Worker 	_NL_CMP_DIRECT_STRCMP(((a)->field), ((b)->field))
454*4dc78e53SAndroid Build Coastguard Worker 
455*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_FIELD_STR0(a, b, field) \
456*4dc78e53SAndroid Build Coastguard Worker 	_NL_CMP_DIRECT_STRCMP0(((a)->field), ((b)->field))
457*4dc78e53SAndroid Build Coastguard Worker 
458*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_FIELD_STR_INTERNED(a, b, field) \
459*4dc78e53SAndroid Build Coastguard Worker 	_NL_CMP_DIRECT_STR_INTERNED(((a)->field), ((b)->field))
460*4dc78e53SAndroid Build Coastguard Worker 
461*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_FIELD_MEMCMP_LEN(a, b, field, len)          \
462*4dc78e53SAndroid Build Coastguard Worker 	_NL_CMP_DIRECT_MEMCMP(&((a)->field), &((b)->field), \
463*4dc78e53SAndroid Build Coastguard Worker 			      _NL_MIN(len, sizeof((a)->field)))
464*4dc78e53SAndroid Build Coastguard Worker 
465*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_FIELD_MEMCMP(a, b, field) \
466*4dc78e53SAndroid Build Coastguard Worker 	_NL_CMP_DIRECT_MEMCMP(&((a)->field), &((b)->field), sizeof((a)->field))
467*4dc78e53SAndroid Build Coastguard Worker 
468*4dc78e53SAndroid Build Coastguard Worker #define _NL_CMP_FIELD_IN6ADDR(a, b, field) \
469*4dc78e53SAndroid Build Coastguard Worker 	_NL_CMP_DIRECT_IN6ADDR(&((a)->field), &((b)->field))
470*4dc78e53SAndroid Build Coastguard Worker 
471*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
472*4dc78e53SAndroid Build Coastguard Worker 
473*4dc78e53SAndroid Build Coastguard Worker /* internal macro to calculate the size of a struct @type up to (and including) @field.
474*4dc78e53SAndroid Build Coastguard Worker  * this will be used for .minlen policy fields, so that we require only a field of up
475*4dc78e53SAndroid Build Coastguard Worker  * to the given size. */
476*4dc78e53SAndroid Build Coastguard Worker #define _nl_offsetofend(type, field) \
477*4dc78e53SAndroid Build Coastguard Worker 	(offsetof(type, field) + sizeof(((type *)NULL)->field))
478*4dc78e53SAndroid Build Coastguard Worker 
479*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
480*4dc78e53SAndroid Build Coastguard Worker 
481*4dc78e53SAndroid Build Coastguard Worker #define _nl_clear_pointer(pp, destroy)                                         \
482*4dc78e53SAndroid Build Coastguard Worker 	({                                                                     \
483*4dc78e53SAndroid Build Coastguard Worker 		__typeof__(*(pp)) *_pp = (pp);                                 \
484*4dc78e53SAndroid Build Coastguard Worker 		__typeof__(*_pp) _p;                                           \
485*4dc78e53SAndroid Build Coastguard Worker 		int _changed = 0;                                              \
486*4dc78e53SAndroid Build Coastguard Worker                                                                                \
487*4dc78e53SAndroid Build Coastguard Worker 		if (_pp && (_p = *_pp)) {                                      \
488*4dc78e53SAndroid Build Coastguard Worker 			_nl_unused const void *const _p_check_is_pointer = _p; \
489*4dc78e53SAndroid Build Coastguard Worker                                                                                \
490*4dc78e53SAndroid Build Coastguard Worker 			*_pp = NULL;                                           \
491*4dc78e53SAndroid Build Coastguard Worker                                                                                \
492*4dc78e53SAndroid Build Coastguard Worker 			(destroy)(_p);                                         \
493*4dc78e53SAndroid Build Coastguard Worker                                                                                \
494*4dc78e53SAndroid Build Coastguard Worker 			_changed = 1;                                          \
495*4dc78e53SAndroid Build Coastguard Worker 		}                                                              \
496*4dc78e53SAndroid Build Coastguard Worker 		_changed;                                                      \
497*4dc78e53SAndroid Build Coastguard Worker 	})
498*4dc78e53SAndroid Build Coastguard Worker 
499*4dc78e53SAndroid Build Coastguard Worker #define _nl_clear_free(pp) _nl_clear_pointer(pp, free)
500*4dc78e53SAndroid Build Coastguard Worker 
501*4dc78e53SAndroid Build Coastguard Worker #define _nl_steal_pointer(pp)                        \
502*4dc78e53SAndroid Build Coastguard Worker 	({                                           \
503*4dc78e53SAndroid Build Coastguard Worker 		__typeof__(*(pp)) *const _pp = (pp); \
504*4dc78e53SAndroid Build Coastguard Worker 		__typeof__(*_pp) _p = NULL;          \
505*4dc78e53SAndroid Build Coastguard Worker                                                      \
506*4dc78e53SAndroid Build Coastguard Worker 		if (_pp && (_p = *_pp)) {            \
507*4dc78e53SAndroid Build Coastguard Worker 			*_pp = NULL;                 \
508*4dc78e53SAndroid Build Coastguard Worker 		}                                    \
509*4dc78e53SAndroid Build Coastguard Worker                                                      \
510*4dc78e53SAndroid Build Coastguard Worker 		_p;                                  \
511*4dc78e53SAndroid Build Coastguard Worker 	})
512*4dc78e53SAndroid Build Coastguard Worker 
513*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
514*4dc78e53SAndroid Build Coastguard Worker 
515*4dc78e53SAndroid Build Coastguard Worker #define _nl_malloc_maybe_a(alloca_maxlen, bytes, to_free)  \
516*4dc78e53SAndroid Build Coastguard Worker 	({                                                 \
517*4dc78e53SAndroid Build Coastguard Worker 		const size_t _bytes = (bytes);             \
518*4dc78e53SAndroid Build Coastguard Worker 		__typeof__(to_free) _to_free = (to_free);  \
519*4dc78e53SAndroid Build Coastguard Worker 		__typeof__(*_to_free) _ptr;                \
520*4dc78e53SAndroid Build Coastguard Worker                                                            \
521*4dc78e53SAndroid Build Coastguard Worker 		_NL_STATIC_ASSERT((alloca_maxlen) <= 500); \
522*4dc78e53SAndroid Build Coastguard Worker 		_nl_assert(_to_free && !*_to_free);        \
523*4dc78e53SAndroid Build Coastguard Worker                                                            \
524*4dc78e53SAndroid Build Coastguard Worker 		if (_bytes <= (alloca_maxlen)) {           \
525*4dc78e53SAndroid Build Coastguard Worker 			_ptr = alloca(_bytes);             \
526*4dc78e53SAndroid Build Coastguard Worker 		} else {                                   \
527*4dc78e53SAndroid Build Coastguard Worker 			_ptr = malloc(_bytes);             \
528*4dc78e53SAndroid Build Coastguard Worker 			*_to_free = _ptr;                  \
529*4dc78e53SAndroid Build Coastguard Worker 		};                                         \
530*4dc78e53SAndroid Build Coastguard Worker                                                            \
531*4dc78e53SAndroid Build Coastguard Worker 		_ptr;                                      \
532*4dc78e53SAndroid Build Coastguard Worker 	})
533*4dc78e53SAndroid Build Coastguard Worker 
534*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
535*4dc78e53SAndroid Build Coastguard Worker 
_nl_strncpy_trunc(char * dst,const char * src,size_t len)536*4dc78e53SAndroid Build Coastguard Worker static inline char *_nl_strncpy_trunc(char *dst, const char *src, size_t len)
537*4dc78e53SAndroid Build Coastguard Worker {
538*4dc78e53SAndroid Build Coastguard Worker 	/* we don't use/reimplement strlcpy(), because we want the fill-all-with-NUL
539*4dc78e53SAndroid Build Coastguard Worker 	 * behavior of strncpy(). This is just strncpy() with gracefully handling truncation
540*4dc78e53SAndroid Build Coastguard Worker 	 * (and disabling the "-Wstringop-truncation" warning).
541*4dc78e53SAndroid Build Coastguard Worker 	 *
542*4dc78e53SAndroid Build Coastguard Worker 	 * Note that truncation is silently accepted.
543*4dc78e53SAndroid Build Coastguard Worker 	 */
544*4dc78e53SAndroid Build Coastguard Worker 
545*4dc78e53SAndroid Build Coastguard Worker 	_NL_PRAGMA_WARNING_DISABLE("-Wstringop-truncation");
546*4dc78e53SAndroid Build Coastguard Worker 	_NL_PRAGMA_WARNING_DISABLE("-Wstringop-overflow");
547*4dc78e53SAndroid Build Coastguard Worker 
548*4dc78e53SAndroid Build Coastguard Worker 	if (len > 0) {
549*4dc78e53SAndroid Build Coastguard Worker 		_nl_assert(dst);
550*4dc78e53SAndroid Build Coastguard Worker 		_nl_assert(src);
551*4dc78e53SAndroid Build Coastguard Worker 
552*4dc78e53SAndroid Build Coastguard Worker 		strncpy(dst, src, len);
553*4dc78e53SAndroid Build Coastguard Worker 
554*4dc78e53SAndroid Build Coastguard Worker 		dst[len - 1] = '\0';
555*4dc78e53SAndroid Build Coastguard Worker 	}
556*4dc78e53SAndroid Build Coastguard Worker 
557*4dc78e53SAndroid Build Coastguard Worker 	_NL_PRAGMA_WARNING_REENABLE;
558*4dc78e53SAndroid Build Coastguard Worker 	_NL_PRAGMA_WARNING_REENABLE;
559*4dc78e53SAndroid Build Coastguard Worker 
560*4dc78e53SAndroid Build Coastguard Worker 	return dst;
561*4dc78e53SAndroid Build Coastguard Worker }
562*4dc78e53SAndroid Build Coastguard Worker 
_nl_strncpy_assert(char * dst,const char * src,size_t len)563*4dc78e53SAndroid Build Coastguard Worker static inline char *_nl_strncpy_assert(char *dst, const char *src, size_t len)
564*4dc78e53SAndroid Build Coastguard Worker {
565*4dc78e53SAndroid Build Coastguard Worker 	/* we don't use/reimplement strlcpy(), because we want the fill-all-with-NUL
566*4dc78e53SAndroid Build Coastguard Worker 	 * behavior of strncpy(). This is just strncpy() with assertion against truncation
567*4dc78e53SAndroid Build Coastguard Worker 	 * (and disabling the "-Wstringop-truncation" warning).
568*4dc78e53SAndroid Build Coastguard Worker 	 *
569*4dc78e53SAndroid Build Coastguard Worker 	 * Note that truncation is still a bug and there is an _nl_assert()
570*4dc78e53SAndroid Build Coastguard Worker 	 * against that.
571*4dc78e53SAndroid Build Coastguard Worker 	 */
572*4dc78e53SAndroid Build Coastguard Worker 
573*4dc78e53SAndroid Build Coastguard Worker 	_NL_PRAGMA_WARNING_DISABLE("-Wstringop-truncation");
574*4dc78e53SAndroid Build Coastguard Worker 	_NL_PRAGMA_WARNING_DISABLE("-Wstringop-overflow");
575*4dc78e53SAndroid Build Coastguard Worker 
576*4dc78e53SAndroid Build Coastguard Worker 	if (len > 0) {
577*4dc78e53SAndroid Build Coastguard Worker 		_nl_assert(dst);
578*4dc78e53SAndroid Build Coastguard Worker 		_nl_assert(src);
579*4dc78e53SAndroid Build Coastguard Worker 
580*4dc78e53SAndroid Build Coastguard Worker 		strncpy(dst, src, len);
581*4dc78e53SAndroid Build Coastguard Worker 
582*4dc78e53SAndroid Build Coastguard Worker 		_nl_assert(dst[len - 1] == '\0');
583*4dc78e53SAndroid Build Coastguard Worker 
584*4dc78e53SAndroid Build Coastguard Worker 		dst[len - 1] = '\0';
585*4dc78e53SAndroid Build Coastguard Worker 	}
586*4dc78e53SAndroid Build Coastguard Worker 
587*4dc78e53SAndroid Build Coastguard Worker 	_NL_PRAGMA_WARNING_REENABLE;
588*4dc78e53SAndroid Build Coastguard Worker 	_NL_PRAGMA_WARNING_REENABLE;
589*4dc78e53SAndroid Build Coastguard Worker 
590*4dc78e53SAndroid Build Coastguard Worker 	return dst;
591*4dc78e53SAndroid Build Coastguard Worker }
592*4dc78e53SAndroid Build Coastguard Worker 
593*4dc78e53SAndroid Build Coastguard Worker #define _NL_RETURN_ON_ERR(cmd)       \
594*4dc78e53SAndroid Build Coastguard Worker 	do {                         \
595*4dc78e53SAndroid Build Coastguard Worker 		int _err;            \
596*4dc78e53SAndroid Build Coastguard Worker                                      \
597*4dc78e53SAndroid Build Coastguard Worker 		_err = (cmd);        \
598*4dc78e53SAndroid Build Coastguard Worker 		if (_err < 0)        \
599*4dc78e53SAndroid Build Coastguard Worker 			return _err; \
600*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
601*4dc78e53SAndroid Build Coastguard Worker 
602*4dc78e53SAndroid Build Coastguard Worker #define _NL_RETURN_E_ON_ERR(e, cmd)                 \
603*4dc78e53SAndroid Build Coastguard Worker 	do {                                        \
604*4dc78e53SAndroid Build Coastguard Worker 		int _err;                           \
605*4dc78e53SAndroid Build Coastguard Worker                                                     \
606*4dc78e53SAndroid Build Coastguard Worker 		_err = (cmd);                       \
607*4dc78e53SAndroid Build Coastguard Worker 		if (_err < 0) {                     \
608*4dc78e53SAndroid Build Coastguard Worker 			_NL_STATIC_ASSERT((e) > 0); \
609*4dc78e53SAndroid Build Coastguard Worker 			return -(e);                \
610*4dc78e53SAndroid Build Coastguard Worker 		}                                   \
611*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
612*4dc78e53SAndroid Build Coastguard Worker 
613*4dc78e53SAndroid Build Coastguard Worker /* _NL_RETURN_ON_PUT_ERR() shall only be used with a put command (nla_put or nlmsg_append).
614*4dc78e53SAndroid Build Coastguard Worker  * These commands can either fail with a regular error code (which gets propagated)
615*4dc78e53SAndroid Build Coastguard Worker  * or with -NLE_NOMEM. However, they don't really try to allocate memory, so we don't
616*4dc78e53SAndroid Build Coastguard Worker  * want to propagate -NLE_NOMEM. Instead, we coerce such failure to -NLE_MSGSIZE. */
617*4dc78e53SAndroid Build Coastguard Worker #define _NL_RETURN_ON_PUT_ERR(put_cmd)                                                                  \
618*4dc78e53SAndroid Build Coastguard Worker 	do {                                                                                            \
619*4dc78e53SAndroid Build Coastguard Worker 		int _err;                                                                               \
620*4dc78e53SAndroid Build Coastguard Worker                                                                                                         \
621*4dc78e53SAndroid Build Coastguard Worker 		_err = (put_cmd);                                                                       \
622*4dc78e53SAndroid Build Coastguard Worker 		if (_err < 0) {                                                                         \
623*4dc78e53SAndroid Build Coastguard Worker 			if (_err == -NLE_NOMEM) {                                                       \
624*4dc78e53SAndroid Build Coastguard Worker 				/* nla_put() returns -NLE_NOMEM in case of out of buffer size. We don't
625*4dc78e53SAndroid Build Coastguard Worker 				 * want to propagate that error and map it to -NLE_MSGSIZE. */ \
626*4dc78e53SAndroid Build Coastguard Worker 				return -NLE_MSGSIZE;                                                    \
627*4dc78e53SAndroid Build Coastguard Worker 			}                                                                               \
628*4dc78e53SAndroid Build Coastguard Worker 			/* any other error can only be due to invalid parameters. Propagate the
629*4dc78e53SAndroid Build Coastguard Worker 			 * error, however also assert that it cannot be reached. */         \
630*4dc78e53SAndroid Build Coastguard Worker 			_nl_assert_not_reached();                                                       \
631*4dc78e53SAndroid Build Coastguard Worker 			return _err;                                                                    \
632*4dc78e53SAndroid Build Coastguard Worker 		} else                                                                                  \
633*4dc78e53SAndroid Build Coastguard Worker 			_nl_assert(_err == 0);                                                          \
634*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
635*4dc78e53SAndroid Build Coastguard Worker 
_nl_close(int fd)636*4dc78e53SAndroid Build Coastguard Worker static inline int _nl_close(int fd)
637*4dc78e53SAndroid Build Coastguard Worker {
638*4dc78e53SAndroid Build Coastguard Worker 	int r;
639*4dc78e53SAndroid Build Coastguard Worker 
640*4dc78e53SAndroid Build Coastguard Worker 	r = close(fd);
641*4dc78e53SAndroid Build Coastguard Worker 	_nl_assert(r == 0 || fd < 0 || errno != EBADF);
642*4dc78e53SAndroid Build Coastguard Worker 	return r;
643*4dc78e53SAndroid Build Coastguard Worker }
644*4dc78e53SAndroid Build Coastguard Worker 
_nl_memdup(const void * ptr,size_t len)645*4dc78e53SAndroid Build Coastguard Worker static inline void *_nl_memdup(const void *ptr, size_t len)
646*4dc78e53SAndroid Build Coastguard Worker {
647*4dc78e53SAndroid Build Coastguard Worker 	void *p;
648*4dc78e53SAndroid Build Coastguard Worker 
649*4dc78e53SAndroid Build Coastguard Worker 	if (len == 0) {
650*4dc78e53SAndroid Build Coastguard Worker 		/* malloc() leaves it implementation defined whether to return NULL.
651*4dc78e53SAndroid Build Coastguard Worker 		 * Callers rely on returning NULL if len is zero. */
652*4dc78e53SAndroid Build Coastguard Worker 		return NULL;
653*4dc78e53SAndroid Build Coastguard Worker 	}
654*4dc78e53SAndroid Build Coastguard Worker 
655*4dc78e53SAndroid Build Coastguard Worker 	p = malloc(len);
656*4dc78e53SAndroid Build Coastguard Worker 	if (!p)
657*4dc78e53SAndroid Build Coastguard Worker 		return NULL;
658*4dc78e53SAndroid Build Coastguard Worker 	memcpy(p, ptr, len);
659*4dc78e53SAndroid Build Coastguard Worker 	return p;
660*4dc78e53SAndroid Build Coastguard Worker }
661*4dc78e53SAndroid Build Coastguard Worker 
662*4dc78e53SAndroid Build Coastguard Worker #define _nl_memdup_ptr(ptr) ((__typeof__(ptr))_nl_memdup((ptr), sizeof(*(ptr))))
663*4dc78e53SAndroid Build Coastguard Worker 
664*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
665*4dc78e53SAndroid Build Coastguard Worker 
_nl_addr_family_to_size(int addr_family)666*4dc78e53SAndroid Build Coastguard Worker static inline size_t _nl_addr_family_to_size(int addr_family)
667*4dc78e53SAndroid Build Coastguard Worker {
668*4dc78e53SAndroid Build Coastguard Worker 	if (addr_family == AF_INET)
669*4dc78e53SAndroid Build Coastguard Worker 		return sizeof(in_addr_t);
670*4dc78e53SAndroid Build Coastguard Worker 	if (addr_family == AF_INET6)
671*4dc78e53SAndroid Build Coastguard Worker 		return sizeof(struct in6_addr);
672*4dc78e53SAndroid Build Coastguard Worker 	return 0;
673*4dc78e53SAndroid Build Coastguard Worker }
674*4dc78e53SAndroid Build Coastguard Worker 
675*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
676*4dc78e53SAndroid Build Coastguard Worker 
677*4dc78e53SAndroid Build Coastguard Worker typedef union {
678*4dc78e53SAndroid Build Coastguard Worker 	in_addr_t addr4;
679*4dc78e53SAndroid Build Coastguard Worker 	struct in_addr a4;
680*4dc78e53SAndroid Build Coastguard Worker 	struct in6_addr a6;
681*4dc78e53SAndroid Build Coastguard Worker } _NLIPAddr;
682*4dc78e53SAndroid Build Coastguard Worker 
_nl_inet_ntop(int addr_family,const void * addr,char * buf)683*4dc78e53SAndroid Build Coastguard Worker static inline char *_nl_inet_ntop(int addr_family, const void *addr, char *buf)
684*4dc78e53SAndroid Build Coastguard Worker {
685*4dc78e53SAndroid Build Coastguard Worker 	char *r;
686*4dc78e53SAndroid Build Coastguard Worker 
687*4dc78e53SAndroid Build Coastguard Worker 	_nl_assert_addr_family(addr_family);
688*4dc78e53SAndroid Build Coastguard Worker 	_nl_assert(addr);
689*4dc78e53SAndroid Build Coastguard Worker 
690*4dc78e53SAndroid Build Coastguard Worker 	/* inet_ntop() is documented to fail, but if we pass a known address family
691*4dc78e53SAndroid Build Coastguard Worker 	 * and a suitably large buffer, it cannot. Assert for that. */
692*4dc78e53SAndroid Build Coastguard Worker 
693*4dc78e53SAndroid Build Coastguard Worker 	r = (char *)inet_ntop(addr_family, addr, buf,
694*4dc78e53SAndroid Build Coastguard Worker 			      (addr_family == AF_INET) ? INET_ADDRSTRLEN :
695*4dc78e53SAndroid Build Coastguard Worker 							 INET6_ADDRSTRLEN);
696*4dc78e53SAndroid Build Coastguard Worker 	_nl_assert(r == buf);
697*4dc78e53SAndroid Build Coastguard Worker 	_nl_assert(strlen(r) < ((addr_family == AF_INET) ? INET_ADDRSTRLEN :
698*4dc78e53SAndroid Build Coastguard Worker 							   INET6_ADDRSTRLEN));
699*4dc78e53SAndroid Build Coastguard Worker 
700*4dc78e53SAndroid Build Coastguard Worker 	return r;
701*4dc78e53SAndroid Build Coastguard Worker }
702*4dc78e53SAndroid Build Coastguard Worker 
_nl_inet_ntop_dup(int addr_family,const void * addr)703*4dc78e53SAndroid Build Coastguard Worker static inline char *_nl_inet_ntop_dup(int addr_family, const void *addr)
704*4dc78e53SAndroid Build Coastguard Worker {
705*4dc78e53SAndroid Build Coastguard Worker 	return (char *)_nl_inet_ntop(addr_family, addr,
706*4dc78e53SAndroid Build Coastguard Worker 				     malloc((addr_family == AF_INET) ?
707*4dc78e53SAndroid Build Coastguard Worker 						    INET_ADDRSTRLEN :
708*4dc78e53SAndroid Build Coastguard Worker 						    INET6_ADDRSTRLEN));
709*4dc78e53SAndroid Build Coastguard Worker }
710*4dc78e53SAndroid Build Coastguard Worker 
711*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
712*4dc78e53SAndroid Build Coastguard Worker 
713*4dc78e53SAndroid Build Coastguard Worker #define _NL_AUTO_DEFINE_FCN_VOID0(CastType, name, func) \
714*4dc78e53SAndroid Build Coastguard Worker 	static inline void name(void *v)                \
715*4dc78e53SAndroid Build Coastguard Worker 	{                                               \
716*4dc78e53SAndroid Build Coastguard Worker 		if (*((CastType *)v))                   \
717*4dc78e53SAndroid Build Coastguard Worker 			func(*((CastType *)v));         \
718*4dc78e53SAndroid Build Coastguard Worker 	}                                               \
719*4dc78e53SAndroid Build Coastguard Worker 	struct _nl_dummy_for_tailing_semicolon
720*4dc78e53SAndroid Build Coastguard Worker 
721*4dc78e53SAndroid Build Coastguard Worker #define _NL_AUTO_DEFINE_FCN_STRUCT(CastType, name, func) \
722*4dc78e53SAndroid Build Coastguard Worker 	static inline void name(CastType *v)             \
723*4dc78e53SAndroid Build Coastguard Worker 	{                                                \
724*4dc78e53SAndroid Build Coastguard Worker 		if (v)                                   \
725*4dc78e53SAndroid Build Coastguard Worker 			func(v);                         \
726*4dc78e53SAndroid Build Coastguard Worker 	}                                                \
727*4dc78e53SAndroid Build Coastguard Worker 	struct _nl_dummy_for_tailing_semicolon
728*4dc78e53SAndroid Build Coastguard Worker 
729*4dc78e53SAndroid Build Coastguard Worker #define _NL_AUTO_DEFINE_FCN_TYPED0(CastType, name, func) \
730*4dc78e53SAndroid Build Coastguard Worker 	static inline void name(CastType *v)             \
731*4dc78e53SAndroid Build Coastguard Worker 	{                                                \
732*4dc78e53SAndroid Build Coastguard Worker 		if (*v)                                  \
733*4dc78e53SAndroid Build Coastguard Worker 			func(*v);                        \
734*4dc78e53SAndroid Build Coastguard Worker 	}                                                \
735*4dc78e53SAndroid Build Coastguard Worker 	struct _nl_dummy_for_tailing_semicolon
736*4dc78e53SAndroid Build Coastguard Worker 
737*4dc78e53SAndroid Build Coastguard Worker #define _NL_AUTO_DEFINE_FCN_INDIRECT0(CastType, name, func) \
738*4dc78e53SAndroid Build Coastguard Worker 	static inline void name(CastType *v)                \
739*4dc78e53SAndroid Build Coastguard Worker 	{                                                   \
740*4dc78e53SAndroid Build Coastguard Worker 		if (*v)                                     \
741*4dc78e53SAndroid Build Coastguard Worker 			func(v);                            \
742*4dc78e53SAndroid Build Coastguard Worker 	}                                                   \
743*4dc78e53SAndroid Build Coastguard Worker 	struct _nl_dummy_for_tailing_semicolon
744*4dc78e53SAndroid Build Coastguard Worker 
745*4dc78e53SAndroid Build Coastguard Worker #define _nl_auto_free _nl_auto(_nl_auto_free_fcn)
746*4dc78e53SAndroid Build Coastguard Worker _NL_AUTO_DEFINE_FCN_VOID0(void *, _nl_auto_free_fcn, free);
747*4dc78e53SAndroid Build Coastguard Worker 
748*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
749*4dc78e53SAndroid Build Coastguard Worker 
750*4dc78e53SAndroid Build Coastguard Worker #define NSEC_PER_SEC 1000000000L
751*4dc78e53SAndroid Build Coastguard Worker 
752*4dc78e53SAndroid Build Coastguard Worker struct trans_tbl {
753*4dc78e53SAndroid Build Coastguard Worker 	uint64_t i;
754*4dc78e53SAndroid Build Coastguard Worker 	const char *a;
755*4dc78e53SAndroid Build Coastguard Worker };
756*4dc78e53SAndroid Build Coastguard Worker 
757*4dc78e53SAndroid Build Coastguard Worker #define __ADD(id, name) { .i = id, .a = #name }
758*4dc78e53SAndroid Build Coastguard Worker 
759*4dc78e53SAndroid Build Coastguard Worker #define BUG()                                                                \
760*4dc78e53SAndroid Build Coastguard Worker 	do {                                                                 \
761*4dc78e53SAndroid Build Coastguard Worker 		fprintf(stderr, "BUG at file position %s:%d:%s\n", __FILE__, \
762*4dc78e53SAndroid Build Coastguard Worker 			__LINE__, __func__);                                 \
763*4dc78e53SAndroid Build Coastguard Worker 		assert(0);                                                   \
764*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
765*4dc78e53SAndroid Build Coastguard Worker 
766*4dc78e53SAndroid Build Coastguard Worker #define BUG_ON(condition)      \
767*4dc78e53SAndroid Build Coastguard Worker 	do {                   \
768*4dc78e53SAndroid Build Coastguard Worker 		if (condition) \
769*4dc78e53SAndroid Build Coastguard Worker 			BUG(); \
770*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
771*4dc78e53SAndroid Build Coastguard Worker 
772*4dc78e53SAndroid Build Coastguard Worker #define APPBUG(msg)                                                          \
773*4dc78e53SAndroid Build Coastguard Worker 	do {                                                                 \
774*4dc78e53SAndroid Build Coastguard Worker 		fprintf(stderr, "APPLICATION BUG: %s:%d:%s: %s\n", __FILE__, \
775*4dc78e53SAndroid Build Coastguard Worker 			__LINE__, __func__, msg);                            \
776*4dc78e53SAndroid Build Coastguard Worker 		assert(0);                                                   \
777*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
778*4dc78e53SAndroid Build Coastguard Worker 
779*4dc78e53SAndroid Build Coastguard Worker /*****************************************************************************/
780*4dc78e53SAndroid Build Coastguard Worker 
781*4dc78e53SAndroid Build Coastguard Worker #ifndef DISABLE_PTHREADS
782*4dc78e53SAndroid Build Coastguard Worker #define NL_LOCK(NAME) pthread_mutex_t(NAME) = PTHREAD_MUTEX_INITIALIZER
783*4dc78e53SAndroid Build Coastguard Worker #define NL_RW_LOCK(NAME) pthread_rwlock_t(NAME) = PTHREAD_RWLOCK_INITIALIZER
784*4dc78e53SAndroid Build Coastguard Worker 
nl_lock(pthread_mutex_t * lock)785*4dc78e53SAndroid Build Coastguard Worker static inline void nl_lock(pthread_mutex_t *lock)
786*4dc78e53SAndroid Build Coastguard Worker {
787*4dc78e53SAndroid Build Coastguard Worker 	pthread_mutex_lock(lock);
788*4dc78e53SAndroid Build Coastguard Worker }
789*4dc78e53SAndroid Build Coastguard Worker 
nl_unlock(pthread_mutex_t * lock)790*4dc78e53SAndroid Build Coastguard Worker static inline void nl_unlock(pthread_mutex_t *lock)
791*4dc78e53SAndroid Build Coastguard Worker {
792*4dc78e53SAndroid Build Coastguard Worker 	pthread_mutex_unlock(lock);
793*4dc78e53SAndroid Build Coastguard Worker }
794*4dc78e53SAndroid Build Coastguard Worker 
nl_read_lock(pthread_rwlock_t * lock)795*4dc78e53SAndroid Build Coastguard Worker static inline void nl_read_lock(pthread_rwlock_t *lock)
796*4dc78e53SAndroid Build Coastguard Worker {
797*4dc78e53SAndroid Build Coastguard Worker 	pthread_rwlock_rdlock(lock);
798*4dc78e53SAndroid Build Coastguard Worker }
799*4dc78e53SAndroid Build Coastguard Worker 
nl_read_unlock(pthread_rwlock_t * lock)800*4dc78e53SAndroid Build Coastguard Worker static inline void nl_read_unlock(pthread_rwlock_t *lock)
801*4dc78e53SAndroid Build Coastguard Worker {
802*4dc78e53SAndroid Build Coastguard Worker 	pthread_rwlock_unlock(lock);
803*4dc78e53SAndroid Build Coastguard Worker }
804*4dc78e53SAndroid Build Coastguard Worker 
nl_write_lock(pthread_rwlock_t * lock)805*4dc78e53SAndroid Build Coastguard Worker static inline void nl_write_lock(pthread_rwlock_t *lock)
806*4dc78e53SAndroid Build Coastguard Worker {
807*4dc78e53SAndroid Build Coastguard Worker 	pthread_rwlock_wrlock(lock);
808*4dc78e53SAndroid Build Coastguard Worker }
809*4dc78e53SAndroid Build Coastguard Worker 
nl_write_unlock(pthread_rwlock_t * lock)810*4dc78e53SAndroid Build Coastguard Worker static inline void nl_write_unlock(pthread_rwlock_t *lock)
811*4dc78e53SAndroid Build Coastguard Worker {
812*4dc78e53SAndroid Build Coastguard Worker 	pthread_rwlock_unlock(lock);
813*4dc78e53SAndroid Build Coastguard Worker }
814*4dc78e53SAndroid Build Coastguard Worker 
815*4dc78e53SAndroid Build Coastguard Worker #else
816*4dc78e53SAndroid Build Coastguard Worker #define NL_LOCK(NAME) int __unused_lock_##NAME _nl_unused
817*4dc78e53SAndroid Build Coastguard Worker #define NL_RW_LOCK(NAME) int __unused_lock_##NAME _nl_unused
818*4dc78e53SAndroid Build Coastguard Worker 
819*4dc78e53SAndroid Build Coastguard Worker #define nl_lock(LOCK) \
820*4dc78e53SAndroid Build Coastguard Worker 	do {          \
821*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
822*4dc78e53SAndroid Build Coastguard Worker #define nl_unlock(LOCK) \
823*4dc78e53SAndroid Build Coastguard Worker 	do {            \
824*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
825*4dc78e53SAndroid Build Coastguard Worker #define nl_read_lock(LOCK) \
826*4dc78e53SAndroid Build Coastguard Worker 	do {               \
827*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
828*4dc78e53SAndroid Build Coastguard Worker #define nl_read_unlock(LOCK) \
829*4dc78e53SAndroid Build Coastguard Worker 	do {                 \
830*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
831*4dc78e53SAndroid Build Coastguard Worker #define nl_write_lock(LOCK) \
832*4dc78e53SAndroid Build Coastguard Worker 	do {                \
833*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
834*4dc78e53SAndroid Build Coastguard Worker #define nl_write_unlock(LOCK) \
835*4dc78e53SAndroid Build Coastguard Worker 	do {                  \
836*4dc78e53SAndroid Build Coastguard Worker 	} while (0)
837*4dc78e53SAndroid Build Coastguard Worker #endif
838*4dc78e53SAndroid Build Coastguard Worker 
839*4dc78e53SAndroid Build Coastguard Worker #endif /* __NETLINK_BASE_NL_BASE_UTILS_H__ */
840