xref: /openbmc/sdbusplus/src/exception.cpp (revision 06f265f6f18e22b1fb68761edb50ecd6722c2a47)
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