]> git.proxmox.com Git - ceph.git/blame - ceph/src/common/error_code.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / common / error_code.h
CommitLineData
f67539c2
TL
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2// vim: ts=8 sw=2 smarttab
3/*
4 * Ceph - scalable distributed file system
5 *
6 * Copyright (C) 2017 Red Hat, Inc. <contact@redhat.com>
7 *
8 * Author: Adam C. Emerson <aemerson@redhat.com>
9 *
10 * This is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU Lesser General Public License version
12 * 2.1, as published by the Free Software Foundation. See file
13 * COPYING.
14 */
15
16#ifndef COMMON_CEPH_ERROR_CODE
17#define COMMON_CEPH_ERROR_CODE
18
19#include <netdb.h>
20
21#include <boost/system/error_code.hpp>
22#include <boost/asio.hpp>
23
24#pragma GCC diagnostic push
25#pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
26#pragma clang diagnostic push
27#pragma clang diagnostic ignored "-Wnon-virtual-dtor"
28
29namespace ceph {
30
31// This is for error categories we define, so we can specify the
32// equivalent integral value at the point of definition.
33class converting_category : public boost::system::error_category {
34public:
35 virtual int from_code(int code) const noexcept = 0;
36};
37
38const boost::system::error_category& ceph_category() noexcept;
39
40enum class errc {
41 not_in_map = 1, // The requested item was not found in the map
42 does_not_exist, // Item does not exist
43 failure, // An internal fault or inconsistency
44 exists, // Already exists
45 limit_exceeded, // Attempting to use too much of something
46 auth, // May not be an auth failure. It could be that the
47 // preconditions to attempt auth failed.
48 conflict, // Conflict or precondition failure
49};
50}
51
52namespace boost::system {
53template<>
54struct is_error_condition_enum<::ceph::errc> {
55 static const bool value = true;
56};
57template<>
58struct is_error_code_enum<::ceph::errc> {
59 static const bool value = false;
60};
61}
62
63namespace ceph {
64// explicit conversion:
65inline boost::system::error_code make_error_code(errc e) noexcept {
66 return { static_cast<int>(e), ceph_category() };
67}
68
69// implicit conversion:
70inline boost::system::error_condition make_error_condition(errc e) noexcept {
71 return { static_cast<int>(e), ceph_category() };
72}
73
74[[nodiscard]] boost::system::error_code to_error_code(int ret) noexcept;
75[[nodiscard]] int from_error_code(boost::system::error_code e) noexcept;
76}
77#pragma GCC diagnostic pop
78#pragma clang diagnostic pop
79
80// Moved here from buffer.h so librados doesn't gain a dependency on
81// Boost.System
82
83namespace ceph::buffer {
84inline namespace v15_2_0 {
85const boost::system::error_category& buffer_category() noexcept;
86enum class errc { bad_alloc = 1,
87 end_of_buffer,
88 malformed_input };
89}
90}
91
92namespace boost::system {
93template<>
94struct is_error_code_enum<::ceph::buffer::errc> {
95 static const bool value = true;
96};
97
98template<>
99struct is_error_condition_enum<::ceph::buffer::errc> {
100 static const bool value = false;
101};
102}
103
104namespace ceph::buffer {
105inline namespace v15_2_0 {
106
107// implicit conversion:
108inline boost::system::error_code make_error_code(errc e) noexcept {
109 return { static_cast<int>(e), buffer_category() };
110}
111
112// explicit conversion:
113inline boost::system::error_condition
114make_error_condition(errc e) noexcept {
115 return { static_cast<int>(e), buffer_category() };
116}
117
118struct error : boost::system::system_error {
119 using system_error::system_error;
120};
121
122struct bad_alloc : public error {
123 bad_alloc() : error(errc::bad_alloc) {}
124 bad_alloc(const char* what_arg) : error(errc::bad_alloc, what_arg) {}
125 bad_alloc(const std::string& what_arg) : error(errc::bad_alloc, what_arg) {}
126};
127struct end_of_buffer : public error {
128 end_of_buffer() : error(errc::end_of_buffer) {}
129 end_of_buffer(const char* what_arg) : error(errc::end_of_buffer, what_arg) {}
130 end_of_buffer(const std::string& what_arg)
131 : error(errc::end_of_buffer, what_arg) {}
132};
133
134struct malformed_input : public error {
135 malformed_input() : error(errc::malformed_input) {}
136 malformed_input(const char* what_arg)
137 : error(errc::malformed_input, what_arg) {}
138 malformed_input(const std::string& what_arg)
139 : error(errc::malformed_input, what_arg) {}
140};
141struct error_code : public error {
142 error_code(int r) : error(-r, boost::system::system_category()) {}
143 error_code(int r, const char* what_arg)
144 : error(-r, boost::system::system_category(), what_arg) {}
145 error_code(int r, const std::string& what_arg)
146 : error(-r, boost::system::system_category(), what_arg) {}
147};
148}
149}
150
151#endif // COMMON_CEPH_ERROR_CODE