Home | History | Annotate | Download | only in base
      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 <winsock2.h>
      8 
      9 #include "base/logging.h"
     10 
     11 namespace net {
     12 
     13 // Map winsock and system errors to Chromium errors.
     14 Error MapSystemError(int os_error) {
     15   if (os_error != 0)
     16     DVLOG(2) << "Error " << os_error;
     17 
     18   // There are numerous Winsock error codes, but these are the ones we thus far
     19   // find interesting.
     20   switch (os_error) {
     21     case WSAEWOULDBLOCK:
     22     case WSA_IO_PENDING:
     23       return ERR_IO_PENDING;
     24     case WSAEACCES:
     25       return ERR_ACCESS_DENIED;
     26     case WSAENETDOWN:
     27       return ERR_INTERNET_DISCONNECTED;
     28     case WSAETIMEDOUT:
     29       return ERR_TIMED_OUT;
     30     case WSAECONNRESET:
     31     case WSAENETRESET:  // Related to keep-alive
     32       return ERR_CONNECTION_RESET;
     33     case WSAECONNABORTED:
     34       return ERR_CONNECTION_ABORTED;
     35     case WSAECONNREFUSED:
     36       return ERR_CONNECTION_REFUSED;
     37     case WSA_IO_INCOMPLETE:
     38     case WSAEDISCON:
     39       return ERR_CONNECTION_CLOSED;
     40     case WSAEISCONN:
     41       return ERR_SOCKET_IS_CONNECTED;
     42     case WSAEHOSTUNREACH:
     43     case WSAENETUNREACH:
     44       return ERR_ADDRESS_UNREACHABLE;
     45     case WSAEADDRNOTAVAIL:
     46       return ERR_ADDRESS_INVALID;
     47     case WSAEMSGSIZE:
     48       return ERR_MSG_TOO_BIG;
     49     case WSAENOTCONN:
     50       return ERR_SOCKET_NOT_CONNECTED;
     51     case WSAEAFNOSUPPORT:
     52       return ERR_ADDRESS_UNREACHABLE;
     53     case WSAEINVAL:
     54       return ERR_INVALID_ARGUMENT;
     55     case WSAEADDRINUSE:
     56       return ERR_ADDRESS_IN_USE;
     57 
     58     // System errors.
     59     case ERROR_FILE_NOT_FOUND:  // The system cannot find the file specified.
     60       return ERR_FILE_NOT_FOUND;
     61     case ERROR_PATH_NOT_FOUND:  // The system cannot find the path specified.
     62       return ERR_FILE_NOT_FOUND;
     63     case ERROR_TOO_MANY_OPEN_FILES:  // The system cannot open the file.
     64       return ERR_INSUFFICIENT_RESOURCES;
     65     case ERROR_ACCESS_DENIED:  // Access is denied.
     66       return ERR_ACCESS_DENIED;
     67     case ERROR_INVALID_HANDLE:  // The handle is invalid.
     68       return ERR_INVALID_HANDLE;
     69     case ERROR_NOT_ENOUGH_MEMORY:  // Not enough storage is available to
     70       return ERR_OUT_OF_MEMORY;    // process this command.
     71     case ERROR_OUTOFMEMORY:      // Not enough storage is available to complete
     72       return ERR_OUT_OF_MEMORY;  // this operation.
     73     case ERROR_WRITE_PROTECT:  // The media is write protected.
     74       return ERR_ACCESS_DENIED;
     75     case ERROR_SHARING_VIOLATION:  // Cannot access the file because it is
     76       return ERR_ACCESS_DENIED;    // being used by another process.
     77     case ERROR_LOCK_VIOLATION:   // The process cannot access the file because
     78       return ERR_ACCESS_DENIED;  // another process has locked the file.
     79     case ERROR_HANDLE_EOF:  // Reached the end of the file.
     80       return ERR_FAILED;
     81     case ERROR_HANDLE_DISK_FULL:  // The disk is full.
     82       return ERR_FILE_NO_SPACE;
     83     case ERROR_FILE_EXISTS:  // The file exists.
     84       return ERR_FILE_EXISTS;
     85     case ERROR_INVALID_PARAMETER:  // The parameter is incorrect.
     86       return ERR_INVALID_ARGUMENT;
     87     case ERROR_BUFFER_OVERFLOW:  // The file name is too long.
     88       return ERR_FILE_PATH_TOO_LONG;
     89     case ERROR_DISK_FULL:  // There is not enough space on the disk.
     90       return ERR_FILE_NO_SPACE;
     91     case ERROR_CALL_NOT_IMPLEMENTED:  // This function is not supported on
     92       return ERR_NOT_IMPLEMENTED;     // this system.
     93     case ERROR_INVALID_NAME:        // The filename, directory name, or volume
     94       return ERR_INVALID_ARGUMENT;  // label syntax is incorrect.
     95     case ERROR_DIR_NOT_EMPTY:  // The directory is not empty.
     96       return ERR_FAILED;
     97     case ERROR_BUSY:  // The requested resource is in use.
     98       return ERR_ACCESS_DENIED;
     99     case ERROR_ALREADY_EXISTS:  // Cannot create a file when that file
    100       return ERR_FILE_EXISTS;   // already exists.
    101     case ERROR_FILENAME_EXCED_RANGE:  // The filename or extension is too long.
    102       return ERR_FILE_PATH_TOO_LONG;
    103     case ERROR_FILE_TOO_LARGE:   // The file size exceeds the limit allowed
    104       return ERR_FILE_NO_SPACE;  // and cannot be saved.
    105     case ERROR_VIRUS_INFECTED:         // Operation failed because the file
    106       return ERR_FILE_VIRUS_INFECTED;  // contains a virus.
    107     case ERROR_IO_DEVICE:        // The request could not be performed
    108       return ERR_ACCESS_DENIED;  // because of an I/O device error.
    109     case ERROR_POSSIBLE_DEADLOCK:  // A potential deadlock condition has
    110       return ERR_ACCESS_DENIED;    // been detected.
    111     case ERROR_BAD_DEVICE:  // The specified device name is invalid.
    112       return ERR_INVALID_ARGUMENT;
    113     case ERROR_BROKEN_PIPE:  // Pipe is not connected.
    114       return ERR_CONNECTION_RESET;
    115 
    116     case ERROR_SUCCESS:
    117       return OK;
    118     default:
    119       LOG(WARNING) << "Unknown error " << os_error
    120                    << " mapped to net::ERR_FAILED";
    121       return ERR_FAILED;
    122   }
    123 }
    124 
    125 }  // namespace net
    126