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 15 namespace net { 16 MapSystemError(int os_error)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