]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
error_utils: copy over Lennart's IN_SET()
authorChristian Brauner <christian.brauner@ubuntu.com>
Wed, 24 Feb 2021 08:19:12 +0000 (09:19 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Wed, 24 Feb 2021 08:37:01 +0000 (09:37 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/error_utils.h

index e65086158770c93b48875635872d396fd36b3400..b229985e92bc9e599246c306847223bde7bf5908 100644 (file)
@@ -3,6 +3,7 @@
 #ifndef __LXC_ERROR_UTILS_H
 #define __LXC_ERROR_UTILS_H
 
+#include <stdbool.h>
 #define MAX_ERRNO 4095
 
 #define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
@@ -40,4 +41,61 @@ static inline int PTR_RET(const void *ptr)
                return 0;
 }
 
+/* Taken from Lennart tyvm. */
+#define CASE_F(X) case X:
+#define CASE_F_1(CASE, X) CASE_F(X)
+#define CASE_F_2(CASE, X, ...)  CASE(X) CASE_F_1(CASE, __VA_ARGS__)
+#define CASE_F_3(CASE, X, ...)  CASE(X) CASE_F_2(CASE, __VA_ARGS__)
+#define CASE_F_4(CASE, X, ...)  CASE(X) CASE_F_3(CASE, __VA_ARGS__)
+#define CASE_F_5(CASE, X, ...)  CASE(X) CASE_F_4(CASE, __VA_ARGS__)
+#define CASE_F_6(CASE, X, ...)  CASE(X) CASE_F_5(CASE, __VA_ARGS__)
+#define CASE_F_7(CASE, X, ...)  CASE(X) CASE_F_6(CASE, __VA_ARGS__)
+#define CASE_F_8(CASE, X, ...)  CASE(X) CASE_F_7(CASE, __VA_ARGS__)
+#define CASE_F_9(CASE, X, ...)  CASE(X) CASE_F_8(CASE, __VA_ARGS__)
+#define CASE_F_10(CASE, X, ...) CASE(X) CASE_F_9(CASE, __VA_ARGS__)
+#define CASE_F_11(CASE, X, ...) CASE(X) CASE_F_10(CASE, __VA_ARGS__)
+#define CASE_F_12(CASE, X, ...) CASE(X) CASE_F_11(CASE, __VA_ARGS__)
+#define CASE_F_13(CASE, X, ...) CASE(X) CASE_F_12(CASE, __VA_ARGS__)
+#define CASE_F_14(CASE, X, ...) CASE(X) CASE_F_13(CASE, __VA_ARGS__)
+#define CASE_F_15(CASE, X, ...) CASE(X) CASE_F_14(CASE, __VA_ARGS__)
+#define CASE_F_16(CASE, X, ...) CASE(X) CASE_F_15(CASE, __VA_ARGS__)
+#define CASE_F_17(CASE, X, ...) CASE(X) CASE_F_16(CASE, __VA_ARGS__)
+#define CASE_F_18(CASE, X, ...) CASE(X) CASE_F_17(CASE, __VA_ARGS__)
+#define CASE_F_19(CASE, X, ...) CASE(X) CASE_F_18(CASE, __VA_ARGS__)
+#define CASE_F_20(CASE, X, ...) CASE(X) CASE_F_19(CASE, __VA_ARGS__)
+
+#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
+#define FOR_EACH_MAKE_CASE(...) \
+        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, \
+                               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) \
+                   (CASE_F,__VA_ARGS__)
+
+#define XCONCATENATE(x, y) x ## y
+#define CONCATENATE(x, y) XCONCATENATE(x, y)
+
+#define assert_static(expr)                                \
+       struct CONCATENATE(_assert_struct_, __COUNTER__) { \
+               char x[(expr) ? 0 : -1];                   \
+       }
+
+#define IN_SET(x, ...)                                                      \
+       ({                                                                  \
+               bool _found = false;                                        \
+               static const long double __assert_in_set[] __lxc_unused = { \
+                   __VA_ARGS__};                                           \
+               assert_static(ARRAY_SIZE(__assert_in_set) <= 20);           \
+               switch (x) {                                                \
+                       FOR_EACH_MAKE_CASE(__VA_ARGS__)                     \
+                       _found = true;                                      \
+                       break;                                              \
+               default:                                                    \
+                       break;                                              \
+               }                                                           \
+               _found;                                                     \
+       })
+
+static inline bool ERRNO_IS_NOT_SUPPORTED(int r) {
+       return IN_SET(abs(r), EOPNOTSUPP, ENOSYS);
+}
+
 #endif /* __LXC_ERROR_UTILS_H */