1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/base/net_errors.h"
6
7#include <errno.h>
8#include <stdlib.h>
9#include <string>
10#include <unistd.h>
11
12#include "base/logging.h"
13#include "base/strings/stringprintf.h"
14
15namespace net {
16
17Error MapSystemError(int os_error) {
18  if (os_error != 0)
19    DVLOG(2) << "Error " << os_error;
20
21  // There are numerous posix error codes, but these are the ones we thus far
22  // find interesting.
23  switch (os_error) {
24    case EAGAIN:
25#if EWOULDBLOCK != EAGAIN
26    case EWOULDBLOCK:
27#endif
28      return ERR_IO_PENDING;
29    case EACCES:
30      return ERR_ACCESS_DENIED;
31    case ENETDOWN:
32      return ERR_INTERNET_DISCONNECTED;
33    case ETIMEDOUT:
34      return ERR_TIMED_OUT;
35    case ECONNRESET:
36    case ENETRESET:  // Related to keep-alive.
37    case EPIPE:
38      return ERR_CONNECTION_RESET;
39    case ECONNABORTED:
40      return ERR_CONNECTION_ABORTED;
41    case ECONNREFUSED:
42      return ERR_CONNECTION_REFUSED;
43    case EHOSTUNREACH:
44    case EHOSTDOWN:
45    case ENETUNREACH:
46    case EAFNOSUPPORT:
47      return ERR_ADDRESS_UNREACHABLE;
48    case EADDRNOTAVAIL:
49      return ERR_ADDRESS_INVALID;
50    case EMSGSIZE:
51      return ERR_MSG_TOO_BIG;
52    case ENOTCONN:
53      return ERR_SOCKET_NOT_CONNECTED;
54    case EISCONN:
55      return ERR_SOCKET_IS_CONNECTED;
56    case EINVAL:
57      return ERR_INVALID_ARGUMENT;
58    case EADDRINUSE:
59      return ERR_ADDRESS_IN_USE;
60    case E2BIG:  // Argument list too long.
61      return ERR_INVALID_ARGUMENT;
62    case EBADF:  // Bad file descriptor.
63      return ERR_INVALID_HANDLE;
64    case EBUSY:  // Device or resource busy.
65      return ERR_INSUFFICIENT_RESOURCES;
66    case ECANCELED:  // Operation canceled.
67      return ERR_ABORTED;
68    case EDEADLK:  // Resource deadlock avoided.
69      return ERR_INSUFFICIENT_RESOURCES;
70    case EDQUOT:  // Disk quota exceeded.
71      return ERR_FILE_NO_SPACE;
72    case EEXIST:  // File exists.
73      return ERR_FILE_EXISTS;
74    case EFAULT:  // Bad address.
75      return ERR_INVALID_ARGUMENT;
76    case EFBIG:  // File too large.
77      return ERR_FILE_TOO_BIG;
78    case EISDIR:  // Operation not allowed for a directory.
79      return ERR_ACCESS_DENIED;
80    case ENAMETOOLONG:  // Filename too long.
81      return ERR_FILE_PATH_TOO_LONG;
82    case ENFILE:  // Too many open files in system.
83      return ERR_INSUFFICIENT_RESOURCES;
84    case ENOBUFS:  // No buffer space available.
85      return ERR_OUT_OF_MEMORY;
86    case ENODEV:  // No such device.
87      return ERR_INVALID_ARGUMENT;
88    case ENOENT:  // No such file or directory.
89      return ERR_FILE_NOT_FOUND;
90    case ENOLCK:  // No locks available.
91      return ERR_INSUFFICIENT_RESOURCES;
92    case ENOMEM:  // Not enough space.
93      return ERR_OUT_OF_MEMORY;
94    case ENOSPC:  // No space left on device.
95      return ERR_FILE_NO_SPACE;
96    case ENOSYS:  // Function not implemented.
97      return ERR_NOT_IMPLEMENTED;
98    case ENOTDIR:  // Not a directory.
99      return ERR_FILE_NOT_FOUND;
100    case ENOTSUP:  // Operation not supported.
101      return ERR_NOT_IMPLEMENTED;
102    case EPERM:  // Operation not permitted.
103      return ERR_ACCESS_DENIED;
104    case EROFS:  // Read-only file system.
105      return ERR_ACCESS_DENIED;
106    case ETXTBSY:  // Text file busy.
107      return ERR_ACCESS_DENIED;
108    case EUSERS:  // Too many users.
109      return ERR_INSUFFICIENT_RESOURCES;
110    case EMFILE:  // Too many open files.
111      return ERR_INSUFFICIENT_RESOURCES;
112
113    case 0:
114      return OK;
115    default:
116      LOG(WARNING) << "Unknown error " << os_error
117                   << " mapped to net::ERR_FAILED";
118      return ERR_FAILED;
119  }
120}
121
122}  // namespace net
123