// Copyright (c) 2011 The Chromium 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 "net/base/net_errors.h" #include #include #include #include #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; // 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_OUT_OF_MEMORY; 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; #if defined(OS_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 // OS_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