1*9356374aSAndroid Build Coastguard Worker // Copyright 2019 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker #include "absl/status/status.h"
15*9356374aSAndroid Build Coastguard Worker
16*9356374aSAndroid Build Coastguard Worker #include <errno.h>
17*9356374aSAndroid Build Coastguard Worker
18*9356374aSAndroid Build Coastguard Worker #include <atomic>
19*9356374aSAndroid Build Coastguard Worker #include <cstddef>
20*9356374aSAndroid Build Coastguard Worker #include <cstdint>
21*9356374aSAndroid Build Coastguard Worker #include <cstring>
22*9356374aSAndroid Build Coastguard Worker #include <memory>
23*9356374aSAndroid Build Coastguard Worker #include <ostream>
24*9356374aSAndroid Build Coastguard Worker #include <string>
25*9356374aSAndroid Build Coastguard Worker
26*9356374aSAndroid Build Coastguard Worker #include "absl/base/attributes.h"
27*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
28*9356374aSAndroid Build Coastguard Worker #include "absl/base/internal/raw_logging.h"
29*9356374aSAndroid Build Coastguard Worker #include "absl/base/internal/strerror.h"
30*9356374aSAndroid Build Coastguard Worker #include "absl/base/macros.h"
31*9356374aSAndroid Build Coastguard Worker #include "absl/base/no_destructor.h"
32*9356374aSAndroid Build Coastguard Worker #include "absl/base/nullability.h"
33*9356374aSAndroid Build Coastguard Worker #include "absl/debugging/stacktrace.h"
34*9356374aSAndroid Build Coastguard Worker #include "absl/debugging/symbolize.h"
35*9356374aSAndroid Build Coastguard Worker #include "absl/status/internal/status_internal.h"
36*9356374aSAndroid Build Coastguard Worker #include "absl/strings/str_cat.h"
37*9356374aSAndroid Build Coastguard Worker #include "absl/strings/str_format.h"
38*9356374aSAndroid Build Coastguard Worker #include "absl/strings/str_split.h"
39*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
40*9356374aSAndroid Build Coastguard Worker #include "absl/types/optional.h"
41*9356374aSAndroid Build Coastguard Worker
42*9356374aSAndroid Build Coastguard Worker namespace absl {
43*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
44*9356374aSAndroid Build Coastguard Worker
45*9356374aSAndroid Build Coastguard Worker static_assert(
46*9356374aSAndroid Build Coastguard Worker alignof(status_internal::StatusRep) >= 4,
47*9356374aSAndroid Build Coastguard Worker "absl::Status assumes it can use the bottom 2 bits of a StatusRep*.");
48*9356374aSAndroid Build Coastguard Worker
StatusCodeToString(StatusCode code)49*9356374aSAndroid Build Coastguard Worker std::string StatusCodeToString(StatusCode code) {
50*9356374aSAndroid Build Coastguard Worker switch (code) {
51*9356374aSAndroid Build Coastguard Worker case StatusCode::kOk:
52*9356374aSAndroid Build Coastguard Worker return "OK";
53*9356374aSAndroid Build Coastguard Worker case StatusCode::kCancelled:
54*9356374aSAndroid Build Coastguard Worker return "CANCELLED";
55*9356374aSAndroid Build Coastguard Worker case StatusCode::kUnknown:
56*9356374aSAndroid Build Coastguard Worker return "UNKNOWN";
57*9356374aSAndroid Build Coastguard Worker case StatusCode::kInvalidArgument:
58*9356374aSAndroid Build Coastguard Worker return "INVALID_ARGUMENT";
59*9356374aSAndroid Build Coastguard Worker case StatusCode::kDeadlineExceeded:
60*9356374aSAndroid Build Coastguard Worker return "DEADLINE_EXCEEDED";
61*9356374aSAndroid Build Coastguard Worker case StatusCode::kNotFound:
62*9356374aSAndroid Build Coastguard Worker return "NOT_FOUND";
63*9356374aSAndroid Build Coastguard Worker case StatusCode::kAlreadyExists:
64*9356374aSAndroid Build Coastguard Worker return "ALREADY_EXISTS";
65*9356374aSAndroid Build Coastguard Worker case StatusCode::kPermissionDenied:
66*9356374aSAndroid Build Coastguard Worker return "PERMISSION_DENIED";
67*9356374aSAndroid Build Coastguard Worker case StatusCode::kUnauthenticated:
68*9356374aSAndroid Build Coastguard Worker return "UNAUTHENTICATED";
69*9356374aSAndroid Build Coastguard Worker case StatusCode::kResourceExhausted:
70*9356374aSAndroid Build Coastguard Worker return "RESOURCE_EXHAUSTED";
71*9356374aSAndroid Build Coastguard Worker case StatusCode::kFailedPrecondition:
72*9356374aSAndroid Build Coastguard Worker return "FAILED_PRECONDITION";
73*9356374aSAndroid Build Coastguard Worker case StatusCode::kAborted:
74*9356374aSAndroid Build Coastguard Worker return "ABORTED";
75*9356374aSAndroid Build Coastguard Worker case StatusCode::kOutOfRange:
76*9356374aSAndroid Build Coastguard Worker return "OUT_OF_RANGE";
77*9356374aSAndroid Build Coastguard Worker case StatusCode::kUnimplemented:
78*9356374aSAndroid Build Coastguard Worker return "UNIMPLEMENTED";
79*9356374aSAndroid Build Coastguard Worker case StatusCode::kInternal:
80*9356374aSAndroid Build Coastguard Worker return "INTERNAL";
81*9356374aSAndroid Build Coastguard Worker case StatusCode::kUnavailable:
82*9356374aSAndroid Build Coastguard Worker return "UNAVAILABLE";
83*9356374aSAndroid Build Coastguard Worker case StatusCode::kDataLoss:
84*9356374aSAndroid Build Coastguard Worker return "DATA_LOSS";
85*9356374aSAndroid Build Coastguard Worker default:
86*9356374aSAndroid Build Coastguard Worker return "";
87*9356374aSAndroid Build Coastguard Worker }
88*9356374aSAndroid Build Coastguard Worker }
89*9356374aSAndroid Build Coastguard Worker
operator <<(std::ostream & os,StatusCode code)90*9356374aSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, StatusCode code) {
91*9356374aSAndroid Build Coastguard Worker return os << StatusCodeToString(code);
92*9356374aSAndroid Build Coastguard Worker }
93*9356374aSAndroid Build Coastguard Worker
EmptyString()94*9356374aSAndroid Build Coastguard Worker absl::Nonnull<const std::string*> Status::EmptyString() {
95*9356374aSAndroid Build Coastguard Worker static const absl::NoDestructor<std::string> kEmpty;
96*9356374aSAndroid Build Coastguard Worker return kEmpty.get();
97*9356374aSAndroid Build Coastguard Worker }
98*9356374aSAndroid Build Coastguard Worker
99*9356374aSAndroid Build Coastguard Worker #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
100*9356374aSAndroid Build Coastguard Worker constexpr const char Status::kMovedFromString[];
101*9356374aSAndroid Build Coastguard Worker #endif
102*9356374aSAndroid Build Coastguard Worker
MovedFromString()103*9356374aSAndroid Build Coastguard Worker absl::Nonnull<const std::string*> Status::MovedFromString() {
104*9356374aSAndroid Build Coastguard Worker static const absl::NoDestructor<std::string> kMovedFrom(kMovedFromString);
105*9356374aSAndroid Build Coastguard Worker return kMovedFrom.get();
106*9356374aSAndroid Build Coastguard Worker }
107*9356374aSAndroid Build Coastguard Worker
Status(absl::StatusCode code,absl::string_view msg)108*9356374aSAndroid Build Coastguard Worker Status::Status(absl::StatusCode code, absl::string_view msg)
109*9356374aSAndroid Build Coastguard Worker : rep_(CodeToInlinedRep(code)) {
110*9356374aSAndroid Build Coastguard Worker if (code != absl::StatusCode::kOk && !msg.empty()) {
111*9356374aSAndroid Build Coastguard Worker rep_ = PointerToRep(new status_internal::StatusRep(code, msg, nullptr));
112*9356374aSAndroid Build Coastguard Worker }
113*9356374aSAndroid Build Coastguard Worker }
114*9356374aSAndroid Build Coastguard Worker
PrepareToModify(uintptr_t rep)115*9356374aSAndroid Build Coastguard Worker absl::Nonnull<status_internal::StatusRep*> Status::PrepareToModify(
116*9356374aSAndroid Build Coastguard Worker uintptr_t rep) {
117*9356374aSAndroid Build Coastguard Worker if (IsInlined(rep)) {
118*9356374aSAndroid Build Coastguard Worker return new status_internal::StatusRep(InlinedRepToCode(rep),
119*9356374aSAndroid Build Coastguard Worker absl::string_view(), nullptr);
120*9356374aSAndroid Build Coastguard Worker }
121*9356374aSAndroid Build Coastguard Worker return RepToPointer(rep)->CloneAndUnref();
122*9356374aSAndroid Build Coastguard Worker }
123*9356374aSAndroid Build Coastguard Worker
ToStringSlow(uintptr_t rep,StatusToStringMode mode)124*9356374aSAndroid Build Coastguard Worker std::string Status::ToStringSlow(uintptr_t rep, StatusToStringMode mode) {
125*9356374aSAndroid Build Coastguard Worker if (IsInlined(rep)) {
126*9356374aSAndroid Build Coastguard Worker return absl::StrCat(absl::StatusCodeToString(InlinedRepToCode(rep)), ": ");
127*9356374aSAndroid Build Coastguard Worker }
128*9356374aSAndroid Build Coastguard Worker return RepToPointer(rep)->ToString(mode);
129*9356374aSAndroid Build Coastguard Worker }
130*9356374aSAndroid Build Coastguard Worker
operator <<(std::ostream & os,const Status & x)131*9356374aSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const Status& x) {
132*9356374aSAndroid Build Coastguard Worker os << x.ToString(StatusToStringMode::kWithEverything);
133*9356374aSAndroid Build Coastguard Worker return os;
134*9356374aSAndroid Build Coastguard Worker }
135*9356374aSAndroid Build Coastguard Worker
AbortedError(absl::string_view message)136*9356374aSAndroid Build Coastguard Worker Status AbortedError(absl::string_view message) {
137*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kAborted, message);
138*9356374aSAndroid Build Coastguard Worker }
139*9356374aSAndroid Build Coastguard Worker
AlreadyExistsError(absl::string_view message)140*9356374aSAndroid Build Coastguard Worker Status AlreadyExistsError(absl::string_view message) {
141*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kAlreadyExists, message);
142*9356374aSAndroid Build Coastguard Worker }
143*9356374aSAndroid Build Coastguard Worker
CancelledError(absl::string_view message)144*9356374aSAndroid Build Coastguard Worker Status CancelledError(absl::string_view message) {
145*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kCancelled, message);
146*9356374aSAndroid Build Coastguard Worker }
147*9356374aSAndroid Build Coastguard Worker
DataLossError(absl::string_view message)148*9356374aSAndroid Build Coastguard Worker Status DataLossError(absl::string_view message) {
149*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kDataLoss, message);
150*9356374aSAndroid Build Coastguard Worker }
151*9356374aSAndroid Build Coastguard Worker
DeadlineExceededError(absl::string_view message)152*9356374aSAndroid Build Coastguard Worker Status DeadlineExceededError(absl::string_view message) {
153*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kDeadlineExceeded, message);
154*9356374aSAndroid Build Coastguard Worker }
155*9356374aSAndroid Build Coastguard Worker
FailedPreconditionError(absl::string_view message)156*9356374aSAndroid Build Coastguard Worker Status FailedPreconditionError(absl::string_view message) {
157*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kFailedPrecondition, message);
158*9356374aSAndroid Build Coastguard Worker }
159*9356374aSAndroid Build Coastguard Worker
InternalError(absl::string_view message)160*9356374aSAndroid Build Coastguard Worker Status InternalError(absl::string_view message) {
161*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kInternal, message);
162*9356374aSAndroid Build Coastguard Worker }
163*9356374aSAndroid Build Coastguard Worker
InvalidArgumentError(absl::string_view message)164*9356374aSAndroid Build Coastguard Worker Status InvalidArgumentError(absl::string_view message) {
165*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kInvalidArgument, message);
166*9356374aSAndroid Build Coastguard Worker }
167*9356374aSAndroid Build Coastguard Worker
NotFoundError(absl::string_view message)168*9356374aSAndroid Build Coastguard Worker Status NotFoundError(absl::string_view message) {
169*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kNotFound, message);
170*9356374aSAndroid Build Coastguard Worker }
171*9356374aSAndroid Build Coastguard Worker
OutOfRangeError(absl::string_view message)172*9356374aSAndroid Build Coastguard Worker Status OutOfRangeError(absl::string_view message) {
173*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kOutOfRange, message);
174*9356374aSAndroid Build Coastguard Worker }
175*9356374aSAndroid Build Coastguard Worker
PermissionDeniedError(absl::string_view message)176*9356374aSAndroid Build Coastguard Worker Status PermissionDeniedError(absl::string_view message) {
177*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kPermissionDenied, message);
178*9356374aSAndroid Build Coastguard Worker }
179*9356374aSAndroid Build Coastguard Worker
ResourceExhaustedError(absl::string_view message)180*9356374aSAndroid Build Coastguard Worker Status ResourceExhaustedError(absl::string_view message) {
181*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kResourceExhausted, message);
182*9356374aSAndroid Build Coastguard Worker }
183*9356374aSAndroid Build Coastguard Worker
UnauthenticatedError(absl::string_view message)184*9356374aSAndroid Build Coastguard Worker Status UnauthenticatedError(absl::string_view message) {
185*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kUnauthenticated, message);
186*9356374aSAndroid Build Coastguard Worker }
187*9356374aSAndroid Build Coastguard Worker
UnavailableError(absl::string_view message)188*9356374aSAndroid Build Coastguard Worker Status UnavailableError(absl::string_view message) {
189*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kUnavailable, message);
190*9356374aSAndroid Build Coastguard Worker }
191*9356374aSAndroid Build Coastguard Worker
UnimplementedError(absl::string_view message)192*9356374aSAndroid Build Coastguard Worker Status UnimplementedError(absl::string_view message) {
193*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kUnimplemented, message);
194*9356374aSAndroid Build Coastguard Worker }
195*9356374aSAndroid Build Coastguard Worker
UnknownError(absl::string_view message)196*9356374aSAndroid Build Coastguard Worker Status UnknownError(absl::string_view message) {
197*9356374aSAndroid Build Coastguard Worker return Status(absl::StatusCode::kUnknown, message);
198*9356374aSAndroid Build Coastguard Worker }
199*9356374aSAndroid Build Coastguard Worker
IsAborted(const Status & status)200*9356374aSAndroid Build Coastguard Worker bool IsAborted(const Status& status) {
201*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kAborted;
202*9356374aSAndroid Build Coastguard Worker }
203*9356374aSAndroid Build Coastguard Worker
IsAlreadyExists(const Status & status)204*9356374aSAndroid Build Coastguard Worker bool IsAlreadyExists(const Status& status) {
205*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kAlreadyExists;
206*9356374aSAndroid Build Coastguard Worker }
207*9356374aSAndroid Build Coastguard Worker
IsCancelled(const Status & status)208*9356374aSAndroid Build Coastguard Worker bool IsCancelled(const Status& status) {
209*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kCancelled;
210*9356374aSAndroid Build Coastguard Worker }
211*9356374aSAndroid Build Coastguard Worker
IsDataLoss(const Status & status)212*9356374aSAndroid Build Coastguard Worker bool IsDataLoss(const Status& status) {
213*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kDataLoss;
214*9356374aSAndroid Build Coastguard Worker }
215*9356374aSAndroid Build Coastguard Worker
IsDeadlineExceeded(const Status & status)216*9356374aSAndroid Build Coastguard Worker bool IsDeadlineExceeded(const Status& status) {
217*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kDeadlineExceeded;
218*9356374aSAndroid Build Coastguard Worker }
219*9356374aSAndroid Build Coastguard Worker
IsFailedPrecondition(const Status & status)220*9356374aSAndroid Build Coastguard Worker bool IsFailedPrecondition(const Status& status) {
221*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kFailedPrecondition;
222*9356374aSAndroid Build Coastguard Worker }
223*9356374aSAndroid Build Coastguard Worker
IsInternal(const Status & status)224*9356374aSAndroid Build Coastguard Worker bool IsInternal(const Status& status) {
225*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kInternal;
226*9356374aSAndroid Build Coastguard Worker }
227*9356374aSAndroid Build Coastguard Worker
IsInvalidArgument(const Status & status)228*9356374aSAndroid Build Coastguard Worker bool IsInvalidArgument(const Status& status) {
229*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kInvalidArgument;
230*9356374aSAndroid Build Coastguard Worker }
231*9356374aSAndroid Build Coastguard Worker
IsNotFound(const Status & status)232*9356374aSAndroid Build Coastguard Worker bool IsNotFound(const Status& status) {
233*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kNotFound;
234*9356374aSAndroid Build Coastguard Worker }
235*9356374aSAndroid Build Coastguard Worker
IsOutOfRange(const Status & status)236*9356374aSAndroid Build Coastguard Worker bool IsOutOfRange(const Status& status) {
237*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kOutOfRange;
238*9356374aSAndroid Build Coastguard Worker }
239*9356374aSAndroid Build Coastguard Worker
IsPermissionDenied(const Status & status)240*9356374aSAndroid Build Coastguard Worker bool IsPermissionDenied(const Status& status) {
241*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kPermissionDenied;
242*9356374aSAndroid Build Coastguard Worker }
243*9356374aSAndroid Build Coastguard Worker
IsResourceExhausted(const Status & status)244*9356374aSAndroid Build Coastguard Worker bool IsResourceExhausted(const Status& status) {
245*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kResourceExhausted;
246*9356374aSAndroid Build Coastguard Worker }
247*9356374aSAndroid Build Coastguard Worker
IsUnauthenticated(const Status & status)248*9356374aSAndroid Build Coastguard Worker bool IsUnauthenticated(const Status& status) {
249*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kUnauthenticated;
250*9356374aSAndroid Build Coastguard Worker }
251*9356374aSAndroid Build Coastguard Worker
IsUnavailable(const Status & status)252*9356374aSAndroid Build Coastguard Worker bool IsUnavailable(const Status& status) {
253*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kUnavailable;
254*9356374aSAndroid Build Coastguard Worker }
255*9356374aSAndroid Build Coastguard Worker
IsUnimplemented(const Status & status)256*9356374aSAndroid Build Coastguard Worker bool IsUnimplemented(const Status& status) {
257*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kUnimplemented;
258*9356374aSAndroid Build Coastguard Worker }
259*9356374aSAndroid Build Coastguard Worker
IsUnknown(const Status & status)260*9356374aSAndroid Build Coastguard Worker bool IsUnknown(const Status& status) {
261*9356374aSAndroid Build Coastguard Worker return status.code() == absl::StatusCode::kUnknown;
262*9356374aSAndroid Build Coastguard Worker }
263*9356374aSAndroid Build Coastguard Worker
ErrnoToStatusCode(int error_number)264*9356374aSAndroid Build Coastguard Worker StatusCode ErrnoToStatusCode(int error_number) {
265*9356374aSAndroid Build Coastguard Worker switch (error_number) {
266*9356374aSAndroid Build Coastguard Worker case 0:
267*9356374aSAndroid Build Coastguard Worker return StatusCode::kOk;
268*9356374aSAndroid Build Coastguard Worker case EINVAL: // Invalid argument
269*9356374aSAndroid Build Coastguard Worker case ENAMETOOLONG: // Filename too long
270*9356374aSAndroid Build Coastguard Worker case E2BIG: // Argument list too long
271*9356374aSAndroid Build Coastguard Worker case EDESTADDRREQ: // Destination address required
272*9356374aSAndroid Build Coastguard Worker case EDOM: // Mathematics argument out of domain of function
273*9356374aSAndroid Build Coastguard Worker case EFAULT: // Bad address
274*9356374aSAndroid Build Coastguard Worker case EILSEQ: // Illegal byte sequence
275*9356374aSAndroid Build Coastguard Worker case ENOPROTOOPT: // Protocol not available
276*9356374aSAndroid Build Coastguard Worker case ENOTSOCK: // Not a socket
277*9356374aSAndroid Build Coastguard Worker case ENOTTY: // Inappropriate I/O control operation
278*9356374aSAndroid Build Coastguard Worker case EPROTOTYPE: // Protocol wrong type for socket
279*9356374aSAndroid Build Coastguard Worker case ESPIPE: // Invalid seek
280*9356374aSAndroid Build Coastguard Worker return StatusCode::kInvalidArgument;
281*9356374aSAndroid Build Coastguard Worker case ETIMEDOUT: // Connection timed out
282*9356374aSAndroid Build Coastguard Worker return StatusCode::kDeadlineExceeded;
283*9356374aSAndroid Build Coastguard Worker case ENODEV: // No such device
284*9356374aSAndroid Build Coastguard Worker case ENOENT: // No such file or directory
285*9356374aSAndroid Build Coastguard Worker #ifdef ENOMEDIUM
286*9356374aSAndroid Build Coastguard Worker case ENOMEDIUM: // No medium found
287*9356374aSAndroid Build Coastguard Worker #endif
288*9356374aSAndroid Build Coastguard Worker case ENXIO: // No such device or address
289*9356374aSAndroid Build Coastguard Worker case ESRCH: // No such process
290*9356374aSAndroid Build Coastguard Worker return StatusCode::kNotFound;
291*9356374aSAndroid Build Coastguard Worker case EEXIST: // File exists
292*9356374aSAndroid Build Coastguard Worker case EADDRNOTAVAIL: // Address not available
293*9356374aSAndroid Build Coastguard Worker case EALREADY: // Connection already in progress
294*9356374aSAndroid Build Coastguard Worker #ifdef ENOTUNIQ
295*9356374aSAndroid Build Coastguard Worker case ENOTUNIQ: // Name not unique on network
296*9356374aSAndroid Build Coastguard Worker #endif
297*9356374aSAndroid Build Coastguard Worker return StatusCode::kAlreadyExists;
298*9356374aSAndroid Build Coastguard Worker case EPERM: // Operation not permitted
299*9356374aSAndroid Build Coastguard Worker case EACCES: // Permission denied
300*9356374aSAndroid Build Coastguard Worker #ifdef ENOKEY
301*9356374aSAndroid Build Coastguard Worker case ENOKEY: // Required key not available
302*9356374aSAndroid Build Coastguard Worker #endif
303*9356374aSAndroid Build Coastguard Worker case EROFS: // Read only file system
304*9356374aSAndroid Build Coastguard Worker return StatusCode::kPermissionDenied;
305*9356374aSAndroid Build Coastguard Worker case ENOTEMPTY: // Directory not empty
306*9356374aSAndroid Build Coastguard Worker case EISDIR: // Is a directory
307*9356374aSAndroid Build Coastguard Worker case ENOTDIR: // Not a directory
308*9356374aSAndroid Build Coastguard Worker case EADDRINUSE: // Address already in use
309*9356374aSAndroid Build Coastguard Worker case EBADF: // Invalid file descriptor
310*9356374aSAndroid Build Coastguard Worker #ifdef EBADFD
311*9356374aSAndroid Build Coastguard Worker case EBADFD: // File descriptor in bad state
312*9356374aSAndroid Build Coastguard Worker #endif
313*9356374aSAndroid Build Coastguard Worker case EBUSY: // Device or resource busy
314*9356374aSAndroid Build Coastguard Worker case ECHILD: // No child processes
315*9356374aSAndroid Build Coastguard Worker case EISCONN: // Socket is connected
316*9356374aSAndroid Build Coastguard Worker #ifdef EISNAM
317*9356374aSAndroid Build Coastguard Worker case EISNAM: // Is a named type file
318*9356374aSAndroid Build Coastguard Worker #endif
319*9356374aSAndroid Build Coastguard Worker #ifdef ENOTBLK
320*9356374aSAndroid Build Coastguard Worker case ENOTBLK: // Block device required
321*9356374aSAndroid Build Coastguard Worker #endif
322*9356374aSAndroid Build Coastguard Worker case ENOTCONN: // The socket is not connected
323*9356374aSAndroid Build Coastguard Worker case EPIPE: // Broken pipe
324*9356374aSAndroid Build Coastguard Worker #ifdef ESHUTDOWN
325*9356374aSAndroid Build Coastguard Worker case ESHUTDOWN: // Cannot send after transport endpoint shutdown
326*9356374aSAndroid Build Coastguard Worker #endif
327*9356374aSAndroid Build Coastguard Worker case ETXTBSY: // Text file busy
328*9356374aSAndroid Build Coastguard Worker #ifdef EUNATCH
329*9356374aSAndroid Build Coastguard Worker case EUNATCH: // Protocol driver not attached
330*9356374aSAndroid Build Coastguard Worker #endif
331*9356374aSAndroid Build Coastguard Worker return StatusCode::kFailedPrecondition;
332*9356374aSAndroid Build Coastguard Worker case ENOSPC: // No space left on device
333*9356374aSAndroid Build Coastguard Worker #ifdef EDQUOT
334*9356374aSAndroid Build Coastguard Worker case EDQUOT: // Disk quota exceeded
335*9356374aSAndroid Build Coastguard Worker #endif
336*9356374aSAndroid Build Coastguard Worker case EMFILE: // Too many open files
337*9356374aSAndroid Build Coastguard Worker case EMLINK: // Too many links
338*9356374aSAndroid Build Coastguard Worker case ENFILE: // Too many open files in system
339*9356374aSAndroid Build Coastguard Worker case ENOBUFS: // No buffer space available
340*9356374aSAndroid Build Coastguard Worker case ENOMEM: // Not enough space
341*9356374aSAndroid Build Coastguard Worker #ifdef EUSERS
342*9356374aSAndroid Build Coastguard Worker case EUSERS: // Too many users
343*9356374aSAndroid Build Coastguard Worker #endif
344*9356374aSAndroid Build Coastguard Worker return StatusCode::kResourceExhausted;
345*9356374aSAndroid Build Coastguard Worker #ifdef ECHRNG
346*9356374aSAndroid Build Coastguard Worker case ECHRNG: // Channel number out of range
347*9356374aSAndroid Build Coastguard Worker #endif
348*9356374aSAndroid Build Coastguard Worker case EFBIG: // File too large
349*9356374aSAndroid Build Coastguard Worker case EOVERFLOW: // Value too large to be stored in data type
350*9356374aSAndroid Build Coastguard Worker case ERANGE: // Result too large
351*9356374aSAndroid Build Coastguard Worker return StatusCode::kOutOfRange;
352*9356374aSAndroid Build Coastguard Worker #ifdef ENOPKG
353*9356374aSAndroid Build Coastguard Worker case ENOPKG: // Package not installed
354*9356374aSAndroid Build Coastguard Worker #endif
355*9356374aSAndroid Build Coastguard Worker case ENOSYS: // Function not implemented
356*9356374aSAndroid Build Coastguard Worker case ENOTSUP: // Operation not supported
357*9356374aSAndroid Build Coastguard Worker case EAFNOSUPPORT: // Address family not supported
358*9356374aSAndroid Build Coastguard Worker #ifdef EPFNOSUPPORT
359*9356374aSAndroid Build Coastguard Worker case EPFNOSUPPORT: // Protocol family not supported
360*9356374aSAndroid Build Coastguard Worker #endif
361*9356374aSAndroid Build Coastguard Worker case EPROTONOSUPPORT: // Protocol not supported
362*9356374aSAndroid Build Coastguard Worker #ifdef ESOCKTNOSUPPORT
363*9356374aSAndroid Build Coastguard Worker case ESOCKTNOSUPPORT: // Socket type not supported
364*9356374aSAndroid Build Coastguard Worker #endif
365*9356374aSAndroid Build Coastguard Worker case EXDEV: // Improper link
366*9356374aSAndroid Build Coastguard Worker return StatusCode::kUnimplemented;
367*9356374aSAndroid Build Coastguard Worker case EAGAIN: // Resource temporarily unavailable
368*9356374aSAndroid Build Coastguard Worker #ifdef ECOMM
369*9356374aSAndroid Build Coastguard Worker case ECOMM: // Communication error on send
370*9356374aSAndroid Build Coastguard Worker #endif
371*9356374aSAndroid Build Coastguard Worker case ECONNREFUSED: // Connection refused
372*9356374aSAndroid Build Coastguard Worker case ECONNABORTED: // Connection aborted
373*9356374aSAndroid Build Coastguard Worker case ECONNRESET: // Connection reset
374*9356374aSAndroid Build Coastguard Worker case EINTR: // Interrupted function call
375*9356374aSAndroid Build Coastguard Worker #ifdef EHOSTDOWN
376*9356374aSAndroid Build Coastguard Worker case EHOSTDOWN: // Host is down
377*9356374aSAndroid Build Coastguard Worker #endif
378*9356374aSAndroid Build Coastguard Worker case EHOSTUNREACH: // Host is unreachable
379*9356374aSAndroid Build Coastguard Worker case ENETDOWN: // Network is down
380*9356374aSAndroid Build Coastguard Worker case ENETRESET: // Connection aborted by network
381*9356374aSAndroid Build Coastguard Worker case ENETUNREACH: // Network unreachable
382*9356374aSAndroid Build Coastguard Worker case ENOLCK: // No locks available
383*9356374aSAndroid Build Coastguard Worker case ENOLINK: // Link has been severed
384*9356374aSAndroid Build Coastguard Worker #ifdef ENONET
385*9356374aSAndroid Build Coastguard Worker case ENONET: // Machine is not on the network
386*9356374aSAndroid Build Coastguard Worker #endif
387*9356374aSAndroid Build Coastguard Worker return StatusCode::kUnavailable;
388*9356374aSAndroid Build Coastguard Worker case EDEADLK: // Resource deadlock avoided
389*9356374aSAndroid Build Coastguard Worker #ifdef ESTALE
390*9356374aSAndroid Build Coastguard Worker case ESTALE: // Stale file handle
391*9356374aSAndroid Build Coastguard Worker #endif
392*9356374aSAndroid Build Coastguard Worker return StatusCode::kAborted;
393*9356374aSAndroid Build Coastguard Worker case ECANCELED: // Operation cancelled
394*9356374aSAndroid Build Coastguard Worker return StatusCode::kCancelled;
395*9356374aSAndroid Build Coastguard Worker default:
396*9356374aSAndroid Build Coastguard Worker return StatusCode::kUnknown;
397*9356374aSAndroid Build Coastguard Worker }
398*9356374aSAndroid Build Coastguard Worker }
399*9356374aSAndroid Build Coastguard Worker
400*9356374aSAndroid Build Coastguard Worker namespace {
MessageForErrnoToStatus(int error_number,absl::string_view message)401*9356374aSAndroid Build Coastguard Worker std::string MessageForErrnoToStatus(int error_number,
402*9356374aSAndroid Build Coastguard Worker absl::string_view message) {
403*9356374aSAndroid Build Coastguard Worker return absl::StrCat(message, ": ",
404*9356374aSAndroid Build Coastguard Worker absl::base_internal::StrError(error_number));
405*9356374aSAndroid Build Coastguard Worker }
406*9356374aSAndroid Build Coastguard Worker } // namespace
407*9356374aSAndroid Build Coastguard Worker
ErrnoToStatus(int error_number,absl::string_view message)408*9356374aSAndroid Build Coastguard Worker Status ErrnoToStatus(int error_number, absl::string_view message) {
409*9356374aSAndroid Build Coastguard Worker return Status(ErrnoToStatusCode(error_number),
410*9356374aSAndroid Build Coastguard Worker MessageForErrnoToStatus(error_number, message));
411*9356374aSAndroid Build Coastguard Worker }
412*9356374aSAndroid Build Coastguard Worker
StatusMessageAsCStr(const Status & status)413*9356374aSAndroid Build Coastguard Worker absl::Nonnull<const char*> StatusMessageAsCStr(const Status& status) {
414*9356374aSAndroid Build Coastguard Worker // As an internal implementation detail, we guarantee that if status.message()
415*9356374aSAndroid Build Coastguard Worker // is non-empty, then the resulting string_view is null terminated.
416*9356374aSAndroid Build Coastguard Worker auto sv_message = status.message();
417*9356374aSAndroid Build Coastguard Worker return sv_message.empty() ? "" : sv_message.data();
418*9356374aSAndroid Build Coastguard Worker }
419*9356374aSAndroid Build Coastguard Worker
420*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
421*9356374aSAndroid Build Coastguard Worker } // namespace absl
422