xref: /openbmc/sdbusplus/src/exception.cpp (revision 0c8136a408c56b432b55ca93b5313313e8d1f585)
17f664254SPatrick Williams #include <sdbusplus/exception.hpp>
27f664254SPatrick Williams 
37f664254SPatrick Williams #include <stdexcept>
47f664254SPatrick Williams #include <utility>
57f664254SPatrick Williams 
6*0c8136a4SPatrick Williams #ifdef __clang__
7*0c8136a4SPatrick Williams #pragma clang diagnostic push
8*0c8136a4SPatrick Williams #pragma clang diagnostic ignored "-Wc99-extensions"
9*0c8136a4SPatrick Williams #endif
10*0c8136a4SPatrick Williams 
117f664254SPatrick Williams namespace sdbusplus
127f664254SPatrick Williams {
137f664254SPatrick Williams namespace exception
147f664254SPatrick Williams {
157f664254SPatrick Williams 
167f664254SPatrick Williams SdBusError::SdBusError(int error, const char* prefix, SdBusInterface* intf) :
177f664254SPatrick Williams     error(SD_BUS_ERROR_NULL), intf(intf)
187f664254SPatrick Williams {
197f664254SPatrick Williams     // We can't check the output of intf->sd_bus_error_set_errno() because
207f664254SPatrick Williams     // it returns the input errorcode. We don't want to try and guess
217f664254SPatrick Williams     // possible error statuses. Instead, check to see if the error was
227f664254SPatrick Williams     // constructed to determine success.
237f664254SPatrick Williams     intf->sd_bus_error_set_errno(&this->error, error);
247f664254SPatrick Williams     if (!intf->sd_bus_error_is_set(&this->error))
257f664254SPatrick Williams     {
267f664254SPatrick Williams         throw std::runtime_error("Failed to create SdBusError");
277f664254SPatrick Williams     }
287f664254SPatrick Williams 
297f664254SPatrick Williams     populateMessage(prefix);
307f664254SPatrick Williams }
317f664254SPatrick Williams 
327f664254SPatrick Williams SdBusError::SdBusError(sd_bus_error* error, const char* prefix,
337f664254SPatrick Williams                        SdBusInterface* intf) :
347f664254SPatrick Williams     error(*error),
357f664254SPatrick Williams     intf(intf)
367f664254SPatrick Williams {
377f664254SPatrick Williams     // We own the error so remove the caller's reference
387f664254SPatrick Williams     *error = SD_BUS_ERROR_NULL;
397f664254SPatrick Williams 
407f664254SPatrick Williams     populateMessage(prefix);
417f664254SPatrick Williams }
427f664254SPatrick Williams 
437f664254SPatrick Williams SdBusError::SdBusError(SdBusError&& other) : error(SD_BUS_ERROR_NULL)
447f664254SPatrick Williams {
457f664254SPatrick Williams     move(std::move(other));
467f664254SPatrick Williams }
477f664254SPatrick Williams 
487f664254SPatrick Williams SdBusError& SdBusError::operator=(SdBusError&& other)
497f664254SPatrick Williams {
507f664254SPatrick Williams     if (this != &other)
517f664254SPatrick Williams     {
527f664254SPatrick Williams         move(std::move(other));
537f664254SPatrick Williams     }
547f664254SPatrick Williams     return *this;
557f664254SPatrick Williams }
567f664254SPatrick Williams 
577f664254SPatrick Williams SdBusError::~SdBusError()
587f664254SPatrick Williams {
597f664254SPatrick Williams     intf->sd_bus_error_free(&error);
607f664254SPatrick Williams }
617f664254SPatrick Williams 
627f664254SPatrick Williams const char* SdBusError::name() const noexcept
637f664254SPatrick Williams {
647f664254SPatrick Williams     return error.name;
657f664254SPatrick Williams }
667f664254SPatrick Williams 
677f664254SPatrick Williams const char* SdBusError::description() const noexcept
687f664254SPatrick Williams {
697f664254SPatrick Williams     return error.message;
707f664254SPatrick Williams }
717f664254SPatrick Williams 
727f664254SPatrick Williams const char* SdBusError::what() const noexcept
737f664254SPatrick Williams {
747f664254SPatrick Williams     return full_message.c_str();
757f664254SPatrick Williams }
767f664254SPatrick Williams 
777f664254SPatrick Williams int SdBusError::get_errno() const noexcept
787f664254SPatrick Williams {
797f664254SPatrick Williams     return intf->sd_bus_error_get_errno(&this->error);
807f664254SPatrick Williams }
817f664254SPatrick Williams 
827f664254SPatrick Williams const sd_bus_error* SdBusError::get_error() const noexcept
837f664254SPatrick Williams {
847f664254SPatrick Williams     return &error;
857f664254SPatrick Williams }
867f664254SPatrick Williams 
877f664254SPatrick Williams void SdBusError::populateMessage(const char* prefix)
887f664254SPatrick Williams {
897f664254SPatrick Williams     full_message = prefix;
907f664254SPatrick Williams     if (error.name)
917f664254SPatrick Williams     {
927f664254SPatrick Williams         full_message += ": ";
937f664254SPatrick Williams         full_message += error.name;
947f664254SPatrick Williams     }
957f664254SPatrick Williams     if (error.message)
967f664254SPatrick Williams     {
977f664254SPatrick Williams         full_message += ": ";
987f664254SPatrick Williams         full_message += error.message;
997f664254SPatrick Williams     }
1007f664254SPatrick Williams }
1017f664254SPatrick Williams 
1027f664254SPatrick Williams void SdBusError::move(SdBusError&& other)
1037f664254SPatrick Williams {
1047f664254SPatrick Williams     intf = std::move(other.intf);
1057f664254SPatrick Williams 
1067f664254SPatrick Williams     intf->sd_bus_error_free(&error);
1077f664254SPatrick Williams     error = other.error;
1087f664254SPatrick Williams     other.error = SD_BUS_ERROR_NULL;
1097f664254SPatrick Williams 
1107f664254SPatrick Williams     full_message = std::move(other.full_message);
1117f664254SPatrick Williams }
1127f664254SPatrick Williams 
1137f664254SPatrick Williams const char* InvalidEnumString::name() const noexcept
1147f664254SPatrick Williams {
1157f664254SPatrick Williams     return errName;
1167f664254SPatrick Williams }
1177f664254SPatrick Williams 
1187f664254SPatrick Williams const char* InvalidEnumString::description() const noexcept
1197f664254SPatrick Williams {
1207f664254SPatrick Williams     return errDesc;
1217f664254SPatrick Williams }
1227f664254SPatrick Williams 
1237f664254SPatrick Williams const char* InvalidEnumString::what() const noexcept
1247f664254SPatrick Williams {
1257f664254SPatrick Williams     return errWhat;
1267f664254SPatrick Williams }
1277f664254SPatrick Williams 
12809b88f26SKrzysztof Grobelny UnpackPropertyError::UnpackPropertyError(std::string_view propertyName,
12909b88f26SKrzysztof Grobelny                                          std::string_view reason) :
13009b88f26SKrzysztof Grobelny     propertyName(propertyName),
13109b88f26SKrzysztof Grobelny     reason(reason)
13209b88f26SKrzysztof Grobelny {}
13309b88f26SKrzysztof Grobelny 
13409b88f26SKrzysztof Grobelny const char* UnpackPropertyError::name() const noexcept
13509b88f26SKrzysztof Grobelny {
13609b88f26SKrzysztof Grobelny     return errName;
13709b88f26SKrzysztof Grobelny }
13809b88f26SKrzysztof Grobelny 
13909b88f26SKrzysztof Grobelny const char* UnpackPropertyError::description() const noexcept
14009b88f26SKrzysztof Grobelny {
14109b88f26SKrzysztof Grobelny     return errDesc;
14209b88f26SKrzysztof Grobelny }
14309b88f26SKrzysztof Grobelny 
14409b88f26SKrzysztof Grobelny const char* UnpackPropertyError::what() const noexcept
14509b88f26SKrzysztof Grobelny {
14609b88f26SKrzysztof Grobelny     return errWhat;
14709b88f26SKrzysztof Grobelny }
14809b88f26SKrzysztof Grobelny 
1497f664254SPatrick Williams } // namespace exception
1507f664254SPatrick Williams } // namespace sdbusplus
151*0c8136a4SPatrick Williams 
152*0c8136a4SPatrick Williams #ifdef __clang__
153*0c8136a4SPatrick Williams #pragma clang diagnostic pop
154*0c8136a4SPatrick Williams #endif
155