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