1 #include <sdbusplus/exception.hpp> 2 3 #include <stdexcept> 4 #include <utility> 5 6 namespace sdbusplus 7 { 8 namespace exception 9 { 10 11 SdBusError::SdBusError(int error, const char* prefix, SdBusInterface* intf) : 12 error(SD_BUS_ERROR_NULL), intf(intf) 13 { 14 // We can't check the output of intf->sd_bus_error_set_errno() because 15 // it returns the input errorcode. We don't want to try and guess 16 // possible error statuses. Instead, check to see if the error was 17 // constructed to determine success. 18 intf->sd_bus_error_set_errno(&this->error, error); 19 if (!intf->sd_bus_error_is_set(&this->error)) 20 { 21 throw std::runtime_error("Failed to create SdBusError"); 22 } 23 24 populateMessage(prefix); 25 } 26 27 SdBusError::SdBusError(sd_bus_error* error, const char* prefix, 28 SdBusInterface* intf) : 29 error(*error), 30 intf(intf) 31 { 32 // We own the error so remove the caller's reference 33 *error = SD_BUS_ERROR_NULL; 34 35 populateMessage(prefix); 36 } 37 38 SdBusError::SdBusError(SdBusError&& other) : error(SD_BUS_ERROR_NULL) 39 { 40 move(std::move(other)); 41 } 42 43 SdBusError& SdBusError::operator=(SdBusError&& other) 44 { 45 if (this != &other) 46 { 47 move(std::move(other)); 48 } 49 return *this; 50 } 51 52 SdBusError::~SdBusError() 53 { 54 intf->sd_bus_error_free(&error); 55 } 56 57 const char* SdBusError::name() const noexcept 58 { 59 return error.name; 60 } 61 62 const char* SdBusError::description() const noexcept 63 { 64 return error.message; 65 } 66 67 const char* SdBusError::what() const noexcept 68 { 69 return full_message.c_str(); 70 } 71 72 int SdBusError::get_errno() const noexcept 73 { 74 return intf->sd_bus_error_get_errno(&this->error); 75 } 76 77 const sd_bus_error* SdBusError::get_error() const noexcept 78 { 79 return &error; 80 } 81 82 void SdBusError::populateMessage(const char* prefix) 83 { 84 full_message = prefix; 85 if (error.name) 86 { 87 full_message += ": "; 88 full_message += error.name; 89 } 90 if (error.message) 91 { 92 full_message += ": "; 93 full_message += error.message; 94 } 95 } 96 97 void SdBusError::move(SdBusError&& other) 98 { 99 intf = std::move(other.intf); 100 101 intf->sd_bus_error_free(&error); 102 error = other.error; 103 other.error = SD_BUS_ERROR_NULL; 104 105 full_message = std::move(other.full_message); 106 } 107 108 const char* InvalidEnumString::name() const noexcept 109 { 110 return errName; 111 } 112 113 const char* InvalidEnumString::description() const noexcept 114 { 115 return errDesc; 116 } 117 118 const char* InvalidEnumString::what() const noexcept 119 { 120 return errWhat; 121 } 122 123 UnpackPropertyError::UnpackPropertyError(std::string_view propertyName, 124 std::string_view reason) : 125 propertyName(propertyName), 126 reason(reason) 127 {} 128 129 const char* UnpackPropertyError::name() const noexcept 130 { 131 return errName; 132 } 133 134 const char* UnpackPropertyError::description() const noexcept 135 { 136 return errDesc; 137 } 138 139 const char* UnpackPropertyError::what() const noexcept 140 { 141 return errWhat; 142 } 143 144 } // namespace exception 145 } // namespace sdbusplus 146