]>
git.proxmox.com Git - mirror_lxc.git/blob - src/lxc/error_utils.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 #ifndef __LXC_ERROR_UTILS_H
4 #define __LXC_ERROR_UTILS_H
12 #define MAX_ERRNO 4095
14 #define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
16 static inline void *ERR_PTR(long error
)
21 static inline long PTR_ERR(const void *ptr
)
26 static inline long IS_ERR(const void *ptr
)
28 return IS_ERR_VALUE((unsigned long)ptr
);
31 static inline long IS_ERR_OR_NULL(const void *ptr
)
33 return !ptr
|| IS_ERR_VALUE((unsigned long)ptr
);
36 static inline void *ERR_CAST(const void *ptr
)
41 static inline int PTR_RET(const void *ptr
)
49 /* Taken from Lennart tyvm. */
50 #define CASE_F(X) case X:
51 #define CASE_F_1(CASE, X) CASE_F(X)
52 #define CASE_F_2(CASE, X, ...) CASE(X) CASE_F_1(CASE, __VA_ARGS__)
53 #define CASE_F_3(CASE, X, ...) CASE(X) CASE_F_2(CASE, __VA_ARGS__)
54 #define CASE_F_4(CASE, X, ...) CASE(X) CASE_F_3(CASE, __VA_ARGS__)
55 #define CASE_F_5(CASE, X, ...) CASE(X) CASE_F_4(CASE, __VA_ARGS__)
56 #define CASE_F_6(CASE, X, ...) CASE(X) CASE_F_5(CASE, __VA_ARGS__)
57 #define CASE_F_7(CASE, X, ...) CASE(X) CASE_F_6(CASE, __VA_ARGS__)
58 #define CASE_F_8(CASE, X, ...) CASE(X) CASE_F_7(CASE, __VA_ARGS__)
59 #define CASE_F_9(CASE, X, ...) CASE(X) CASE_F_8(CASE, __VA_ARGS__)
60 #define CASE_F_10(CASE, X, ...) CASE(X) CASE_F_9(CASE, __VA_ARGS__)
61 #define CASE_F_11(CASE, X, ...) CASE(X) CASE_F_10(CASE, __VA_ARGS__)
62 #define CASE_F_12(CASE, X, ...) CASE(X) CASE_F_11(CASE, __VA_ARGS__)
63 #define CASE_F_13(CASE, X, ...) CASE(X) CASE_F_12(CASE, __VA_ARGS__)
64 #define CASE_F_14(CASE, X, ...) CASE(X) CASE_F_13(CASE, __VA_ARGS__)
65 #define CASE_F_15(CASE, X, ...) CASE(X) CASE_F_14(CASE, __VA_ARGS__)
66 #define CASE_F_16(CASE, X, ...) CASE(X) CASE_F_15(CASE, __VA_ARGS__)
67 #define CASE_F_17(CASE, X, ...) CASE(X) CASE_F_16(CASE, __VA_ARGS__)
68 #define CASE_F_18(CASE, X, ...) CASE(X) CASE_F_17(CASE, __VA_ARGS__)
69 #define CASE_F_19(CASE, X, ...) CASE(X) CASE_F_18(CASE, __VA_ARGS__)
70 #define CASE_F_20(CASE, X, ...) CASE(X) CASE_F_19(CASE, __VA_ARGS__)
72 #define GET_CASE_F(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,NAME,...) NAME
73 #define FOR_EACH_MAKE_CASE(...) \
74 GET_CASE_F(__VA_ARGS__,CASE_F_20,CASE_F_19,CASE_F_18,CASE_F_17,CASE_F_16,CASE_F_15,CASE_F_14,CASE_F_13,CASE_F_12,CASE_F_11, \
75 CASE_F_10,CASE_F_9,CASE_F_8,CASE_F_7,CASE_F_6,CASE_F_5,CASE_F_4,CASE_F_3,CASE_F_2,CASE_F_1) \
78 #define XCONCATENATE(x, y) x ## y
79 #define CONCATENATE(x, y) XCONCATENATE(x, y)
81 #define assert_static(expr) \
82 struct CONCATENATE(_assert_struct_, __COUNTER__) { \
83 char x[(expr) ? 0 : -1]; \
86 #define IN_SET(x, ...) \
88 bool _found = false; \
89 static const long double __assert_in_set[] __lxc_unused = { \
91 assert_static(ARRAY_SIZE(__assert_in_set) <= 20); \
93 FOR_EACH_MAKE_CASE(__VA_ARGS__) \
102 static inline bool ERRNO_IS_NOT_SUPPORTED(int r
) {
103 return IN_SET(abs(r
), EOPNOTSUPP
, ENOSYS
);
106 #endif /* __LXC_ERROR_UTILS_H */