|  | #include <sdbusplus/exception.hpp> | 
|  |  | 
|  | #include <cerrno> | 
|  | #include <stdexcept> | 
|  | #include <utility> | 
|  |  | 
|  | #ifdef __clang__ | 
|  | #pragma clang diagnostic push | 
|  | #pragma clang diagnostic ignored "-Wc99-extensions" | 
|  | #endif | 
|  |  | 
|  | namespace sdbusplus | 
|  | { | 
|  | namespace exception | 
|  | { | 
|  |  | 
|  | void exception::unused() const noexcept {} | 
|  |  | 
|  | int generated_exception::get_errno() const noexcept | 
|  | { | 
|  | return EIO; | 
|  | } | 
|  |  | 
|  | SdBusError::SdBusError(int error_in, const char* prefix, | 
|  | SdBusInterface* intf_in) : | 
|  | error(SD_BUS_ERROR_NULL), | 
|  | intf(intf_in) | 
|  | { | 
|  | // We can't check the output of intf->sd_bus_error_set_errno() because | 
|  | // it returns the input errorcode. We don't want to try and guess | 
|  | // possible error statuses. Instead, check to see if the error was | 
|  | // constructed to determine success. | 
|  | intf->sd_bus_error_set_errno(&this->error, error_in); | 
|  | if (!intf->sd_bus_error_is_set(&this->error)) | 
|  | { | 
|  | throw std::runtime_error("Failed to create SdBusError"); | 
|  | } | 
|  |  | 
|  | populateMessage(prefix); | 
|  | } | 
|  |  | 
|  | SdBusError::SdBusError(sd_bus_error* error_in, const char* prefix, | 
|  | SdBusInterface* intf_in) : | 
|  | error(*error_in), | 
|  | intf(intf_in) | 
|  | { | 
|  | // We own the error so remove the caller's reference | 
|  | *error_in = SD_BUS_ERROR_NULL; | 
|  |  | 
|  | populateMessage(prefix); | 
|  | } | 
|  |  | 
|  | SdBusError::SdBusError(SdBusError&& other) : error(SD_BUS_ERROR_NULL) | 
|  | { | 
|  | move(std::move(other)); | 
|  | } | 
|  |  | 
|  | SdBusError& SdBusError::operator=(SdBusError&& other) | 
|  | { | 
|  | if (this != &other) | 
|  | { | 
|  | move(std::move(other)); | 
|  | } | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | SdBusError::~SdBusError() | 
|  | { | 
|  | intf->sd_bus_error_free(&error); | 
|  | } | 
|  |  | 
|  | const char* SdBusError::name() const noexcept | 
|  | { | 
|  | return error.name; | 
|  | } | 
|  |  | 
|  | const char* SdBusError::description() const noexcept | 
|  | { | 
|  | return error.message; | 
|  | } | 
|  |  | 
|  | const char* SdBusError::what() const noexcept | 
|  | { | 
|  | return full_message.c_str(); | 
|  | } | 
|  |  | 
|  | int SdBusError::get_errno() const noexcept | 
|  | { | 
|  | return intf->sd_bus_error_get_errno(&this->error); | 
|  | } | 
|  |  | 
|  | const sd_bus_error* SdBusError::get_error() const noexcept | 
|  | { | 
|  | return &error; | 
|  | } | 
|  |  | 
|  | void SdBusError::populateMessage(const char* prefix) | 
|  | { | 
|  | full_message = prefix; | 
|  | if (error.name) | 
|  | { | 
|  | full_message += ": "; | 
|  | full_message += error.name; | 
|  | } | 
|  | if (error.message) | 
|  | { | 
|  | full_message += ": "; | 
|  | full_message += error.message; | 
|  | } | 
|  | } | 
|  |  | 
|  | void SdBusError::move(SdBusError&& other) | 
|  | { | 
|  | intf = std::move(other.intf); | 
|  |  | 
|  | intf->sd_bus_error_free(&error); | 
|  | error = other.error; | 
|  | other.error = SD_BUS_ERROR_NULL; | 
|  |  | 
|  | full_message = std::move(other.full_message); | 
|  | } | 
|  |  | 
|  | const char* InvalidEnumString::name() const noexcept | 
|  | { | 
|  | return errName; | 
|  | } | 
|  |  | 
|  | const char* InvalidEnumString::description() const noexcept | 
|  | { | 
|  | return errDesc; | 
|  | } | 
|  |  | 
|  | const char* InvalidEnumString::what() const noexcept | 
|  | { | 
|  | return errWhat; | 
|  | } | 
|  |  | 
|  | int InvalidEnumString::get_errno() const noexcept | 
|  | { | 
|  | return EINVAL; | 
|  | } | 
|  |  | 
|  | static std::string unpackErrorReasonToString(const UnpackErrorReason reason) | 
|  | { | 
|  | switch (reason) | 
|  | { | 
|  | case UnpackErrorReason::missingProperty: | 
|  | return "Missing property"; | 
|  | case UnpackErrorReason::wrongType: | 
|  | return "Type not matched"; | 
|  | } | 
|  | return "Unknown"; | 
|  | } | 
|  |  | 
|  | UnpackPropertyError::UnpackPropertyError(std::string_view propertyNameIn, | 
|  | const UnpackErrorReason reasonIn) : | 
|  | propertyName(propertyNameIn), | 
|  | reason(reasonIn), | 
|  | errWhatDetailed(std::string(errWhat) + " PropertyName: '" + propertyName + | 
|  | "', Reason: '" + unpackErrorReasonToString(reason) + "'.") | 
|  | {} | 
|  |  | 
|  | const char* UnpackPropertyError::name() const noexcept | 
|  | { | 
|  | return errName; | 
|  | } | 
|  |  | 
|  | const char* UnpackPropertyError::description() const noexcept | 
|  | { | 
|  | return errDesc; | 
|  | } | 
|  |  | 
|  | const char* UnpackPropertyError::what() const noexcept | 
|  | { | 
|  | return errWhatDetailed.c_str(); | 
|  | } | 
|  |  | 
|  | int UnpackPropertyError::get_errno() const noexcept | 
|  | { | 
|  | return EINVAL; | 
|  | } | 
|  |  | 
|  | const char* UnhandledStop::name() const noexcept | 
|  | { | 
|  | return errName; | 
|  | } | 
|  |  | 
|  | const char* UnhandledStop::description() const noexcept | 
|  | { | 
|  | return errDesc; | 
|  | } | 
|  |  | 
|  | const char* UnhandledStop::what() const noexcept | 
|  | { | 
|  | return errWhat; | 
|  | } | 
|  |  | 
|  | int UnhandledStop::get_errno() const noexcept | 
|  | { | 
|  | return ECANCELED; | 
|  | } | 
|  |  | 
|  | } // namespace exception | 
|  | } // namespace sdbusplus | 
|  |  | 
|  | #ifdef __clang__ | 
|  | #pragma clang diagnostic pop | 
|  | #endif |