OSDN Git Service

Enable to track git://github.com/monaka/binutils.git
[pf3gnuchains/pf3gnuchains3x.git] / tcl / win / tclWinError.c
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$
13  */
14
15 #include "tclWinInt.h"
16
17 /*
18  * The following table contains the mapping from Win32 errors to
19  * errno errors.
20  */
21
22 static 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
293 static const unsigned int tableLen = sizeof(errorTable);
294
295 /*
296  * The following table contains the mapping from WinSock errors to
297  * errno errors.
298  */
299
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 */
338 };
339 \f
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
356 void
357 TclWinConvertError(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 \f
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
383 void
384 TclWinConvertWSAError(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 }