]> git.proxmox.com Git - mirror_lxc.git/blob - src/lxc/error_utils.h
tree-wide: fix config.h inclusion
[mirror_lxc.git] / src / lxc / error_utils.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2
3 #ifndef __LXC_ERROR_UTILS_H
4 #define __LXC_ERROR_UTILS_H
5
6 #include "config.h"
7
8 #include <stdbool.h>
9
10 #include "macro.h"
11
12 #define MAX_ERRNO 4095
13
14 #define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
15
16 static inline void *ERR_PTR(long error)
17 {
18 return (void *)error;
19 }
20
21 static inline long PTR_ERR(const void *ptr)
22 {
23 return (long)ptr;
24 }
25
26 static inline long IS_ERR(const void *ptr)
27 {
28 return IS_ERR_VALUE((unsigned long)ptr);
29 }
30
31 static inline long IS_ERR_OR_NULL(const void *ptr)
32 {
33 return !ptr || IS_ERR_VALUE((unsigned long)ptr);
34 }
35
36 static inline void *ERR_CAST(const void *ptr)
37 {
38 return (void *)ptr;
39 }
40
41 static inline int PTR_RET(const void *ptr)
42 {
43 if (IS_ERR(ptr))
44 return PTR_ERR(ptr);
45 else
46 return 0;
47 }
48
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__)
71
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) \
76 (CASE_F,__VA_ARGS__)
77
78 #define XCONCATENATE(x, y) x ## y
79 #define CONCATENATE(x, y) XCONCATENATE(x, y)
80
81 #define assert_static(expr) \
82 struct CONCATENATE(_assert_struct_, __COUNTER__) { \
83 char x[(expr) ? 0 : -1]; \
84 }
85
86 #define IN_SET(x, ...) \
87 ({ \
88 bool _found = false; \
89 static const long double __assert_in_set[] __lxc_unused = { \
90 __VA_ARGS__}; \
91 assert_static(ARRAY_SIZE(__assert_in_set) <= 20); \
92 switch (x) { \
93 FOR_EACH_MAKE_CASE(__VA_ARGS__) \
94 _found = true; \
95 break; \
96 default: \
97 break; \
98 } \
99 _found; \
100 })
101
102 static inline bool ERRNO_IS_NOT_SUPPORTED(int r) {
103 return IN_SET(abs(r), EOPNOTSUPP, ENOSYS);
104 }
105
106 #endif /* __LXC_ERROR_UTILS_H */