#include #include #include "error.h" namespace _cow_error { constexpr const size_t SIZE = (size_t)_COW_ERR_SIZE; consteval inline void setmsg(std::array& ar, enum cow_err_kind kind, const char* msg) { ar[kind] = msg; } consteval inline std::array gen_msg_table() { std::array ret; setmsg(ret, COW_ERR_UNKNOWN, "unknown error"); setmsg(ret, COW_ERR_NONE, "success"); setmsg(ret, COW_ERR_FDCREATE, "failed to create shmfd (memfd_create())"); setmsg(ret, COW_ERR_SIZE, "failed to set shmfd size (ftruncate())"); setmsg(ret, COW_ERR_MAP, "failed to map shmfd (mmap())"); setmsg(ret, COW_ERR_POISONED, "trying to use a poisoned cow"); return ret; } const std::array _cow_message_table = gen_msg_table(); } using namespace _cow_error; extern "C" { enum cow_err_kind cow_err() { return _cow_last_error; } internal void _cow_set_err(enum cow_err_kind kind) { _cow_last_error = kind; } const char* const * cow_err_msg(enum cow_err_kind kind) { auto idx = ((size_t)kind); if ( idx >= SIZE ) return nullptr; else return &_cow_message_table[idx]; } }