Program Listing for File Utility.cpp

Return to documentation for file (EventLoop/Utility.cpp)

#include "netio3-backend/EventLoop/Utility.hpp"

#include <array>
#include <cstddef>
#include <cstring>

std::string netio3::utility::error_message(int error)
{
  constexpr static auto BUFFER_SIZE = std::size_t{256};
  std::array<char, BUFFER_SIZE> buffer{};
  if constexpr (requires(int err, char* buf, size_t buflen) {
                  {
                    strerror_r(err, buf, buflen)
                  } -> std::convertible_to<char*>;
                }) {
    // GNU-specific version
    char* message = strerror_r(error, buffer.data(), buffer.size());
    if (message != nullptr) {
      return {message};
    }
  } else if constexpr (requires(int err, char* buf, size_t buflen) {
                         {
                           strerror_r(err, buf, buflen)
                         } -> std::convertible_to<int>;
                       }) {
    // POSIX-compliant version
    if (strerror_r(error, buffer.data(), buffer.size()) == nullptr) {
      return {buffer.data()};
    }
  }
  return "Unknown error";
}