xref: /aosp_15_r20/external/abseil-cpp/absl/status/status.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
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