aboutsummaryrefslogtreecommitdiffstats
path: root/chromeos/errors/error_codes.cc
blob: 14af14b49c5df19aa2c852e481ec45f18541fdc4 (plain)
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