| 1 | /* | 
|---|
| 2 | * synergy -- mouse and keyboard sharing utility | 
|---|
| 3 | * Copyright (C) 2002 Chris Schoeneman | 
|---|
| 4 | * | 
|---|
| 5 | * This package is free software; you can redistribute it and/or | 
|---|
| 6 | * modify it under the terms of the GNU General Public License | 
|---|
| 7 | * found in the file COPYING that should have accompanied this file. | 
|---|
| 8 | * | 
|---|
| 9 | * This package is distributed in the hope that it will be useful, | 
|---|
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
| 12 | * GNU General Public License for more details. | 
|---|
| 13 | */ | 
|---|
| 14 |  | 
|---|
| 15 | #include "XArchWindows.h" | 
|---|
| 16 | #include "CArchNetworkWinsock.h" | 
|---|
| 17 |  | 
|---|
| 18 | // | 
|---|
| 19 | // XArchEvalWindows | 
|---|
| 20 | // | 
|---|
| 21 |  | 
|---|
| 22 | XArchEval* | 
|---|
| 23 | XArchEvalWindows::clone() const throw() | 
|---|
| 24 | { | 
|---|
| 25 | return new XArchEvalWindows(m_errno); | 
|---|
| 26 | } | 
|---|
| 27 |  | 
|---|
| 28 | std::string | 
|---|
| 29 | XArchEvalWindows::eval() const throw() | 
|---|
| 30 | { | 
|---|
| 31 | char* cmsg; | 
|---|
| 32 | if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | | 
|---|
| 33 | FORMAT_MESSAGE_IGNORE_INSERTS | | 
|---|
| 34 | FORMAT_MESSAGE_FROM_SYSTEM, | 
|---|
| 35 | 0, | 
|---|
| 36 | m_errno, | 
|---|
| 37 | MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), | 
|---|
| 38 | (LPTSTR)&cmsg, | 
|---|
| 39 | 0, | 
|---|
| 40 | NULL) == 0) { | 
|---|
| 41 | cmsg = NULL; | 
|---|
| 42 | return "Unknown error"; | 
|---|
| 43 | } | 
|---|
| 44 | std::string smsg(cmsg); | 
|---|
| 45 | LocalFree(cmsg); | 
|---|
| 46 | return smsg; | 
|---|
| 47 | } | 
|---|
| 48 |  | 
|---|
| 49 |  | 
|---|
| 50 | // | 
|---|
| 51 | // XArchEvalWinsock | 
|---|
| 52 | // | 
|---|
| 53 |  | 
|---|
| 54 | XArchEval* | 
|---|
| 55 | XArchEvalWinsock::clone() const throw() | 
|---|
| 56 | { | 
|---|
| 57 | return new XArchEvalWinsock(m_errno); | 
|---|
| 58 | } | 
|---|
| 59 |  | 
|---|
| 60 | std::string | 
|---|
| 61 | XArchEvalWinsock::eval() const throw() | 
|---|
| 62 | { | 
|---|
| 63 | // built-in windows function for looking up error message strings | 
|---|
| 64 | // may not look up network error messages correctly.  we'll have | 
|---|
| 65 | // to do it ourself. | 
|---|
| 66 | static const struct { int m_code; const char* m_msg; } s_netErrorCodes[] = { | 
|---|
| 67 | /* 10004 */{WSAEINTR,                   "The (blocking) call was canceled via WSACancelBlockingCall"}, | 
|---|
| 68 | /* 10009 */{WSAEBADF,                   "Bad file handle"}, | 
|---|
| 69 | /* 10013 */{WSAEACCES,                  "The requested address is a broadcast address, but the appropriate flag was not set"}, | 
|---|
| 70 | /* 10014 */{WSAEFAULT,                  "WSAEFAULT"}, | 
|---|
| 71 | /* 10022 */{WSAEINVAL,                  "WSAEINVAL"}, | 
|---|
| 72 | /* 10024 */{WSAEMFILE,                  "No more file descriptors available"}, | 
|---|
| 73 | /* 10035 */{WSAEWOULDBLOCK,             "Socket is marked as non-blocking and no connections are present or the receive operation would block"}, | 
|---|
| 74 | /* 10036 */{WSAEINPROGRESS,             "A blocking Windows Sockets operation is in progress"}, | 
|---|
| 75 | /* 10037 */{WSAEALREADY,                "The asynchronous routine being canceled has already completed"}, | 
|---|
| 76 | /* 10038 */{WSAENOTSOCK,                "At least on descriptor is not a socket"}, | 
|---|
| 77 | /* 10039 */{WSAEDESTADDRREQ,    "A destination address is required"}, | 
|---|
| 78 | /* 10040 */{WSAEMSGSIZE,                "The datagram was too large to fit into the specified buffer and was truncated"}, | 
|---|
| 79 | /* 10041 */{WSAEPROTOTYPE,              "The specified protocol is the wrong type for this socket"}, | 
|---|
| 80 | /* 10042 */{WSAENOPROTOOPT,             "The option is unknown or unsupported"}, | 
|---|
| 81 | /* 10043 */{WSAEPROTONOSUPPORT,"The specified protocol is not supported"}, | 
|---|
| 82 | /* 10044 */{WSAESOCKTNOSUPPORT,"The specified socket type is not supported by this address family"}, | 
|---|
| 83 | /* 10045 */{WSAEOPNOTSUPP,              "The referenced socket is not a type that supports that operation"}, | 
|---|
| 84 | /* 10046 */{WSAEPFNOSUPPORT,    "BSD: Protocol family not supported"}, | 
|---|
| 85 | /* 10047 */{WSAEAFNOSUPPORT,    "The specified address family is not supported"}, | 
|---|
| 86 | /* 10048 */{WSAEADDRINUSE,              "The specified address is already in use"}, | 
|---|
| 87 | /* 10049 */{WSAEADDRNOTAVAIL,   "The specified address is not available from the local machine"}, | 
|---|
| 88 | /* 10050 */{WSAENETDOWN,                "The Windows Sockets implementation has detected that the network subsystem has failed"}, | 
|---|
| 89 | /* 10051 */{WSAENETUNREACH,             "The network can't be reached from this hos at this time"}, | 
|---|
| 90 | /* 10052 */{WSAENETRESET,               "The connection must be reset because the Windows Sockets implementation dropped it"}, | 
|---|
| 91 | /* 10053 */{WSAECONNABORTED,    "The virtual circuit was aborted due to timeout or other failure"}, | 
|---|
| 92 | /* 10054 */{WSAECONNRESET,              "The virtual circuit was reset by the remote side"}, | 
|---|
| 93 | /* 10055 */{WSAENOBUFS,                 "No buffer space is available or a buffer deadlock has occured. The socket cannot be created"}, | 
|---|
| 94 | /* 10056 */{WSAEISCONN,                 "The socket is already connected"}, | 
|---|
| 95 | /* 10057 */{WSAENOTCONN,                "The socket is not connected"}, | 
|---|
| 96 | /* 10058 */{WSAESHUTDOWN,               "The socket has been shutdown"}, | 
|---|
| 97 | /* 10059 */{WSAETOOMANYREFS,    "BSD: Too many references"}, | 
|---|
| 98 | /* 10060 */{WSAETIMEDOUT,               "Attempt to connect timed out without establishing a connection"}, | 
|---|
| 99 | /* 10061 */{WSAECONNREFUSED,    "The attempt to connect was forcefully rejected"}, | 
|---|
| 100 | /* 10062 */{WSAELOOP,                   "Undocumented WinSock error code used in BSD"}, | 
|---|
| 101 | /* 10063 */{WSAENAMETOOLONG,    "Undocumented WinSock error code used in BSD"}, | 
|---|
| 102 | /* 10064 */{WSAEHOSTDOWN,               "Undocumented WinSock error code used in BSD"}, | 
|---|
| 103 | /* 10065 */{WSAEHOSTUNREACH,    "No route to host"}, | 
|---|
| 104 | /* 10066 */{WSAENOTEMPTY,               "Undocumented WinSock error code"}, | 
|---|
| 105 | /* 10067 */{WSAEPROCLIM,                "Undocumented WinSock error code"}, | 
|---|
| 106 | /* 10068 */{WSAEUSERS,                  "Undocumented WinSock error code"}, | 
|---|
| 107 | /* 10069 */{WSAEDQUOT,                  "Undocumented WinSock error code"}, | 
|---|
| 108 | /* 10070 */{WSAESTALE,                  "Undocumented WinSock error code"}, | 
|---|
| 109 | /* 10071 */{WSAEREMOTE,                 "Undocumented WinSock error code"}, | 
|---|
| 110 | /* 10091 */{WSASYSNOTREADY,             "Underlying network subsytem is not ready for network communication"}, | 
|---|
| 111 | /* 10092 */{WSAVERNOTSUPPORTED, "The version of WinSock API support requested is not provided in this implementation"}, | 
|---|
| 112 | /* 10093 */{WSANOTINITIALISED,  "WinSock subsystem not properly initialized"}, | 
|---|
| 113 | /* 10101 */{WSAEDISCON,                 "Virtual circuit has gracefully terminated connection"}, | 
|---|
| 114 | /* 11001 */{WSAHOST_NOT_FOUND,  "The specified host is unknown"}, | 
|---|
| 115 | /* 11002 */{WSATRY_AGAIN,               "A temporary error occurred on an authoritative name server"}, | 
|---|
| 116 | /* 11003 */{WSANO_RECOVERY,             "A non-recoverable name server error occurred"}, | 
|---|
| 117 | /* 11004 */{WSANO_DATA,                 "The requested name is valid but does not have an IP address"}, | 
|---|
| 118 | /* end   */{0,                                  NULL} | 
|---|
| 119 | }; | 
|---|
| 120 |  | 
|---|
| 121 | for (unsigned int i = 0; s_netErrorCodes[i].m_code != 0; ++i) { | 
|---|
| 122 | if (s_netErrorCodes[i].m_code == m_errno) { | 
|---|
| 123 | return s_netErrorCodes[i].m_msg; | 
|---|
| 124 | } | 
|---|
| 125 | } | 
|---|
| 126 | return "Unknown error"; | 
|---|
| 127 | } | 
|---|