Files
ternfs-XTXMarkets/cpp/core/Exception.cpp
2025-09-23 12:44:20 +01:00

195 lines
5.6 KiB
C++

// Copyright 2025 XTX Markets Technologies Limited
//
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include <signal.h>
#include <poll.h>
#include <sys/syscall.h>
#include <atomic>
#include <fcntl.h>
#include <cxxabi.h>
#include "Common.hpp"
#include "Exception.hpp"
const char *translateErrno(int _errno) {
switch (_errno) {
case 1: return "EPERM";
case 2: return "ENOENT";
case 3: return "ESRCH";
case 4: return "EINTR";
case 5: return "EIO";
case 6: return "ENXIO";
case 7: return "E2BIG";
case 8: return "ENOEXEC";
case 9: return "EBADF";
case 10: return "ECHILD";
case 11: return "EAGAIN";
case 12: return "ENOMEM";
case 13: return "EACCES";
case 14: return "EFAULT";
case 15: return "ENOTBLK";
case 16: return "EBUSY";
case 17: return "EEXIST";
case 18: return "EXDEV";
case 19: return "ENODEV";
case 20: return "ENOTDIR";
case 21: return "EISDIR";
case 22: return "EINVAL";
case 23: return "ENFILE";
case 24: return "EMFILE";
case 25: return "ENOTTY";
case 26: return "ETXTBSY";
case 27: return "EFBIG";
case 28: return "ENOSPC";
case 29: return "ESPIPE";
case 30: return "EROFS";
case 31: return "EMLINK";
case 32: return "EPIPE";
case 33: return "EDOM";
case 34: return "ERANGE";
case 35: return "EDEADLK";
case 36: return "ENAMETOOLONG";
case 37: return "ENOLCK";
case 38: return "ENOSYS";
case 39: return "ENOTEMPTY";
case 40: return "ELOOP";
case 42: return "ENOMSG";
case 43: return "EIDRM";
case 44: return "ECHRNG";
case 45: return "EL2NSYNC";
case 46: return "EL3HLT";
case 47: return "EL3RST";
case 48: return "ELNRNG";
case 49: return "EUNATCH";
case 50: return "ENOCSI";
case 51: return "EL2HLT";
case 52: return "EBADE";
case 53: return "EBADR";
case 54: return "EXFULL";
case 55: return "ENOANO";
case 56: return "EBADRQC";
case 57: return "EBADSLT";
case 59: return "EBFONT";
case 60: return "ENOSTR";
case 61: return "ENODATA";
case 62: return "ETIME";
case 63: return "ENOSR";
case 64: return "ENONET";
case 65: return "ENOPKG";
case 66: return "EREMOTE";
case 67: return "ENOLINK";
case 68: return "EADV";
case 69: return "ESRMNT";
case 70: return "ECOMM";
case 71: return "EPROTO";
case 72: return "EMULTIHOP";
case 73: return "EDOTDOT";
case 74: return "EBADMSG";
case 75: return "EOVERFLOW";
case 76: return "ENOTUNIQ";
case 77: return "EBADFD";
case 78: return "EREMCHG";
case 79: return "ELIBACC";
case 80: return "ELIBBAD";
case 81: return "ELIBSCN";
case 82: return "ELIBMAX";
case 83: return "ELIBEXEC";
case 84: return "EILSEQ";
case 85: return "ERESTART";
case 86: return "ESTRPIPE";
case 87: return "EUSERS";
case 88: return "ENOTSOCK";
case 89: return "EDESTADDRREQ";
case 90: return "EMSGSIZE";
case 91: return "EPROTOTYPE";
case 92: return "ENOPROTOOPT";
case 93: return "EPROTONOSUPPORT";
case 94: return "ESOCKTNOSUPPORT";
case 95: return "EOPNOTSUPP";
case 96: return "EPFNOSUPPORT";
case 97: return "EAFNOSUPPORT";
case 98: return "EADDRINUSE";
case 99: return "EADDRNOTAVAIL";
case 100: return "ENETDOWN";
case 101: return "ENETUNREACH";
case 102: return "ENETRESET";
case 103: return "ECONNABORTED";
case 104: return "ECONNRESET";
case 105: return "ENOBUFS";
case 106: return "EISCONN";
case 107: return "ENOTCONN";
case 108: return "ESHUTDOWN";
case 109: return "ETOOMANYREFS";
case 110: return "ETIMEDOUT";
case 111: return "ECONNREFUSED";
case 112: return "EHOSTDOWN";
case 113: return "EHOSTUNREACH";
case 114: return "EALREADY";
case 115: return "EINPROGRESS";
case 116: return "ESTALE";
case 117: return "EUCLEAN";
case 118: return "ENOTNAM";
case 119: return "ENAVAIL";
case 120: return "EISNAM";
case 121: return "EREMOTEIO";
case 122: return "EDQUOT";
case 123: return "ENOMEDIUM";
case 124: return "EMEDIUMTYPE";
case 125: return "ECANCELED";
case 126: return "ENOKEY";
case 127: return "EKEYEXPIRED";
case 128: return "EKEYREVOKED";
case 129: return "EKEYREJECTED";
case 130: return "EOWNERDEAD";
case 131: return "ENOTRECOVERABLE";
case 132: return "ERFKILL";
case 133: return "EHWPOISON";
default: return "????";
}
}
std::string removeTemplates(const std::string & s) {
std::string r = s;
// Remove template arguments to class names
// FIXME this also picks up less than and greater than signs,
// which needs fixing
size_t begin = 0;
int stack = 0;
for (size_t i = 0; i < r.size(); ++i) {
if (r[i] == '<') {
if (stack == 0) begin = i;
++stack;
} else if (r[i] == '>') {
if (stack == 0) continue;
--stack;
if (stack == 0) {
r.erase(begin, i + 1 - begin);
i = begin;
}
}
}
// Remove any trailing [with args ...] sections
size_t with_args = r.find(" [with args");
if (with_args != std::string::npos && r[r.size()-1] == ']') {
r.resize(with_args);
}
return r;
}
const char *TernException::what() const throw() {
return _msg.c_str();
}
const char *SyscallException::what() const throw() {
return _msg.c_str();
}
const char *FatalException::what() const throw() {
return _msg.c_str();
}