/*
* tclWinError.c --
*
* This file contains code for converting from Win32 errors to errno
* errors.
*
* Copyright (c) 1995-1996 by Sun Microsystems, Inc.
*
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tclWinError.c,v 1.7.10.1 2010/01/31 23:51:37 nijtmans Exp $
*/
#include "tclInt.h"
/*
* The following table contains the mapping from Win32 errors to errno errors.
*/
static char errorTable[] = {
0,
EINVAL, /* ERROR_INVALID_FUNCTION 1 */
ENOENT, /* ERROR_FILE_NOT_FOUND 2 */
ENOENT, /* ERROR_PATH_NOT_FOUND 3 */
EMFILE, /* ERROR_TOO_MANY_OPEN_FILES 4 */
EACCES, /* ERROR_ACCESS_DENIED 5 */
EBADF, /* ERROR_INVALID_HANDLE 6 */
ENOMEM, /* ERROR_ARENA_TRASHED 7 */
ENOMEM, /* ERROR_NOT_ENOUGH_MEMORY 8 */
ENOMEM, /* ERROR_INVALID_BLOCK 9 */
E2BIG, /* ERROR_BAD_ENVIRONMENT 10 */
ENOEXEC, /* ERROR_BAD_FORMAT 11 */
EACCES, /* ERROR_INVALID_ACCESS 12 */
EINVAL, /* ERROR_INVALID_DATA 13 */
EFAULT, /* ERROR_OUT_OF_MEMORY 14 */
ENOENT, /* ERROR_INVALID_DRIVE 15 */
EACCES, /* ERROR_CURRENT_DIRECTORY 16 */
EXDEV, /* ERROR_NOT_SAME_DEVICE 17 */
ENOENT, /* ERROR_NO_MORE_FILES 18 */
EROFS, /* ERROR_WRITE_PROTECT 19 */
ENXIO, /* ERROR_BAD_UNIT 20 */
EBUSY, /* ERROR_NOT_READY 21 */
EIO, /* ERROR_BAD_COMMAND 22 */
EIO, /* ERROR_CRC 23 */
EIO, /* ERROR_BAD_LENGTH 24 */
EIO, /* ERROR_SEEK 25 */
EIO, /* ERROR_NOT_DOS_DISK 26 */
ENXIO, /* ERROR_SECTOR_NOT_FOUND 27 */
EBUSY, /* ERROR_OUT_OF_PAPER 28 */
EIO, /* ERROR_WRITE_FAULT 29 */
EIO, /* ERROR_READ_FAULT 30 */
EIO, /* ERROR_GEN_FAILURE 31 */
EACCES, /* ERROR_SHARING_VIOLATION 32 */
EACCES, /* ERROR_LOCK_VIOLATION 33 */
ENXIO, /* ERROR_WRONG_DISK 34 */
ENFILE, /* ERROR_FCB_UNAVAILABLE 35 */
ENFILE, /* ERROR_SHARING_BUFFER_EXCEEDED 36 */
EINVAL, /* 37 */
EINVAL, /* 38 */
ENOSPC, /* ERROR_HANDLE_DISK_FULL 39 */
EINVAL, /* 40 */
EINVAL, /* 41 */
EINVAL, /* 42 */
EINVAL, /* 43 */
EINVAL, /* 44 */
EINVAL, /* 45 */
EINVAL, /* 46 */
EINVAL, /* 47 */
EINVAL, /* 48 */
EINVAL, /* 49 */
ENODEV, /* ERROR_NOT_SUPPORTED 50 */
EBUSY, /* ERROR_REM_NOT_LIST 51 */
EEXIST, /* ERROR_DUP_NAME 52 */
ENOENT, /* ERROR_BAD_NETPATH 53 */
EBUSY, /* ERROR_NETWORK_BUSY 54 */
ENODEV, /* ERROR_DEV_NOT_EXIST 55 */
EAGAIN, /* ERROR_TOO_MANY_CMDS 56 */
EIO, /* ERROR_ADAP_HDW_ERR 57 */
EIO, /* ERROR_BAD_NET_RESP 58 */
EIO, /* ERROR_UNEXP_NET_ERR 59 */
EINVAL, /* ERROR_BAD_REM_ADAP 60 */
EFBIG, /* ERROR_PRINTQ_FULL 61 */
ENOSPC, /* ERROR_NO_SPOOL_SPACE 62 */
ENOENT, /* ERROR_PRINT_CANCELLED 63 */
ENOENT, /* ERROR_NETNAME_DELETED 64 */
EACCES, /* ERROR_NETWORK_ACCESS_DENIED 65 */
ENODEV, /* ERROR_BAD_DEV_TYPE 66 */
ENOENT, /* ERROR_BAD_NET_NAME 67 */
ENFILE, /* ERROR_TOO_MANY_NAMES 68 */
EIO, /* ERROR_TOO_MANY_SESS 69 */
EAGAIN, /* ERROR_SHARING_PAUSED 70 */
EINVAL, /* ERROR_REQ_NOT_ACCEP 71 */
EAGAIN, /* ERROR_REDIR_PAUSED 72 */
EINVAL, /* 73 */
EINVAL, /* 74 */
EINVAL, /* 75 */
EINVAL, /* 76 */
EINVAL, /* 77 */
EINVAL, /* 78 */
EINVAL, /* 79 */
EEXIST, /* ERROR_FILE_EXISTS 80 */
EINVAL, /* 81 */
ENOSPC, /* ERROR_CANNOT_MAKE 82 */
EIO, /* ERROR_FAIL_I24 83 */
ENFILE, /* ERROR_OUT_OF_STRUCTURES 84 */
EEXIST, /* ERROR_ALREADY_ASSIGNED 85 */
EPERM, /* ERROR_INVALID_PASSWORD 86 */
EINVAL, /* ERROR_INVALID_PARAMETER 87 */
EIO, /* ERROR_NET_WRITE_FAULT 88 */
EAGAIN, /* ERROR_NO_PROC_SLOTS 89 */
EINVAL, /* 90 */
EINVAL, /* 91 */
EINVAL, /* 92 */
EINVAL, /* 93 */
EINVAL, /* 94 */
EINVAL, /* 95 */
EINVAL, /* 96 */
EINVAL, /* 97 */
EINVAL, /* 98 */
EINVAL, /* 99 */
EINVAL, /* 100 */
EINVAL, /* 101 */
EINVAL, /* 102 */
EINVAL, /* 103 */
EINVAL, /* 104 */
EINVAL, /* 105 */
EINVAL, /* 106 */
EXDEV, /* ERROR_DISK_CHANGE 107 */
EAGAIN, /* ERROR_DRIVE_LOCKED 108 */
EPIPE, /* ERROR_BROKEN_PIPE 109 */
ENOENT, /* ERROR_OPEN_FAILED 110 */
EINVAL, /* ERROR_BUFFER_OVERFLOW 111 */
ENOSPC, /* ERROR_DISK_FULL 112 */
EMFILE, /* ERROR_NO_MORE_SEARCH_HANDLES 113 */
EBADF, /* ERROR_INVALID_TARGET_HANDLE 114 */
EFAULT, /* ERROR_PROTECTION_VIOLATION 115 */
EINVAL, /* 116 */
EINVAL, /* 117 */
EINVAL, /* 118 */
EINVAL, /* 119 */
EINVAL, /* 120 */
EINVAL, /* 121 */
EINVAL, /* 122 */
ENOENT, /* ERROR_INVALID_NAME 123 */
EINVAL, /* 124 */
EINVAL, /* 125 */
EINVAL, /* 126 */
EINVAL, /* ERROR_PROC_NOT_FOUND 127 */
ECHILD, /* ERROR_WAIT_NO_CHILDREN 128 */
ECHILD, /* ERROR_CHILD_NOT_COMPLETE 129 */
EBADF, /* ERROR_DIRECT_ACCESS_HANDLE 130 */
EINVAL, /* ERROR_NEGATIVE_SEEK 131 */
ESPIPE, /* ERROR_SEEK_ON_DEVICE 132 */
EINVAL, /* 133 */
EINVAL, /* 134 */
EINVAL, /* 135 */
EINVAL, /* 136 */
EINVAL, /* 137 */
EINVAL, /* 138 */
EINVAL, /* 139 */
EINVAL, /* 140 */
EINVAL, /* 141 */
EAGAIN, /* ERROR_BUSY_DRIVE 142 */
EINVAL, /* 143 */
EINVAL, /* 144 */
EEXIST, /* ERROR_DIR_NOT_EMPTY 145 */
EINVAL, /* 146 */
EINVAL, /* 147 */
EINVAL, /* 148 */
EINVAL, /* 149 */
EINVAL, /* 150 */
EINVAL, /* 151 */
EINVAL, /* 152 */
EINVAL, /* 153 */
EINVAL, /* 154 */
EINVAL, /* 155 */
EINVAL, /* 156 */
EINVAL, /* 157 */
EACCES, /* ERROR_NOT_LOCKED 158 */
EINVAL, /* 159 */
EINVAL, /* 160 */
ENOENT, /* ERROR_BAD_PATHNAME 161 */
EINVAL, /* 162 */
EINVAL, /* 163 */
EINVAL, /* 164 */
EINVAL, /* 165 */
EINVAL, /* 166 */
EACCES, /* ERROR_LOCK_FAILED 167 */
EINVAL, /* 168 */
EINVAL, /* 169 */
EINVAL, /* 170 */
EINVAL, /* 171 */
EINVAL, /* 172 */
EINVAL, /* 173 */
EINVAL, /* 174 */
EINVAL, /* 175 */
EINVAL, /* 176 */
EINVAL, /* 177 */
EINVAL, /* 178 */
EINVAL, /* 179 */
EINVAL, /* 180 */
EINVAL, /* 181 */
EINVAL, /* 182 */
EEXIST, /* ERROR_ALREADY_EXISTS 183 */
ECHILD, /* ERROR_NO_CHILD_PROCESS 184 */
EINVAL, /* 185 */
EINVAL, /* 186 */
EINVAL, /* 187 */
EINVAL, /* 188 */
EINVAL, /* 189 */
EINVAL, /* 190 */
EINVAL, /* 191 */
EINVAL, /* 192 */
EINVAL, /* 193 */
EINVAL, /* 194 */
EINVAL, /* 195 */
EINVAL, /* 196 */
EINVAL, /* 197 */
EINVAL, /* 198 */
EINVAL, /* 199 */
EINVAL, /* 200 */
EINVAL, /* 201 */
EINVAL, /* 202 */
EINVAL, /* 203 */
EINVAL, /* 204 */
EINVAL, /* 205 */
ENAMETOOLONG,/* ERROR_FILENAME_EXCED_RANGE 206 */
EINVAL, /* 207 */
EINVAL, /* 208 */
EINVAL, /* 209 */
EINVAL, /* 210 */
EINVAL, /* 211 */
EINVAL, /* 212 */
EINVAL, /* 213 */
EINVAL, /* 214 */
EINVAL, /* 215 */
EINVAL, /* 216 */
EINVAL, /* 217 */
EINVAL, /* 218 */
EINVAL, /* 219 */
EINVAL, /* 220 */
EINVAL, /* 221 */
EINVAL, /* 222 */
EINVAL, /* 223 */
EINVAL, /* 224 */
EINVAL, /* 225 */
EINVAL, /* 226 */
EINVAL, /* 227 */
EINVAL, /* 228 */
EINVAL, /* 229 */
EPIPE, /* ERROR_BAD_PIPE 230 */
EAGAIN, /* ERROR_PIPE_BUSY 231 */
EPIPE, /* ERROR_NO_DATA 232 */
EPIPE, /* ERROR_PIPE_NOT_CONNECTED 233 */
EINVAL, /* 234 */
EINVAL, /* 235 */
EINVAL, /* 236 */
EINVAL, /* 237 */
EINVAL, /* 238 */
EINVAL, /* 239 */
EINVAL, /* 240 */
EINVAL, /* 241 */
EINVAL, /* 242 */
EINVAL, /* 243 */
EINVAL, /* 244 */
EINVAL, /* 245 */
EINVAL, /* 246 */
EINVAL, /* 247 */
EINVAL, /* 248 */
EINVAL, /* 249 */
EINVAL, /* 250 */
EINVAL, /* 251 */
EINVAL, /* 252 */
EINVAL, /* 253 */
EINVAL, /* 254 */
EINVAL, /* 255 */
EINVAL, /* 256 */
EINVAL, /* 257 */
EINVAL, /* 258 */
EINVAL, /* 259 */
EINVAL, /* 260 */
EINVAL, /* 261 */
EINVAL, /* 262 */
EINVAL, /* 263 */
EINVAL, /* 264 */
EINVAL, /* 265 */
EINVAL, /* 266 */
ENOTDIR, /* ERROR_DIRECTORY 267 */
};
static const unsigned int tableLen = sizeof(errorTable);
/*
* The following table contains the mapping from WinSock errors to
* errno errors.
*/
static int wsaErrorTable[] = {
EWOULDBLOCK, /* WSAEWOULDBLOCK */
EINPROGRESS, /* WSAEINPROGRESS */
EALREADY, /* WSAEALREADY */
ENOTSOCK, /* WSAENOTSOCK */
EDESTADDRREQ, /* WSAEDESTADDRREQ */
EMSGSIZE, /* WSAEMSGSIZE */
EPROTOTYPE, /* WSAEPROTOTYPE */
ENOPROTOOPT, /* WSAENOPROTOOPT */
EPROTONOSUPPORT, /* WSAEPROTONOSUPPORT */
ESOCKTNOSUPPORT, /* WSAESOCKTNOSUPPORT */
EOPNOTSUPP, /* WSAEOPNOTSUPP */
EPFNOSUPPORT, /* WSAEPFNOSUPPORT */
EAFNOSUPPORT, /* WSAEAFNOSUPPORT */
EADDRINUSE, /* WSAEADDRINUSE */
EADDRNOTAVAIL, /* WSAEADDRNOTAVAIL */
ENETDOWN, /* WSAENETDOWN */
ENETUNREACH, /* WSAENETUNREACH */
ENETRESET, /* WSAENETRESET */
ECONNABORTED, /* WSAECONNABORTED */
ECONNRESET, /* WSAECONNRESET */
ENOBUFS, /* WSAENOBUFS */
EISCONN, /* WSAEISCONN */
ENOTCONN, /* WSAENOTCONN */
ESHUTDOWN, /* WSAESHUTDOWN */
ETOOMANYREFS, /* WSAETOOMANYREFS */
ETIMEDOUT, /* WSAETIMEDOUT */
ECONNREFUSED, /* WSAECONNREFUSED */
ELOOP, /* WSAELOOP */
ENAMETOOLONG, /* WSAENAMETOOLONG */
EHOSTDOWN, /* WSAEHOSTDOWN */
EHOSTUNREACH, /* WSAEHOSTUNREACH */
ENOTEMPTY, /* WSAENOTEMPTY */
EAGAIN, /* WSAEPROCLIM */
EUSERS, /* WSAEUSERS */
EDQUOT, /* WSAEDQUOT */
ESTALE, /* WSAESTALE */
EREMOTE, /* WSAEREMOTE */
};
/*
*----------------------------------------------------------------------
*
* TclWinConvertError --
*
* This routine converts a Win32 error into an errno value.
*
* Results:
* None.
*
* Side effects:
* Sets the errno global variable.
*
*----------------------------------------------------------------------
*/
void
TclWinConvertError(
unsigned long errCode) /* Win32 error code. */
{
if (errCode >= tableLen) {
Tcl_SetErrno(EINVAL);
} else {
Tcl_SetErrno(errorTable[errCode]);
}
}
/*
*----------------------------------------------------------------------
*
* TclWinConvertWSAError --
*
* This routine converts a WinSock error into an errno value.
*
* Results:
* None.
*
* Side effects:
* Sets the errno global variable.
*
*----------------------------------------------------------------------
*/
void
TclWinConvertWSAError(
unsigned long errCode) /* Win32 error code. */
{
if ((errCode >= WSAEWOULDBLOCK) && (errCode <= WSAEREMOTE)) {
Tcl_SetErrno(wsaErrorTable[errCode - WSAEWOULDBLOCK]);
} else {
Tcl_SetErrno(EINVAL);
}
}
|