17f664254SPatrick Williams #include <sdbusplus/exception.hpp> 27f664254SPatrick Williams 3b6f729d6SPatrick Williams #include <cerrno> 47f664254SPatrick Williams #include <stdexcept> 57f664254SPatrick Williams #include <utility> 67f664254SPatrick Williams 70c8136a4SPatrick Williams #ifdef __clang__ 80c8136a4SPatrick Williams #pragma clang diagnostic push 90c8136a4SPatrick Williams #pragma clang diagnostic ignored "-Wc99-extensions" 100c8136a4SPatrick Williams #endif 110c8136a4SPatrick Williams 127f664254SPatrick Williams namespace sdbusplus 137f664254SPatrick Williams { 147f664254SPatrick Williams namespace exception 157f664254SPatrick Williams { 167f664254SPatrick Williams 17f289c65fSPatrick Williams void exception::unused() const noexcept {} 18a8e3502cSPatrick Williams 1915228663SPatrick Williams int generated_exception::get_errno() const noexcept 2015228663SPatrick Williams { 2115228663SPatrick Williams return EIO; 2215228663SPatrick Williams } 2315228663SPatrick Williams 24ed4a5a64SEd Tanous SdBusError::SdBusError(int error_in, const char* prefix, 25ed4a5a64SEd Tanous SdBusInterface* intf_in) : 2670bcf14cSPatrick Williams SdBusError(error_in, std::string(prefix), intf_in) 2770bcf14cSPatrick Williams {} 2870bcf14cSPatrick Williams 2970bcf14cSPatrick Williams SdBusError::SdBusError(int error_in, std::string&& prefix, 3070bcf14cSPatrick Williams SdBusInterface* intf_in) : 31*06f265f6SPatrick Williams error(SD_BUS_ERROR_NULL), intf(intf_in) 327f664254SPatrick Williams { 337f664254SPatrick Williams // We can't check the output of intf->sd_bus_error_set_errno() because 347f664254SPatrick Williams // it returns the input errorcode. We don't want to try and guess 357f664254SPatrick Williams // possible error statuses. Instead, check to see if the error was 367f664254SPatrick Williams // constructed to determine success. 37ed4a5a64SEd Tanous intf->sd_bus_error_set_errno(&this->error, error_in); 387f664254SPatrick Williams if (!intf->sd_bus_error_is_set(&this->error)) 397f664254SPatrick Williams { 407f664254SPatrick Williams throw std::runtime_error("Failed to create SdBusError"); 417f664254SPatrick Williams } 427f664254SPatrick Williams 4370bcf14cSPatrick Williams populateMessage(std::move(prefix)); 447f664254SPatrick Williams } 457f664254SPatrick Williams 46ed4a5a64SEd Tanous SdBusError::SdBusError(sd_bus_error* error_in, const char* prefix, 47ed4a5a64SEd Tanous SdBusInterface* intf_in) : 48*06f265f6SPatrick Williams error(*error_in), intf(intf_in) 497f664254SPatrick Williams { 507f664254SPatrick Williams // We own the error so remove the caller's reference 51ed4a5a64SEd Tanous *error_in = SD_BUS_ERROR_NULL; 527f664254SPatrick Williams 5370bcf14cSPatrick Williams populateMessage(std::string(prefix)); 547f664254SPatrick Williams } 557f664254SPatrick Williams 567f664254SPatrick Williams SdBusError::SdBusError(SdBusError&& other) : error(SD_BUS_ERROR_NULL) 577f664254SPatrick Williams { 587f664254SPatrick Williams move(std::move(other)); 597f664254SPatrick Williams } 607f664254SPatrick Williams 617f664254SPatrick Williams SdBusError& SdBusError::operator=(SdBusError&& other) 627f664254SPatrick Williams { 637f664254SPatrick Williams if (this != &other) 647f664254SPatrick Williams { 657f664254SPatrick Williams move(std::move(other)); 667f664254SPatrick Williams } 677f664254SPatrick Williams return *this; 687f664254SPatrick Williams } 697f664254SPatrick Williams 707f664254SPatrick Williams SdBusError::~SdBusError() 717f664254SPatrick Williams { 727f664254SPatrick Williams intf->sd_bus_error_free(&error); 737f664254SPatrick Williams } 747f664254SPatrick Williams 757f664254SPatrick Williams const char* SdBusError::name() const noexcept 767f664254SPatrick Williams { 777f664254SPatrick Williams return error.name; 787f664254SPatrick Williams } 797f664254SPatrick Williams 807f664254SPatrick Williams const char* SdBusError::description() const noexcept 817f664254SPatrick Williams { 827f664254SPatrick Williams return error.message; 837f664254SPatrick Williams } 847f664254SPatrick Williams 857f664254SPatrick Williams const char* SdBusError::what() const noexcept 867f664254SPatrick Williams { 877f664254SPatrick Williams return full_message.c_str(); 887f664254SPatrick Williams } 897f664254SPatrick Williams 907f664254SPatrick Williams int SdBusError::get_errno() const noexcept 917f664254SPatrick Williams { 927f664254SPatrick Williams return intf->sd_bus_error_get_errno(&this->error); 937f664254SPatrick Williams } 947f664254SPatrick Williams 957f664254SPatrick Williams const sd_bus_error* SdBusError::get_error() const noexcept 967f664254SPatrick Williams { 977f664254SPatrick Williams return &error; 987f664254SPatrick Williams } 997f664254SPatrick Williams 10070bcf14cSPatrick Williams void SdBusError::populateMessage(std::string&& prefix) 1017f664254SPatrick Williams { 10270bcf14cSPatrick Williams full_message = std::move(prefix); 1037f664254SPatrick Williams if (error.name) 1047f664254SPatrick Williams { 1057f664254SPatrick Williams full_message += ": "; 1067f664254SPatrick Williams full_message += error.name; 1077f664254SPatrick Williams } 1087f664254SPatrick Williams if (error.message) 1097f664254SPatrick Williams { 1107f664254SPatrick Williams full_message += ": "; 1117f664254SPatrick Williams full_message += error.message; 1127f664254SPatrick Williams } 1137f664254SPatrick Williams } 1147f664254SPatrick Williams 1157f664254SPatrick Williams void SdBusError::move(SdBusError&& other) 1167f664254SPatrick Williams { 1177f664254SPatrick Williams intf = std::move(other.intf); 1187f664254SPatrick Williams 1197f664254SPatrick Williams intf->sd_bus_error_free(&error); 1207f664254SPatrick Williams error = other.error; 1217f664254SPatrick Williams other.error = SD_BUS_ERROR_NULL; 1227f664254SPatrick Williams 1237f664254SPatrick Williams full_message = std::move(other.full_message); 1247f664254SPatrick Williams } 1257f664254SPatrick Williams 1267f664254SPatrick Williams const char* InvalidEnumString::name() const noexcept 1277f664254SPatrick Williams { 1287f664254SPatrick Williams return errName; 1297f664254SPatrick Williams } 1307f664254SPatrick Williams 1317f664254SPatrick Williams const char* InvalidEnumString::description() const noexcept 1327f664254SPatrick Williams { 1337f664254SPatrick Williams return errDesc; 1347f664254SPatrick Williams } 1357f664254SPatrick Williams 1367f664254SPatrick Williams const char* InvalidEnumString::what() const noexcept 1377f664254SPatrick Williams { 1387f664254SPatrick Williams return errWhat; 1397f664254SPatrick Williams } 1407f664254SPatrick Williams 141bd372ecbSPatrick Williams int InvalidEnumString::get_errno() const noexcept 142bd372ecbSPatrick Williams { 143bd372ecbSPatrick Williams return EINVAL; 144bd372ecbSPatrick Williams } 145bd372ecbSPatrick Williams 146c3484735SEd Tanous static std::string unpackErrorReasonToString(const UnpackErrorReason reason) 147c8447d52SKrzysztof Grobelny { 148c8447d52SKrzysztof Grobelny switch (reason) 149c8447d52SKrzysztof Grobelny { 150c8447d52SKrzysztof Grobelny case UnpackErrorReason::missingProperty: 151c8447d52SKrzysztof Grobelny return "Missing property"; 152c8447d52SKrzysztof Grobelny case UnpackErrorReason::wrongType: 153c8447d52SKrzysztof Grobelny return "Type not matched"; 154c8447d52SKrzysztof Grobelny } 155c8447d52SKrzysztof Grobelny return "Unknown"; 156c8447d52SKrzysztof Grobelny } 157c8447d52SKrzysztof Grobelny 1586d83cf53SSzymon Dompke UnpackPropertyError::UnpackPropertyError(std::string_view propertyNameIn, 159c8447d52SKrzysztof Grobelny const UnpackErrorReason reasonIn) : 160*06f265f6SPatrick Williams propertyName(propertyNameIn), reason(reasonIn), 1616d83cf53SSzymon Dompke errWhatDetailed(std::string(errWhat) + " PropertyName: '" + propertyName + 162c8447d52SKrzysztof Grobelny "', Reason: '" + unpackErrorReasonToString(reason) + "'.") 16309b88f26SKrzysztof Grobelny {} 16409b88f26SKrzysztof Grobelny 16509b88f26SKrzysztof Grobelny const char* UnpackPropertyError::name() const noexcept 16609b88f26SKrzysztof Grobelny { 16709b88f26SKrzysztof Grobelny return errName; 16809b88f26SKrzysztof Grobelny } 16909b88f26SKrzysztof Grobelny 17009b88f26SKrzysztof Grobelny const char* UnpackPropertyError::description() const noexcept 17109b88f26SKrzysztof Grobelny { 17209b88f26SKrzysztof Grobelny return errDesc; 17309b88f26SKrzysztof Grobelny } 17409b88f26SKrzysztof Grobelny 17509b88f26SKrzysztof Grobelny const char* UnpackPropertyError::what() const noexcept 17609b88f26SKrzysztof Grobelny { 1776d83cf53SSzymon Dompke return errWhatDetailed.c_str(); 17809b88f26SKrzysztof Grobelny } 17909b88f26SKrzysztof Grobelny 180bd372ecbSPatrick Williams int UnpackPropertyError::get_errno() const noexcept 181bd372ecbSPatrick Williams { 182bd372ecbSPatrick Williams return EINVAL; 183bd372ecbSPatrick Williams } 184bd372ecbSPatrick Williams 1854cfc284dSPatrick Williams const char* UnhandledStop::name() const noexcept 1864cfc284dSPatrick Williams { 1874cfc284dSPatrick Williams return errName; 1884cfc284dSPatrick Williams } 1894cfc284dSPatrick Williams 1904cfc284dSPatrick Williams const char* UnhandledStop::description() const noexcept 1914cfc284dSPatrick Williams { 1924cfc284dSPatrick Williams return errDesc; 1934cfc284dSPatrick Williams } 1944cfc284dSPatrick Williams 1954cfc284dSPatrick Williams const char* UnhandledStop::what() const noexcept 1964cfc284dSPatrick Williams { 1974cfc284dSPatrick Williams return errWhat; 1984cfc284dSPatrick Williams } 1994cfc284dSPatrick Williams 2004cfc284dSPatrick Williams int UnhandledStop::get_errno() const noexcept 2014cfc284dSPatrick Williams { 2024cfc284dSPatrick Williams return ECANCELED; 2034cfc284dSPatrick Williams } 2044cfc284dSPatrick Williams 2057f664254SPatrick Williams } // namespace exception 2067f664254SPatrick Williams } // namespace sdbusplus 2070c8136a4SPatrick Williams 2080c8136a4SPatrick Williams #ifdef __clang__ 2090c8136a4SPatrick Williams #pragma clang diagnostic pop 2100c8136a4SPatrick Williams #endif 211