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
|
// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/base/net_errors.h"
#include <errno.h>
#include <stdlib.h>
#include <string>
#include <unistd.h>
#include "base/logging.h"
#include "base/posix/safe_strerror.h"
#include "build/build_config.h"
namespace net {
Error MapSystemError(logging::SystemErrorCode os_error) {
if (os_error != 0)
DVLOG(2) << "Error " << os_error << ": "
<< logging::SystemErrorCodeToString(os_error);
// There are numerous posix error codes, but these are the ones we thus far
// find interesting.
switch (os_error) {
case EAGAIN:
#if EWOULDBLOCK != EAGAIN
case EWOULDBLOCK:
#endif
return ERR_IO_PENDING;
case EACCES:
return ERR_ACCESS_DENIED;
case ENETDOWN:
return ERR_INTERNET_DISCONNECTED;
case ETIMEDOUT:
return ERR_TIMED_OUT;
case ECONNRESET:
case ENETRESET: // Related to keep-alive.
case EPIPE:
return ERR_CONNECTION_RESET;
case ECONNABORTED:
return ERR_CONNECTION_ABORTED;
case ECONNREFUSED:
return ERR_CONNECTION_REFUSED;
case EHOSTUNREACH:
case EHOSTDOWN:
case ENETUNREACH:
case EAFNOSUPPORT:
return ERR_ADDRESS_UNREACHABLE;
case EADDRNOTAVAIL:
return ERR_ADDRESS_INVALID;
case EMSGSIZE:
return ERR_MSG_TOO_BIG;
case ENOTCONN:
return ERR_SOCKET_NOT_CONNECTED;
case EISCONN:
return ERR_SOCKET_IS_CONNECTED;
case EINVAL:
return ERR_INVALID_ARGUMENT;
case EADDRINUSE:
return ERR_ADDRESS_IN_USE;
case E2BIG: // Argument list too long.
return ERR_INVALID_ARGUMENT;
case EBADF: // Bad file descriptor.
return ERR_INVALID_HANDLE;
case EBUSY: // Device or resource busy.
return ERR_INSUFFICIENT_RESOURCES;
case ECANCELED: // Operation canceled.
return ERR_ABORTED;
case EDEADLK: // Resource deadlock avoided.
return ERR_INSUFFICIENT_RESOURCES;
case EDQUOT: // Disk quota exceeded.
return ERR_FILE_NO_SPACE;
case EEXIST: // File exists.
return ERR_FILE_EXISTS;
case EFAULT: // Bad address.
return ERR_INVALID_ARGUMENT;
case EFBIG: // File too large.
return ERR_FILE_TOO_BIG;
case EISDIR: // Operation not allowed for a directory.
return ERR_ACCESS_DENIED;
case ENAMETOOLONG: // Filename too long.
return ERR_FILE_PATH_TOO_LONG;
case ENFILE: // Too many open files in system.
return ERR_INSUFFICIENT_RESOURCES;
case ENOBUFS: // No buffer space available.
return ERR_NO_BUFFER_SPACE;
case ENODEV: // No such device.
return ERR_INVALID_ARGUMENT;
case ENOENT: // No such file or directory.
return ERR_FILE_NOT_FOUND;
case ENOLCK: // No locks available.
return ERR_INSUFFICIENT_RESOURCES;
case ENOMEM: // Not enough space.
return ERR_OUT_OF_MEMORY;
case ENOSPC: // No space left on device.
return ERR_FILE_NO_SPACE;
case ENOSYS: // Function not implemented.
return ERR_NOT_IMPLEMENTED;
case ENOTDIR: // Not a directory.
return ERR_FILE_NOT_FOUND;
case ENOTSUP: // Operation not supported.
return ERR_NOT_IMPLEMENTED;
case EPERM: // Operation not permitted.
return ERR_ACCESS_DENIED;
case EROFS: // Read-only file system.
return ERR_ACCESS_DENIED;
case ETXTBSY: // Text file busy.
return ERR_ACCESS_DENIED;
case EUSERS: // Too many users.
return ERR_INSUFFICIENT_RESOURCES;
case EMFILE: // Too many open files.
return ERR_INSUFFICIENT_RESOURCES;
case ENOPROTOOPT: // Protocol option not supported.
return ERR_NOT_IMPLEMENTED;
#if BUILDFLAG(IS_FUCHSIA)
case EIO:
// FDIO maps all unrecognized errors to EIO. If you see this message then
// consider adding custom error in FDIO for the corresponding error.
DLOG(FATAL) << "EIO was returned by FDIO.";
return ERR_FAILED;
#endif // BUILDFLAG(IS_FUCHSIA)
case 0:
return OK;
default:
LOG(WARNING) << "Unknown error " << base::safe_strerror(os_error) << " ("
<< os_error << ") mapped to net::ERR_FAILED";
return ERR_FAILED;
}
}
} // namespace net
|