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