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