1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
|
// Copyright 2014 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <chromeos/errors/error_codes.h>
#include <base/posix/safe_strerror.h>
namespace chromeos {
namespace errors {
namespace dbus {
const char kDomain[] = "dbus";
} // namespace dbus
namespace json {
const char kDomain[] = "json_parser";
const char kParseError[] = "json_parse_error";
const char kObjectExpected[] = "json_object_expected";
} // namespace json
namespace http {
const char kDomain[] = "http";
} // namespace http
namespace system {
const char kDomain[] = "system";
namespace {
const struct ErrorMapEntry {
const char* error_code;
int errnum;
} error_map[] = {
#define ERROR_ENTRY(err) { #err, err }
ERROR_ENTRY(EPERM), // Operation not permitted
ERROR_ENTRY(ENOENT), // No such file or directory
ERROR_ENTRY(ESRCH), // No such process
ERROR_ENTRY(EINTR), // Interrupted system call
ERROR_ENTRY(EIO), // I/O error
ERROR_ENTRY(ENXIO), // No such device or address
ERROR_ENTRY(E2BIG), // Argument list too long
ERROR_ENTRY(ENOEXEC), // Exec format error
ERROR_ENTRY(EBADF), // Bad file number
ERROR_ENTRY(ECHILD), // No child processes
ERROR_ENTRY(EAGAIN), // Try again
ERROR_ENTRY(ENOMEM), // Out of memory
ERROR_ENTRY(EACCES), // Permission denied
ERROR_ENTRY(EFAULT), // Bad address
ERROR_ENTRY(ENOTBLK), // Block device required
ERROR_ENTRY(EBUSY), // Device or resource busy
ERROR_ENTRY(EEXIST), // File exists
ERROR_ENTRY(EXDEV), // Cross-device link
ERROR_ENTRY(ENODEV), // No such device
ERROR_ENTRY(ENOTDIR), // Not a directory
ERROR_ENTRY(EISDIR), // Is a directory
ERROR_ENTRY(EINVAL), // Invalid argument
ERROR_ENTRY(ENFILE), // File table overflow
ERROR_ENTRY(EMFILE), // Too many open files
ERROR_ENTRY(ENOTTY), // Not a typewriter
ERROR_ENTRY(ETXTBSY), // Text file busy
ERROR_ENTRY(EFBIG), // File too large
ERROR_ENTRY(ENOSPC), // No space left on device
ERROR_ENTRY(ESPIPE), // Illegal seek
ERROR_ENTRY(EROFS), // Read-only file system
ERROR_ENTRY(EMLINK), // Too many links
ERROR_ENTRY(EPIPE), // Broken pipe
ERROR_ENTRY(EDOM), // Math argument out of domain of func
ERROR_ENTRY(ERANGE), // Math result not representable
ERROR_ENTRY(EDEADLK), // Resource deadlock would occur
ERROR_ENTRY(ENAMETOOLONG), // File name too long
ERROR_ENTRY(ENOLCK), // No record locks available
ERROR_ENTRY(ENOSYS), // Function not implemented
ERROR_ENTRY(ENOTEMPTY), // Directory not empty
ERROR_ENTRY(ELOOP), // Too many symbolic links encountered
ERROR_ENTRY(ENOMSG), // No message of desired type
ERROR_ENTRY(EIDRM), // Identifier removed
#ifdef __linux__
ERROR_ENTRY(ECHRNG), // Channel number out of range
ERROR_ENTRY(EL2NSYNC), // Level 2 not synchronized
ERROR_ENTRY(EL3HLT), // Level 3 halted
ERROR_ENTRY(EL3RST), // Level 3 reset
ERROR_ENTRY(ELNRNG), // Link number out of range
ERROR_ENTRY(EUNATCH), // Protocol driver not attached
ERROR_ENTRY(ENOCSI), // No CSI structure available
ERROR_ENTRY(EL2HLT), // Level 2 halted
ERROR_ENTRY(EBADE), // Invalid exchange
ERROR_ENTRY(EBADR), // Invalid request descriptor
ERROR_ENTRY(EXFULL), // Exchange full
ERROR_ENTRY(ENOANO), // No anode
ERROR_ENTRY(EBADRQC), // Invalid request code
ERROR_ENTRY(EBADSLT), // Invalid slot
ERROR_ENTRY(EBFONT), // Bad font file format
#endif // __linux__
ERROR_ENTRY(ENOSTR), // Device not a stream
ERROR_ENTRY(ENODATA), // No data available
ERROR_ENTRY(ETIME), // Timer expired
ERROR_ENTRY(ENOSR), // Out of streams resources
#ifdef __linux__
ERROR_ENTRY(ENONET), // Machine is not on the network
ERROR_ENTRY(ENOPKG), // Package not installed
#endif // __linux__
ERROR_ENTRY(EREMOTE), // Object is remote
ERROR_ENTRY(ENOLINK), // Link has been severed
#ifdef __linux__
ERROR_ENTRY(EADV), // Advertise error
ERROR_ENTRY(ESRMNT), // Srmount error
ERROR_ENTRY(ECOMM), // Communication error on send
#endif // __linux__
ERROR_ENTRY(EPROTO), // Protocol error
ERROR_ENTRY(EMULTIHOP), // Multihop attempted
#ifdef __linux__
ERROR_ENTRY(EDOTDOT), // RFS specific error
#endif // __linux__
ERROR_ENTRY(EBADMSG), // Not a data message
ERROR_ENTRY(EOVERFLOW), // Value too large for defined data type
#ifdef __linux__
ERROR_ENTRY(ENOTUNIQ), // Name not unique on network
ERROR_ENTRY(EBADFD), // File descriptor in bad state
ERROR_ENTRY(EREMCHG), // Remote address changed
ERROR_ENTRY(ELIBACC), // Can not access a needed shared library
ERROR_ENTRY(ELIBBAD), // Accessing a corrupted shared library
ERROR_ENTRY(ELIBSCN), // .lib section in a.out corrupted
ERROR_ENTRY(ELIBMAX), // Attempting to link in too many shared libs.
ERROR_ENTRY(ELIBEXEC), // Cannot exec a shared library directly
#endif // __linux__
ERROR_ENTRY(EILSEQ), // Illegal byte sequence
#ifdef __linux__
ERROR_ENTRY(ERESTART), // Interrupted system call should be restarted
ERROR_ENTRY(ESTRPIPE), // Streams pipe error
#endif // __linux__
ERROR_ENTRY(EUSERS), // Too many users
ERROR_ENTRY(ENOTSOCK), // Socket operation on non-socket
ERROR_ENTRY(EDESTADDRREQ), // Destination address required
ERROR_ENTRY(EMSGSIZE), // Message too long
ERROR_ENTRY(EPROTOTYPE), // Protocol wrong type for socket
ERROR_ENTRY(ENOPROTOOPT), // Protocol not available
ERROR_ENTRY(EPROTONOSUPPORT), // Protocol not supported
ERROR_ENTRY(ESOCKTNOSUPPORT), // Socket type not supported
ERROR_ENTRY(EOPNOTSUPP), // Operation not supported o/transport endpoint
ERROR_ENTRY(EPFNOSUPPORT), // Protocol family not supported
ERROR_ENTRY(EAFNOSUPPORT), // Address family not supported by protocol
ERROR_ENTRY(EADDRINUSE), // Address already in use
ERROR_ENTRY(EADDRNOTAVAIL), // Cannot assign requested address
ERROR_ENTRY(ENETDOWN), // Network is down
ERROR_ENTRY(ENETUNREACH), // Network is unreachable
ERROR_ENTRY(ENETRESET), // Network dropped connection because of reset
ERROR_ENTRY(ECONNABORTED), // Software caused connection abort
ERROR_ENTRY(ECONNRESET), // Connection reset by peer
ERROR_ENTRY(ENOBUFS), // No buffer space available
ERROR_ENTRY(EISCONN), // Transport endpoint is already connected
ERROR_ENTRY(ENOTCONN), // Transport endpoint is not connected
ERROR_ENTRY(ESHUTDOWN), // Cannot send after transp. endpoint shutdown
ERROR_ENTRY(ETOOMANYREFS), // Too many references: cannot splice
ERROR_ENTRY(ETIMEDOUT), // Connection timed out
ERROR_ENTRY(ECONNREFUSED), // Connection refused
ERROR_ENTRY(EHOSTDOWN), // Host is down
ERROR_ENTRY(EHOSTUNREACH), // No route to host
ERROR_ENTRY(EALREADY), // Operation already in progress
ERROR_ENTRY(EINPROGRESS), // Operation now in progress
ERROR_ENTRY(ESTALE), // Stale file handle
#ifdef __linux__
ERROR_ENTRY(EUCLEAN), // Structure needs cleaning
ERROR_ENTRY(ENOTNAM), // Not a XENIX named type file
ERROR_ENTRY(ENAVAIL), // No XENIX semaphores available
ERROR_ENTRY(EISNAM), // Is a named type file
ERROR_ENTRY(EREMOTEIO), // Remote I/O error
#endif // __linux__
ERROR_ENTRY(EDQUOT), // Quota exceeded
#ifdef __linux__
ERROR_ENTRY(ENOMEDIUM), // No medium found
ERROR_ENTRY(EMEDIUMTYPE), // Wrong medium type
#endif // __linux__
ERROR_ENTRY(ECANCELED), // Operation Canceled
#ifdef __linux__
ERROR_ENTRY(ENOKEY), // Required key not available
ERROR_ENTRY(EKEYEXPIRED), // Key has expired
ERROR_ENTRY(EKEYREVOKED), // Key has been revoked
ERROR_ENTRY(EKEYREJECTED), // Key was rejected by service
#endif // __linux__
ERROR_ENTRY(EOWNERDEAD), // Owner died
ERROR_ENTRY(ENOTRECOVERABLE), // State not recoverable
#ifdef __linux__
ERROR_ENTRY(ERFKILL), // Operation not possible due to RF-kill
ERROR_ENTRY(EHWPOISON), // Memory page has hardware error
#endif // __linux__
#undef ERROR_ENTRY
// This list comes from <errno.h> system header. The elements are ordered
// by increasing errnum values which is the same order used in the header
// file. So, when new error codes are added to glibc, it should be relatively
// easy to identify them and add them to this list.
};
// Gets the error code string from system error code. If unknown system error
// number is provided, returns an empty string.
std::string ErrorCodeFromSystemError(int errnum) {
std::string error_code;
for (const ErrorMapEntry& entry : error_map) {
if (entry.errnum == errnum) {
error_code = entry.error_code;
break;
}
}
return error_code;
}
} // anonymous namespace
void AddSystemError(ErrorPtr* error,
const tracked_objects::Location& location,
int errnum) {
std::string message = base::safe_strerror(errnum);
std::string code = ErrorCodeFromSystemError(errnum);
if (message.empty())
message = "Unknown error " + std::to_string(errnum);
if (code.empty())
code = "error_" + std::to_string(errnum);
Error::AddTo(error, location, kDomain, code, message);
}
} // namespace system
} // namespace errors
} // namespace chromeos
|