4 * This file contains code for converting from Win32 errors to
7 * Copyright (c) 1995-1996 by Sun Microsystems, Inc.
9 * See the file "license.terms" for information on usage and redistribution
10 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
15 #include "tclWinInt.h"
18 * The following table contains the mapping from Win32 errors to
22 static char errorTable[] = {
24 EINVAL, /* ERROR_INVALID_FUNCTION 1 */
25 ENOENT, /* ERROR_FILE_NOT_FOUND 2 */
26 ENOENT, /* ERROR_PATH_NOT_FOUND 3 */
27 EMFILE, /* ERROR_TOO_MANY_OPEN_FILES 4 */
28 EACCES, /* ERROR_ACCESS_DENIED 5 */
29 EBADF, /* ERROR_INVALID_HANDLE 6 */
30 ENOMEM, /* ERROR_ARENA_TRASHED 7 */
31 ENOMEM, /* ERROR_NOT_ENOUGH_MEMORY 8 */
32 ENOMEM, /* ERROR_INVALID_BLOCK 9 */
33 E2BIG, /* ERROR_BAD_ENVIRONMENT 10 */
34 ENOEXEC, /* ERROR_BAD_FORMAT 11 */
35 EACCES, /* ERROR_INVALID_ACCESS 12 */
36 EINVAL, /* ERROR_INVALID_DATA 13 */
37 EFAULT, /* ERROR_OUT_OF_MEMORY 14 */
38 ENOENT, /* ERROR_INVALID_DRIVE 15 */
39 EACCES, /* ERROR_CURRENT_DIRECTORY 16 */
40 EXDEV, /* ERROR_NOT_SAME_DEVICE 17 */
41 ENOENT, /* ERROR_NO_MORE_FILES 18 */
42 EROFS, /* ERROR_WRITE_PROTECT 19 */
43 ENXIO, /* ERROR_BAD_UNIT 20 */
44 EBUSY, /* ERROR_NOT_READY 21 */
45 EIO, /* ERROR_BAD_COMMAND 22 */
46 EIO, /* ERROR_CRC 23 */
47 EIO, /* ERROR_BAD_LENGTH 24 */
48 EIO, /* ERROR_SEEK 25 */
49 EIO, /* ERROR_NOT_DOS_DISK 26 */
50 ENXIO, /* ERROR_SECTOR_NOT_FOUND 27 */
51 EBUSY, /* ERROR_OUT_OF_PAPER 28 */
52 EIO, /* ERROR_WRITE_FAULT 29 */
53 EIO, /* ERROR_READ_FAULT 30 */
54 EIO, /* ERROR_GEN_FAILURE 31 */
55 EACCES, /* ERROR_SHARING_VIOLATION 32 */
56 EACCES, /* ERROR_LOCK_VIOLATION 33 */
57 ENXIO, /* ERROR_WRONG_DISK 34 */
58 ENFILE, /* ERROR_FCB_UNAVAILABLE 35 */
59 ENFILE, /* ERROR_SHARING_BUFFER_EXCEEDED 36 */
62 ENOSPC, /* ERROR_HANDLE_DISK_FULL 39 */
73 ENODEV, /* ERROR_NOT_SUPPORTED 50 */
74 EBUSY, /* ERROR_REM_NOT_LIST 51 */
75 EEXIST, /* ERROR_DUP_NAME 52 */
76 ENOENT, /* ERROR_BAD_NETPATH 53 */
77 EBUSY, /* ERROR_NETWORK_BUSY 54 */
78 ENODEV, /* ERROR_DEV_NOT_EXIST 55 */
79 EAGAIN, /* ERROR_TOO_MANY_CMDS 56 */
80 EIO, /* ERROR_ADAP_HDW_ERR 57 */
81 EIO, /* ERROR_BAD_NET_RESP 58 */
82 EIO, /* ERROR_UNEXP_NET_ERR 59 */
83 EINVAL, /* ERROR_BAD_REM_ADAP 60 */
84 EFBIG, /* ERROR_PRINTQ_FULL 61 */
85 ENOSPC, /* ERROR_NO_SPOOL_SPACE 62 */
86 ENOENT, /* ERROR_PRINT_CANCELLED 63 */
87 ENOENT, /* ERROR_NETNAME_DELETED 64 */
88 EACCES, /* ERROR_NETWORK_ACCESS_DENIED 65 */
89 ENODEV, /* ERROR_BAD_DEV_TYPE 66 */
90 ENOENT, /* ERROR_BAD_NET_NAME 67 */
91 ENFILE, /* ERROR_TOO_MANY_NAMES 68 */
92 EIO, /* ERROR_TOO_MANY_SESS 69 */
93 EAGAIN, /* ERROR_SHARING_PAUSED 70 */
94 EINVAL, /* ERROR_REQ_NOT_ACCEP 71 */
95 EAGAIN, /* ERROR_REDIR_PAUSED 72 */
103 EEXIST, /* ERROR_FILE_EXISTS 80 */
105 ENOSPC, /* ERROR_CANNOT_MAKE 82 */
106 EIO, /* ERROR_FAIL_I24 83 */
107 ENFILE, /* ERROR_OUT_OF_STRUCTURES 84 */
108 EEXIST, /* ERROR_ALREADY_ASSIGNED 85 */
109 EPERM, /* ERROR_INVALID_PASSWORD 86 */
110 EINVAL, /* ERROR_INVALID_PARAMETER 87 */
111 EIO, /* ERROR_NET_WRITE_FAULT 88 */
112 EAGAIN, /* ERROR_NO_PROC_SLOTS 89 */
130 EXDEV, /* ERROR_DISK_CHANGE 107 */
131 EAGAIN, /* ERROR_DRIVE_LOCKED 108 */
132 EPIPE, /* ERROR_BROKEN_PIPE 109 */
133 ENOENT, /* ERROR_OPEN_FAILED 110 */
134 EINVAL, /* ERROR_BUFFER_OVERFLOW 111 */
135 ENOSPC, /* ERROR_DISK_FULL 112 */
136 EMFILE, /* ERROR_NO_MORE_SEARCH_HANDLES 113 */
137 EBADF, /* ERROR_INVALID_TARGET_HANDLE 114 */
138 EFAULT, /* ERROR_PROTECTION_VIOLATION 115 */
146 ENOENT, /* ERROR_INVALID_NAME 123 */
150 EINVAL, /* ERROR_PROC_NOT_FOUND 127 */
151 ECHILD, /* ERROR_WAIT_NO_CHILDREN 128 */
152 ECHILD, /* ERROR_CHILD_NOT_COMPLETE 129 */
153 EBADF, /* ERROR_DIRECT_ACCESS_HANDLE 130 */
154 EINVAL, /* ERROR_NEGATIVE_SEEK 131 */
155 ESPIPE, /* ERROR_SEEK_ON_DEVICE 132 */
165 EAGAIN, /* ERROR_BUSY_DRIVE 142 */
168 EEXIST, /* ERROR_DIR_NOT_EMPTY 145 */
181 EACCES, /* ERROR_NOT_LOCKED 158 */
184 ENOENT, /* ERROR_BAD_PATHNAME 161 */
190 EACCES, /* ERROR_LOCK_FAILED 167 */
206 EEXIST, /* ERROR_ALREADY_EXISTS 183 */
207 ECHILD, /* ERROR_NO_CHILD_PROCESS 184 */
229 ENAMETOOLONG,/* ERROR_FILENAME_EXCED_RANGE 206 */
253 EPIPE, /* ERROR_BAD_PIPE 230 */
254 EAGAIN, /* ERROR_PIPE_BUSY 231 */
255 EPIPE, /* ERROR_NO_DATA 232 */
256 EPIPE, /* ERROR_PIPE_NOT_CONNECTED 233 */
290 ENOTDIR, /* ERROR_DIRECTORY 267 */
293 static const unsigned int tableLen = sizeof(errorTable);
296 * The following table contains the mapping from WinSock errors to
300 static int wsaErrorTable[] = {
301 EWOULDBLOCK, /* WSAEWOULDBLOCK */
302 EINPROGRESS, /* WSAEINPROGRESS */
303 EALREADY, /* WSAEALREADY */
304 ENOTSOCK, /* WSAENOTSOCK */
305 EDESTADDRREQ, /* WSAEDESTADDRREQ */
306 EMSGSIZE, /* WSAEMSGSIZE */
307 EPROTOTYPE, /* WSAEPROTOTYPE */
308 ENOPROTOOPT, /* WSAENOPROTOOPT */
309 EPROTONOSUPPORT, /* WSAEPROTONOSUPPORT */
310 ESOCKTNOSUPPORT, /* WSAESOCKTNOSUPPORT */
311 EOPNOTSUPP, /* WSAEOPNOTSUPP */
312 EPFNOSUPPORT, /* WSAEPFNOSUPPORT */
313 EAFNOSUPPORT, /* WSAEAFNOSUPPORT */
314 EADDRINUSE, /* WSAEADDRINUSE */
315 EADDRNOTAVAIL, /* WSAEADDRNOTAVAIL */
316 ENETDOWN, /* WSAENETDOWN */
317 ENETUNREACH, /* WSAENETUNREACH */
318 ENETRESET, /* WSAENETRESET */
319 ECONNABORTED, /* WSAECONNABORTED */
320 ECONNRESET, /* WSAECONNRESET */
321 ENOBUFS, /* WSAENOBUFS */
322 EISCONN, /* WSAEISCONN */
323 ENOTCONN, /* WSAENOTCONN */
324 ESHUTDOWN, /* WSAESHUTDOWN */
325 ETOOMANYREFS, /* WSAETOOMANYREFS */
326 ETIMEDOUT, /* WSAETIMEDOUT */
327 ECONNREFUSED, /* WSAECONNREFUSED */
328 ELOOP, /* WSAELOOP */
329 ENAMETOOLONG, /* WSAENAMETOOLONG */
330 EHOSTDOWN, /* WSAEHOSTDOWN */
331 EHOSTUNREACH, /* WSAEHOSTUNREACH */
332 ENOTEMPTY, /* WSAENOTEMPTY */
333 EAGAIN, /* WSAEPROCLIM */
334 EUSERS, /* WSAEUSERS */
335 EDQUOT, /* WSAEDQUOT */
336 ESTALE, /* WSAESTALE */
337 EREMOTE, /* WSAEREMOTE */
341 *----------------------------------------------------------------------
343 * TclWinConvertError --
345 * This routine converts a Win32 error into an errno value.
351 * Sets the errno global variable.
353 *----------------------------------------------------------------------
357 TclWinConvertError(errCode)
358 DWORD errCode; /* Win32 error code. */
360 if (errCode >= tableLen) {
361 Tcl_SetErrno(EINVAL);
363 Tcl_SetErrno(errorTable[errCode]);
368 *----------------------------------------------------------------------
370 * TclWinConvertWSAError --
372 * This routine converts a WinSock error into an errno value.
378 * Sets the errno global variable.
380 *----------------------------------------------------------------------
384 TclWinConvertWSAError(errCode)
385 DWORD errCode; /* Win32 error code. */
387 if ((errCode >= WSAEWOULDBLOCK) && (errCode <= WSAEREMOTE)) {
388 Tcl_SetErrno(wsaErrorTable[errCode - WSAEWOULDBLOCK]);
390 Tcl_SetErrno(EINVAL);