Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Last corrections of Tesh tool.
[simgrid.git] / tools / tesh2 / src / xerrno.c
1 #include <xerrno.h>\r
2 \r
3 typedef struct s_entry\r
4 {\r
5         const char* name;\r
6         int code;\r
7         unsigned kind : 1;              /* if 1 it's an error of the application else assume it's a system error */\r
8         const char* string;\r
9         \r
10 }entry_t;\r
11 \r
12 \r
13 static const\r
14 entry_t err[] =\r
15 {\r
16         \r
17         #ifdef E2BIG\r
18         {"E2BIG", E2BIG, 0, "argument list too long"},\r
19         #endif\r
20         \r
21         #ifdef EACCES\r
22         {"EACCES", EACCES, 0, "permission denied"},\r
23         #endif\r
24         \r
25         #ifdef EADDRINUSE\r
26         {"EADDRINUSE", EADDRINUSE, 0, "address in use"},\r
27         #endif\r
28         \r
29         #ifdef EADDRNOTAVAIL\r
30         {"EADDRNOTAVAIL", EADDRNOTAVAIL, 0, "address not available"},\r
31         #endif\r
32         \r
33         #ifdef EAFNOSUPPORT\r
34         {"EAFNOSUPPORT", EAFNOSUPPORT, 0, "address family not supported"},\r
35         #endif\r
36         \r
37         #ifdef EAGAIN\r
38         {"EAGAIN", EAGAIN, 0, "resource unavailable, try again"},\r
39         #endif\r
40         \r
41         #ifdef EALREADY\r
42         {"EALREADY", EALREADY, 0, "connection already in progress"},\r
43         #endif\r
44         \r
45         #ifdef EBADF\r
46         {"EBADF", EBADF, 0, "bad file descriptor"},\r
47         #endif\r
48         \r
49         #ifdef EBADMSG\r
50         {"EBADMSG", EBADMSG, 0, "bad message"},\r
51         #endif\r
52         \r
53         #ifdef EBUSY\r
54         {"EBUSY", EBUSY, 0, "device or resource busy"},\r
55         #endif\r
56         \r
57         #ifdef ECANCELED\r
58         {"ECANCELED", ECANCELED, 0, "operation canceled"},\r
59         #endif\r
60         \r
61         #ifdef ECHILD\r
62         {"ECHILD", ECHILD, 0, "no child processes"},\r
63         #endif\r
64         \r
65         #ifdef ECONNABORTED\r
66         {"ECONNABORTED", ECONNABORTED, 0, "connection aborted"},\r
67         #endif\r
68         \r
69         #ifdef ECONNREFUSED\r
70         {"ECONNREFUSED", ECONNREFUSED, 0, "connection refused"},\r
71         #endif\r
72         \r
73         #ifdef ECONNRESET\r
74         {"ECONNRESET", ECONNRESET, 0, "connection reset"},\r
75         #endif\r
76         \r
77         #ifdef EDEADLK\r
78         {"EDEADLK", EDEADLK, 0, "resource deadlock would occur"},\r
79         #endif\r
80         \r
81         #ifdef EDESTADDRREQ\r
82         {"EDESTADDRREQ", EDESTADDRREQ, 0, "destination address required"},\r
83         #endif\r
84         \r
85         #ifdef EDOM\r
86         {"EDOM", EDOM, 0, "mathematics argument out of domain of function"},\r
87         #endif \r
88         \r
89         #ifdef EEXIST\r
90         {"EEXIST", EEXIST, 0, "file exists"},\r
91         #endif\r
92         \r
93         #ifdef EFAULT\r
94         {"EFAULT", EFAULT, 0, "bad address"},\r
95         #endif\r
96         \r
97         #ifdef EFBIG\r
98         {"EFBIG", EFBIG, 0, "file too large"},\r
99         #endif\r
100         \r
101         #ifdef EHOSTUNREACH\r
102         {"EHOSTUNREACH", EHOSTUNREACH, 0, "host is unreachable"},\r
103         #endif\r
104         \r
105         #ifdef EIDRM\r
106         {"EIDRM", EIDRM, 0, "identifier removed"},\r
107         #endif\r
108         \r
109         #ifdef EILSEQ\r
110         {"EILSEQ", EILSEQ, 0, "illegal byte sequence"},\r
111         #endif\r
112         \r
113         #ifdef EINPROGRESS\r
114         {"EINPROGRESS", EINPROGRESS, 0, "operation in progress"},\r
115         #endif\r
116         \r
117         #ifdef EINTR\r
118         {"EINTR", EINTR, 0, "interrupted function"},\r
119         #endif\r
120         \r
121         #ifdef EINVAL\r
122         {"EINVAL", EINVAL, 0, "invalid argument"},\r
123         #endif\r
124         \r
125         #ifdef EIO\r
126         {"EIO", EIO, 0, "I/O error"},\r
127         #endif\r
128         \r
129         #ifdef EISCONN\r
130         {"EISCONN", EISCONN, 0, "socket is connected"},\r
131         #endif\r
132         \r
133         #ifdef EISDIR\r
134         {"EISDIR", EISDIR, 0, "is a directory"},\r
135         #endif\r
136         \r
137         #ifdef ELOOP\r
138         {"ELOOP", ELOOP, 0, "too many levels of symbolic links"},\r
139         #endif\r
140         \r
141         #ifdef EMFILE\r
142         {"EMFILE", EMFILE, 0, "too many open files"},\r
143         #endif\r
144         \r
145         #ifdef EMLINK\r
146         {"EMLINK", EMLINK, 0, "too many links"},\r
147         #endif\r
148         \r
149         #ifdef EMSGSIZE\r
150         {"EMSGSIZE", EMSGSIZE, 0, "message too large"},\r
151         #endif\r
152         \r
153         #ifdef ENAMETOOLONG\r
154         {"ENAMETOOLONG", ENAMETOOLONG, 0, "filename too long"},\r
155         #endif\r
156         \r
157         #ifdef ENETDOWN\r
158         {"ENETDOWN", ENETDOWN, 0, "network is down"},\r
159         #endif\r
160         \r
161         #ifdef ENETRESET\r
162         {"ENETRESET", ENETRESET, 0, "connection aborted by network"},\r
163         #endif\r
164         \r
165         #ifdef ENETUNREACH\r
166         {"ENETUNREACH", ENETUNREACH, 0, "network unreachable"},\r
167         #endif\r
168         \r
169         #ifdef ENFILE\r
170         {"ENFILE", ENFILE, 0, "too many files open in system"},\r
171         #endif\r
172         \r
173         #ifdef ENOBUFS\r
174         {"ENOBUFS", ENOBUFS, 0, "no buffer space available"},\r
175         #endif\r
176         \r
177         #ifdef ENODATA\r
178         {"ENODATA", ENODATA, 0, "no message is available on the STREAM head read queue"},\r
179         #endif\r
180         \r
181         #ifdef ENODEV\r
182         {"ENODEV", ENODEV, 0, "no such device"},\r
183         #endif\r
184         \r
185         #ifdef ENOENT\r
186         {"ENOENT", ENOENT, 0, "no such file or directory"},\r
187         #endif\r
188         \r
189         #ifdef ENOEXEC\r
190         {"ENOEXEC", ENOEXEC, 0, "executable file format error"},\r
191         #endif\r
192         \r
193         #ifdef ENOLCK\r
194         {"ENOLCK", ENOLCK, 0, "no locks available"},\r
195         #endif\r
196         \r
197         #ifdef ENOMEM\r
198         {"ENOMEM", ENOMEM, 0, "not enough space"},\r
199         #endif\r
200         \r
201         #ifdef ENOMSG\r
202         {"ENOMSG", ENOMSG, 0, "no message of the desired type"},\r
203         #endif\r
204         \r
205         #ifdef ENOPROTOOPT\r
206         {"ENOPROTOOPT", ENOPROTOOPT, 0, "protocol not available"},\r
207         #endif\r
208         \r
209         #ifdef ENOSPC\r
210         {"ENOSPC", ENOSPC, 0, "no space left on device"},\r
211         #endif\r
212         \r
213         #ifdef ENOSR\r
214         {"ENOSR", ENOSR, 0, "no stream resources"},\r
215         #endif\r
216         \r
217         #ifdef ENOSTR\r
218         {"ENOSTR", ENOSTR, 0, "not a stream"},\r
219         #endif\r
220         \r
221         #ifdef ENOSYS\r
222         {"ENOSYS", ENOSYS, 0, "function not supported"},\r
223         #endif\r
224         \r
225         #ifdef ENOTCONN\r
226         {"ENOTCONN", ENOTCONN, 0, "the socket is not connected"},\r
227         #endif\r
228         \r
229         #ifdef ENOTDIR\r
230         {"ENOTDIR", ENOTDIR, 0, "not a directory"},\r
231         #endif\r
232         \r
233         #ifdef ENOTEMPTY\r
234         {"ENOTEMPTY", ENOTEMPTY, 0, "directory not empty"},\r
235         #endif\r
236         \r
237         #ifdef ENOTSOCK\r
238         {"ENOTSOCK", ENOTSOCK, 0, "not a socket"},\r
239         #endif\r
240         \r
241         #ifdef ENOTSUP\r
242         {"ENOTSUP", ENOTSUP, 0, "not supported"},\r
243         #endif\r
244         \r
245         #ifdef ENOTTY\r
246         {"ENOTTY", ENOTTY, 0, "inappropriate I/O control operation"},\r
247         #endif\r
248         \r
249         #ifdef ENXIO\r
250         {"ENXIO", ENXIO, 0, "no such device or address"},\r
251         #endif\r
252         \r
253         #ifdef EOPNOTSUPP\r
254         {"EOPNOTSUPP", EOPNOTSUPP, 0, "operation not supported on socket"},\r
255         #endif\r
256         \r
257         #ifdef EOVERFLOW\r
258         {"EOVERFLOW", EOVERFLOW, 0, "value too large to be stored in data type"},\r
259         #endif\r
260         \r
261         #ifdef EPERM\r
262         {"EPERM", EPERM, 0, "operation not permitted"},\r
263         #endif\r
264         \r
265         #ifdef EPIPE\r
266         {"EPIPE", EPIPE, 0, "broken pipe"},\r
267         #endif\r
268         \r
269         #ifdef EPROTO\r
270         {"EPROTO", EPROTO, 0, "protocol error"},\r
271         #endif\r
272         \r
273         #ifdef EPROTONOSUPPORT\r
274         {"EPROTONOSUPPORT", EPROTONOSUPPORT, 0, "protocol not supported"},\r
275         #endif\r
276         \r
277         #ifdef EPROTOTYPE\r
278         {"EPROTOTYPE", EPROTOTYPE, 0, "protocol wrong type for socket"},\r
279         #endif\r
280         \r
281         #ifdef ERANGE\r
282         {"ERANGE", ERANGE, 0, "result too large"},\r
283         #endif\r
284         \r
285         #ifdef EROFS\r
286         {"EROFS", EROFS, 0, "read-only file system"},\r
287         #endif\r
288         \r
289         #ifdef ESPIPE\r
290         {"ESPIPE", ESPIPE, 0, "invalid seek"},\r
291         #endif\r
292         \r
293         #ifdef ESRCH\r
294         {"ESRCH", ESRCH, 0, "no such process"},\r
295         #endif\r
296         \r
297         #ifdef ETIME\r
298         {"ETIME", ETIME, 0, "stream ioctl() timeout"},\r
299         #endif\r
300         \r
301         #ifdef ETIMEDOUT\r
302         {"ETIMEDOUT", ETIMEDOUT, 0, "connection timed out"},\r
303         #endif\r
304         \r
305         #ifdef ETXTBSY\r
306         {"ETXTBSY", ETXTBSY, 0, "text file busy"},\r
307         #endif\r
308         \r
309         #ifdef EWOULDBLOCK\r
310         {"EWOULDBLOCK", EWOULDBLOCK, 0, "operation would block"},\r
311         #endif\r
312         \r
313         #ifdef EXDEV\r
314         {"EXDEV", EXDEV, 0, "cross-device link"},\r
315         #endif\r
316         \r
317         {"ECMDTIMEDOUT", ECMDTIMEDOUT, 1, "command timed out"},\r
318 \r
319         {"ECMDNOTFOUND", ECMDNOTFOUND,1,  "command not found"},\r
320 \r
321         {"EEXITCODENOTMATCH", EEXITCODENOTMATCH,1,  "exit code mismatch"},\r
322 \r
323         {"EOUTPUTNOTMATCH", EOUTPUTNOTMATCH,1,  "output mismatch"},\r
324 \r
325         {"ESIGNOTMATCH", ESIGNOTMATCH,1,  "signal mismatch"},\r
326 \r
327         {"EUNXPSIG", EUNXPSIG,1,  "unexpected signal caught"},\r
328 \r
329         {"ESIGNOTRECEIPT", ESIGNOTRECEIPT,1,  "expected signal not receipt"},\r
330 \r
331         {"EPROCCMDLINE", EPROCCMDLINE, 1, "command line processing failed"},\r
332 \r
333         {"ENOARG", ENOARG, 1, "none optional argument not specified"},\r
334 \r
335         {"ENOTPOSITIVENUM", ENOTPOSITIVENUM, 1, "argument option not strictly positive"},\r
336 \r
337         {"ESYNTAX", ESYNTAX,1,  "syntax error"},\r
338 \r
339         {"ELEADTIME", ELEADTIME, 1, "timed out"},\r
340 \r
341         {"EREADMENOTFOUND", EREADMENOTFOUND,1,  "unable to locate the README.txt file"},\r
342 \r
343         {"EINCLUDENOTFOUND", EINCLUDENOTFOUND, 1,  "include file not found"},\r
344 \r
345         {"ESUFFIXTOOLONG", ESUFFIXTOOLONG,1,  "suffix too long"},\r
346 \r
347         {"EINVCMDLINE", EINVCMDLINE,1,  "invalid command line"},\r
348 \r
349         {"unkwown", -1, 0, "unknown"}\r
350 };\r
351 \r
352 #include <stdio.h>\r
353 \r
354 #ifdef WIN32\r
355 static char *\r
356 w32error_to_string(DWORD errcode) \r
357 {\r
358         static char buffer[128];\r
359 \r
360         /*\r
361          *  Special code for winsock error handling.\r
362          */\r
363         if (errcode > WSABASEERR) \r
364         {\r
365                 HMODULE hModule = GetModuleHandle("wsock32");\r
366                 \r
367                 if(hModule) \r
368                 {\r
369                         FormatMessage(FORMAT_MESSAGE_FROM_HMODULE,hModule, errcode, LANG_NEUTRAL, buffer, 128, NULL);\r
370                         FreeLibrary(hModule);\r
371                 }\r
372         } \r
373         else \r
374         {\r
375                 /*\r
376                  *  Default system message handling\r
377                  */\r
378         FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, errcode, LANG_NEUTRAL, buffer, 128, NULL);\r
379         }\r
380 \r
381     return buffer;\r
382 }\r
383 #endif\r
384 \r
385 const char*\r
386 error_to_string(int errcode, int kind)\r
387 {\r
388         int i;\r
389         \r
390         for(i = 0; err[i].code != -1; i++)\r
391                 if(err[i].code == errcode && err[i].kind == kind)\r
392                         return err[i].string;\r
393 \r
394         #ifdef WIN32\r
395 \r
396         /* assume it's a W32 error */\r
397         return w32error_to_string((DWORD)errcode);\r
398         #else\r
399         return "unknow error";  \r
400         #endif\r
401         \r
402 }\r
403 \r
404 const char*\r
405 error_get_at(int pos, int* code)\r
406 {\r
407         if(pos < 0 || (pos > (sizeof(err)/sizeof(entry_t)) - 2))\r
408         {\r
409                 errno = ERANGE;\r
410                 return NULL;\r
411         }\r
412         \r
413         *code = err[pos].code;\r
414         return err[pos].name;\r
415 }\r
416 \r