diff options
Diffstat (limited to '')
-rw-r--r-- | src/common/error_code.h | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/src/common/error_code.h b/src/common/error_code.h new file mode 100644 index 000000000..6bcd8cb17 --- /dev/null +++ b/src/common/error_code.h @@ -0,0 +1,151 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2017 Red Hat, Inc. <contact@redhat.com> + * + * Author: Adam C. Emerson <aemerson@redhat.com> + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License version + * 2.1, as published by the Free Software Foundation. See file + * COPYING. + */ + +#ifndef COMMON_CEPH_ERROR_CODE +#define COMMON_CEPH_ERROR_CODE + +#include <netdb.h> + +#include <boost/system/error_code.hpp> +#include <boost/asio.hpp> + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wnon-virtual-dtor" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnon-virtual-dtor" + +namespace ceph { + +// This is for error categories we define, so we can specify the +// equivalent integral value at the point of definition. +class converting_category : public boost::system::error_category { +public: + virtual int from_code(int code) const noexcept = 0; +}; + +const boost::system::error_category& ceph_category() noexcept; + +enum class errc { + not_in_map = 1, // The requested item was not found in the map + does_not_exist, // Item does not exist + failure, // An internal fault or inconsistency + exists, // Already exists + limit_exceeded, // Attempting to use too much of something + auth, // May not be an auth failure. It could be that the + // preconditions to attempt auth failed. + conflict, // Conflict or precondition failure +}; +} + +namespace boost::system { +template<> +struct is_error_condition_enum<::ceph::errc> { + static const bool value = true; +}; +template<> +struct is_error_code_enum<::ceph::errc> { + static const bool value = false; +}; +} + +namespace ceph { +// explicit conversion: +inline boost::system::error_code make_error_code(errc e) noexcept { + return { static_cast<int>(e), ceph_category() }; +} + +// implicit conversion: +inline boost::system::error_condition make_error_condition(errc e) noexcept { + return { static_cast<int>(e), ceph_category() }; +} + +[[nodiscard]] boost::system::error_code to_error_code(int ret) noexcept; +[[nodiscard]] int from_error_code(boost::system::error_code e) noexcept; +} +#pragma GCC diagnostic pop +#pragma clang diagnostic pop + +// Moved here from buffer.h so librados doesn't gain a dependency on +// Boost.System + +namespace ceph::buffer { +inline namespace v15_2_0 { +const boost::system::error_category& buffer_category() noexcept; +enum class errc { bad_alloc = 1, + end_of_buffer, + malformed_input }; +} +} + +namespace boost::system { +template<> +struct is_error_code_enum<::ceph::buffer::errc> { + static const bool value = true; +}; + +template<> +struct is_error_condition_enum<::ceph::buffer::errc> { + static const bool value = false; +}; +} + +namespace ceph::buffer { +inline namespace v15_2_0 { + +// implicit conversion: +inline boost::system::error_code make_error_code(errc e) noexcept { + return { static_cast<int>(e), buffer_category() }; +} + +// explicit conversion: +inline boost::system::error_condition +make_error_condition(errc e) noexcept { + return { static_cast<int>(e), buffer_category() }; +} + +struct error : boost::system::system_error { + using system_error::system_error; +}; + +struct bad_alloc : public error { + bad_alloc() : error(errc::bad_alloc) {} + bad_alloc(const char* what_arg) : error(errc::bad_alloc, what_arg) {} + bad_alloc(const std::string& what_arg) : error(errc::bad_alloc, what_arg) {} +}; +struct end_of_buffer : public error { + end_of_buffer() : error(errc::end_of_buffer) {} + end_of_buffer(const char* what_arg) : error(errc::end_of_buffer, what_arg) {} + end_of_buffer(const std::string& what_arg) + : error(errc::end_of_buffer, what_arg) {} +}; + +struct malformed_input : public error { + malformed_input() : error(errc::malformed_input) {} + malformed_input(const char* what_arg) + : error(errc::malformed_input, what_arg) {} + malformed_input(const std::string& what_arg) + : error(errc::malformed_input, what_arg) {} +}; +struct error_code : public error { + error_code(int r) : error(-r, boost::system::system_category()) {} + error_code(int r, const char* what_arg) + : error(-r, boost::system::system_category(), what_arg) {} + error_code(int r, const std::string& what_arg) + : error(-r, boost::system::system_category(), what_arg) {} +}; +} +} + +#endif // COMMON_CEPH_ERROR_CODE |