1/* 2 * tclWinError.c -- 3 * 4 * This file contains code for converting from Win32 errors to 5 * errno errors. 6 * 7 * Copyright (c) 1995-1996 by Sun Microsystems, Inc. 8 * 9 * See the file "license.terms" for information on usage and redistribution 10 * of this file, and for a DISCLAIMER OF ALL WARRANTIES. 11 * 12 * RCS: @(#) $Id: tclWinError.c,v 1.5 2002/05/27 10:14:21 dkf Exp $ 13 */ 14 15#include "tclWinInt.h" 16 17/* 18 * The following table contains the mapping from Win32 errors to 19 * errno errors. 20 */ 21 22static char errorTable[] = { 23 0, 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 */ 60 EINVAL, /* 37 */ 61 EINVAL, /* 38 */ 62 ENOSPC, /* ERROR_HANDLE_DISK_FULL 39 */ 63 EINVAL, /* 40 */ 64 EINVAL, /* 41 */ 65 EINVAL, /* 42 */ 66 EINVAL, /* 43 */ 67 EINVAL, /* 44 */ 68 EINVAL, /* 45 */ 69 EINVAL, /* 46 */ 70 EINVAL, /* 47 */ 71 EINVAL, /* 48 */ 72 EINVAL, /* 49 */ 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 */ 96 EINVAL, /* 73 */ 97 EINVAL, /* 74 */ 98 EINVAL, /* 75 */ 99 EINVAL, /* 76 */ 100 EINVAL, /* 77 */ 101 EINVAL, /* 78 */ 102 EINVAL, /* 79 */ 103 EEXIST, /* ERROR_FILE_EXISTS 80 */ 104 EINVAL, /* 81 */ 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 */ 113 EINVAL, /* 90 */ 114 EINVAL, /* 91 */ 115 EINVAL, /* 92 */ 116 EINVAL, /* 93 */ 117 EINVAL, /* 94 */ 118 EINVAL, /* 95 */ 119 EINVAL, /* 96 */ 120 EINVAL, /* 97 */ 121 EINVAL, /* 98 */ 122 EINVAL, /* 99 */ 123 EINVAL, /* 100 */ 124 EINVAL, /* 101 */ 125 EINVAL, /* 102 */ 126 EINVAL, /* 103 */ 127 EINVAL, /* 104 */ 128 EINVAL, /* 105 */ 129 EINVAL, /* 106 */ 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 */ 139 EINVAL, /* 116 */ 140 EINVAL, /* 117 */ 141 EINVAL, /* 118 */ 142 EINVAL, /* 119 */ 143 EINVAL, /* 120 */ 144 EINVAL, /* 121 */ 145 EINVAL, /* 122 */ 146 ENOENT, /* ERROR_INVALID_NAME 123 */ 147 EINVAL, /* 124 */ 148 EINVAL, /* 125 */ 149 EINVAL, /* 126 */ 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 */ 156 EINVAL, /* 133 */ 157 EINVAL, /* 134 */ 158 EINVAL, /* 135 */ 159 EINVAL, /* 136 */ 160 EINVAL, /* 137 */ 161 EINVAL, /* 138 */ 162 EINVAL, /* 139 */ 163 EINVAL, /* 140 */ 164 EINVAL, /* 141 */ 165 EAGAIN, /* ERROR_BUSY_DRIVE 142 */ 166 EINVAL, /* 143 */ 167 EINVAL, /* 144 */ 168 EEXIST, /* ERROR_DIR_NOT_EMPTY 145 */ 169 EINVAL, /* 146 */ 170 EINVAL, /* 147 */ 171 EINVAL, /* 148 */ 172 EINVAL, /* 149 */ 173 EINVAL, /* 150 */ 174 EINVAL, /* 151 */ 175 EINVAL, /* 152 */ 176 EINVAL, /* 153 */ 177 EINVAL, /* 154 */ 178 EINVAL, /* 155 */ 179 EINVAL, /* 156 */ 180 EINVAL, /* 157 */ 181 EACCES, /* ERROR_NOT_LOCKED 158 */ 182 EINVAL, /* 159 */ 183 EINVAL, /* 160 */ 184 ENOENT, /* ERROR_BAD_PATHNAME 161 */ 185 EINVAL, /* 162 */ 186 EINVAL, /* 163 */ 187 EINVAL, /* 164 */ 188 EINVAL, /* 165 */ 189 EINVAL, /* 166 */ 190 EACCES, /* ERROR_LOCK_FAILED 167 */ 191 EINVAL, /* 168 */ 192 EINVAL, /* 169 */ 193 EINVAL, /* 170 */ 194 EINVAL, /* 171 */ 195 EINVAL, /* 172 */ 196 EINVAL, /* 173 */ 197 EINVAL, /* 174 */ 198 EINVAL, /* 175 */ 199 EINVAL, /* 176 */ 200 EINVAL, /* 177 */ 201 EINVAL, /* 178 */ 202 EINVAL, /* 179 */ 203 EINVAL, /* 180 */ 204 EINVAL, /* 181 */ 205 EINVAL, /* 182 */ 206 EEXIST, /* ERROR_ALREADY_EXISTS 183 */ 207 ECHILD, /* ERROR_NO_CHILD_PROCESS 184 */ 208 EINVAL, /* 185 */ 209 EINVAL, /* 186 */ 210 EINVAL, /* 187 */ 211 EINVAL, /* 188 */ 212 EINVAL, /* 189 */ 213 EINVAL, /* 190 */ 214 EINVAL, /* 191 */ 215 EINVAL, /* 192 */ 216 EINVAL, /* 193 */ 217 EINVAL, /* 194 */ 218 EINVAL, /* 195 */ 219 EINVAL, /* 196 */ 220 EINVAL, /* 197 */ 221 EINVAL, /* 198 */ 222 EINVAL, /* 199 */ 223 EINVAL, /* 200 */ 224 EINVAL, /* 201 */ 225 EINVAL, /* 202 */ 226 EINVAL, /* 203 */ 227 EINVAL, /* 204 */ 228 EINVAL, /* 205 */ 229 ENAMETOOLONG,/* ERROR_FILENAME_EXCED_RANGE 206 */ 230 EINVAL, /* 207 */ 231 EINVAL, /* 208 */ 232 EINVAL, /* 209 */ 233 EINVAL, /* 210 */ 234 EINVAL, /* 211 */ 235 EINVAL, /* 212 */ 236 EINVAL, /* 213 */ 237 EINVAL, /* 214 */ 238 EINVAL, /* 215 */ 239 EINVAL, /* 216 */ 240 EINVAL, /* 217 */ 241 EINVAL, /* 218 */ 242 EINVAL, /* 219 */ 243 EINVAL, /* 220 */ 244 EINVAL, /* 221 */ 245 EINVAL, /* 222 */ 246 EINVAL, /* 223 */ 247 EINVAL, /* 224 */ 248 EINVAL, /* 225 */ 249 EINVAL, /* 226 */ 250 EINVAL, /* 227 */ 251 EINVAL, /* 228 */ 252 EINVAL, /* 229 */ 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 */ 257 EINVAL, /* 234 */ 258 EINVAL, /* 235 */ 259 EINVAL, /* 236 */ 260 EINVAL, /* 237 */ 261 EINVAL, /* 238 */ 262 EINVAL, /* 239 */ 263 EINVAL, /* 240 */ 264 EINVAL, /* 241 */ 265 EINVAL, /* 242 */ 266 EINVAL, /* 243 */ 267 EINVAL, /* 244 */ 268 EINVAL, /* 245 */ 269 EINVAL, /* 246 */ 270 EINVAL, /* 247 */ 271 EINVAL, /* 248 */ 272 EINVAL, /* 249 */ 273 EINVAL, /* 250 */ 274 EINVAL, /* 251 */ 275 EINVAL, /* 252 */ 276 EINVAL, /* 253 */ 277 EINVAL, /* 254 */ 278 EINVAL, /* 255 */ 279 EINVAL, /* 256 */ 280 EINVAL, /* 257 */ 281 EINVAL, /* 258 */ 282 EINVAL, /* 259 */ 283 EINVAL, /* 260 */ 284 EINVAL, /* 261 */ 285 EINVAL, /* 262 */ 286 EINVAL, /* 263 */ 287 EINVAL, /* 264 */ 288 EINVAL, /* 265 */ 289 EINVAL, /* 266 */ 290 ENOTDIR, /* ERROR_DIRECTORY 267 */ 291}; 292 293static const unsigned int tableLen = sizeof(errorTable); 294 295/* 296 * The following table contains the mapping from WinSock errors to 297 * errno errors. 298 */ 299 300static 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 */ 338}; 339 340/* 341 *---------------------------------------------------------------------- 342 * 343 * TclWinConvertError -- 344 * 345 * This routine converts a Win32 error into an errno value. 346 * 347 * Results: 348 * None. 349 * 350 * Side effects: 351 * Sets the errno global variable. 352 * 353 *---------------------------------------------------------------------- 354 */ 355 356void 357TclWinConvertError(errCode) 358 DWORD errCode; /* Win32 error code. */ 359{ 360 if (errCode >= tableLen) { 361 Tcl_SetErrno(EINVAL); 362 } else { 363 Tcl_SetErrno(errorTable[errCode]); 364 } 365} 366 367/* 368 *---------------------------------------------------------------------- 369 * 370 * TclWinConvertWSAError -- 371 * 372 * This routine converts a WinSock error into an errno value. 373 * 374 * Results: 375 * None. 376 * 377 * Side effects: 378 * Sets the errno global variable. 379 * 380 *---------------------------------------------------------------------- 381 */ 382 383void 384TclWinConvertWSAError(errCode) 385 DWORD errCode; /* Win32 error code. */ 386{ 387 if ((errCode >= WSAEWOULDBLOCK) && (errCode <= WSAEREMOTE)) { 388 Tcl_SetErrno(wsaErrorTable[errCode - WSAEWOULDBLOCK]); 389 } else { 390 Tcl_SetErrno(EINVAL); 391 } 392} 393