diff options
Diffstat (limited to 'include/utils.h')
-rw-r--r-- | include/utils.h | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/include/utils.h b/include/utils.h new file mode 100644 index 0000000..8af5a8e --- /dev/null +++ b/include/utils.h @@ -0,0 +1,101 @@ +#ifndef LIBNFTNL_UTILS_H +#define LIBNFTNL_UTILS_H 1 + +#include <stdio.h> +#include <stdint.h> +#include <string.h> +#include <stdlib.h> +#include <libnftnl/common.h> + +#include "config.h" +#ifdef HAVE_VISIBILITY_HIDDEN +# define __visible __attribute__((visibility("default"))) +# define EXPORT_SYMBOL(x) typeof(x) (x) __visible; +#else +# define __visible +# define EXPORT_SYMBOL +#endif + +#define __noreturn __attribute__((__noreturn__)) + +#define xfree(ptr) free((void *)ptr); + +#define div_round_up(n, d) (((n) + (d) - 1) / (d)) + +void __noreturn __abi_breakage(const char *file, int line, const char *reason); + +#define abi_breakage() \ + __abi_breakage(__FILE__, __LINE__, strerror(errno)); + +void __nftnl_assert_fail(uint16_t attr, const char *filename, int line); + +#define nftnl_assert(val, attr, expr) \ + ((!val || expr) \ + ? (void)0 \ + : __nftnl_assert_fail(attr, __FILE__, __LINE__)) + +#define nftnl_assert_validate(data, _validate_array, _attr, _data_len) \ +({ \ + if (!data) \ + __nftnl_assert_fail(attr, __FILE__, __LINE__); \ + if (_validate_array[_attr]) \ + nftnl_assert(data, attr, _validate_array[_attr] == _data_len); \ +}) + +void __nftnl_assert_attr_exists(uint16_t attr, uint16_t attr_max, + const char *filename, int line); + +#define nftnl_assert_attr_exists(_attr, _attr_max) \ +({ \ + if (_attr > _attr_max) \ + __nftnl_assert_attr_exists(_attr, _attr_max, __FILE__, __LINE__); \ +}) + +#define SNPRINTF_BUFFER_SIZE(ret, remain, offset) \ + if (ret < 0) \ + ret = 0; \ + offset += ret; \ + if (ret > remain) \ + ret = remain; \ + remain -= ret; \ + + +#define BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1) + +#define __must_be_array(a) \ + BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0]))) + +#define array_size(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) + +const char *nftnl_family2str(uint32_t family); +int nftnl_str2family(const char *family); + +enum nftnl_type { + NFTNL_TYPE_U8, + NFTNL_TYPE_U16, + NFTNL_TYPE_U32, + NFTNL_TYPE_U64, + NFTNL_TYPE_S8, + NFTNL_TYPE_S16, + NFTNL_TYPE_S32, + NFTNL_TYPE_S64, +}; + +int nftnl_strtoi(const char *string, int base, void *number, enum nftnl_type type); +int nftnl_get_value(enum nftnl_type type, void *val, void *out); + +const char *nftnl_verdict2str(uint32_t verdict); +int nftnl_str2verdict(const char *verdict, int *verdict_num); + +const char *nftnl_cmd2tag(enum nftnl_cmd_type cmd); +uint32_t nftnl_str2cmd(const char *cmd); + +enum nftnl_cmd_type nftnl_flag2cmd(uint32_t flags); + +int nftnl_fprintf(FILE *fpconst, const void *obj, uint32_t cmd, uint32_t type, + uint32_t flags, + int (*snprintf_cb)(char *buf, size_t bufsiz, const void *obj, + uint32_t cmd, uint32_t type, + uint32_t flags)); + +#endif |