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