blob: 302e6bf89d7db5fee7e107009f7ec0e2a6d977db (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
|
/* $Id: RTErrConvertFromErrno.cpp $ */
/** @file
* IPRT - Convert errno to iprt status codes.
*/
/*
* Copyright (C) 2006-2019 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* you can redistribute it and/or modify it under the terms of the GNU
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* The contents of this file may alternatively be used under the terms
* of the Common Development and Distribution License Version 1.0
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
* VirtualBox OSE distribution, in which case the provisions of the
* CDDL are applicable instead of those of the GPL.
*
* You may elect to license modified versions of this file under the
* terms and conditions of either the GPL or the CDDL or both.
*/
/*********************************************************************************************************************************
* Header Files *
*********************************************************************************************************************************/
#include <iprt/err.h>
#include "internal/iprt.h"
#include <iprt/log.h>
#include <iprt/assert.h>
#include <iprt/errno.h>
RTDECL(int) RTErrConvertFromErrno(unsigned uNativeCode)
{
/* very fast check for no error. */
if (uNativeCode == 0)
return VINF_SUCCESS;
/*
* Process error codes.
*
* (Use a switch and not a table since the numbers vary among compilers
* and OSes. So we let the compiler switch optimizer handle speed issues.)
*
* This switch is arranged like the Linux i386 errno.h! This switch is mirrored
* by RTErrConvertToErrno.
*/
switch (uNativeCode)
{ /* Linux number */
#ifdef EPERM
case EPERM: return VERR_ACCESS_DENIED; /* 1 */
#endif
#ifdef ENOENT
case ENOENT: return VERR_FILE_NOT_FOUND;
#endif
#ifdef ESRCH
case ESRCH: return VERR_PROCESS_NOT_FOUND;
#endif
#ifdef EINTR
case EINTR: return VERR_INTERRUPTED;
#endif
#ifdef EIO
case EIO: return VERR_DEV_IO_ERROR;
#endif
#ifdef ENXIO
case ENXIO: return VERR_DEV_IO_ERROR; /** @todo fix this duplicate error */
#endif
#ifdef E2BIG
case E2BIG: return VERR_TOO_MUCH_DATA;
#endif
#ifdef ENOEXEC
case ENOEXEC: return VERR_BAD_EXE_FORMAT;
#endif
#ifdef EBADF
case EBADF: return VERR_INVALID_HANDLE;
#endif
#ifdef ECHILD
case ECHILD: return VERR_PROCESS_NOT_FOUND; /* 10 */ /** @todo fix duplicate error */
#endif
#ifdef EAGAIN
case EAGAIN: return VERR_TRY_AGAIN;
#endif
#ifdef ENOMEM
case ENOMEM: return VERR_NO_MEMORY;
#endif
#ifdef EACCES
case EACCES: return VERR_ACCESS_DENIED; /** @todo fix duplicate error */
#endif
#ifdef EFAULT
case EFAULT: return VERR_INVALID_POINTER;
#endif
#ifdef ENOTBLK
//case ENOTBLK: return VERR_;
#endif
#ifdef EBUSY
case EBUSY: return VERR_RESOURCE_BUSY;
#endif
#ifdef EEXIST
case EEXIST: return VERR_ALREADY_EXISTS;
#endif
#ifdef EXDEV
case EXDEV: return VERR_NOT_SAME_DEVICE;
#endif
#ifdef ENODEV
case ENODEV: return VERR_NOT_SUPPORTED; /** @todo fix duplicate error */
#endif
#ifdef ENOTDIR
case ENOTDIR: return VERR_PATH_NOT_FOUND; /* 20 */
#endif
#ifdef EISDIR
case EISDIR: return VERR_IS_A_DIRECTORY;
#endif
#ifdef EINVAL
case EINVAL: return VERR_INVALID_PARAMETER;
#endif
#ifdef ENFILE
case ENFILE: return VERR_TOO_MANY_OPEN_FILES; /** @todo fix duplicate error */
#endif
#ifdef EMFILE
case EMFILE: return VERR_TOO_MANY_OPEN_FILES;
#endif
#ifdef ENOTTY
case ENOTTY: return VERR_INVALID_FUNCTION;
#endif
#ifdef ETXTBSY
case ETXTBSY: return VERR_SHARING_VIOLATION;
#endif
#ifdef EFBIG
case EFBIG: return VERR_FILE_TOO_BIG;
#endif
#ifdef ENOSPC
case ENOSPC: return VERR_DISK_FULL;
#endif
#ifdef ESPIPE
case ESPIPE: return VERR_SEEK_ON_DEVICE;
#endif
#ifdef EROFS
case EROFS: return VERR_WRITE_PROTECT; /* 30 */
#endif
#ifdef EMLINK
//case EMLINK:
#endif
#ifdef EPIPE
case EPIPE: return VERR_BROKEN_PIPE;
#endif
#ifdef EDOM
case EDOM: return VERR_INVALID_PARAMETER; /** @todo fix duplicate error */
#endif
#ifdef ERANGE
case ERANGE: return VERR_INVALID_PARAMETER; /** @todo fix duplicate error */
#endif
#ifdef EDEADLK
case EDEADLK: return VERR_DEADLOCK;
#endif
#ifdef ENAMETOOLONG
case ENAMETOOLONG: return VERR_FILENAME_TOO_LONG;
#endif
#ifdef ENOLCK
case ENOLCK: return VERR_FILE_LOCK_FAILED;
#endif
#ifdef ENOSYS /** @todo map this differently on solaris. */
case ENOSYS: return VERR_NOT_SUPPORTED;
#endif
#ifdef ENOTEMPTY
case ENOTEMPTY: return VERR_DIR_NOT_EMPTY;
#endif
#ifdef ELOOP
case ELOOP: return VERR_TOO_MANY_SYMLINKS; /* 40 */
#endif
//41??
#ifdef ENOMSG
//case ENOMSG 42 /* No message of desired type */
#endif
#ifdef EIDRM
//case EIDRM 43 /* Identifier removed */
#endif
#ifdef ECHRNG
//case ECHRNG 44 /* Channel number out of range */
#endif
#ifdef EL2NSYNC
//case EL2NSYNC 45 /* Level 2 not synchronized */
#endif
#ifdef EL3HLT
//case EL3HLT 46 /* Level 3 halted */
#endif
#ifdef EL3RST
//case EL3RST 47 /* Level 3 reset */
#endif
#ifdef ELNRNG
//case ELNRNG 48 /* Link number out of range */
#endif
#ifdef EUNATCH
//case EUNATCH 49 /* Protocol driver not attached */
#endif
#ifdef ENOCSI
//case ENOCSI 50 /* No CSI structure available */
#endif
#ifdef EL2HLT
//case EL2HLT 51 /* Level 2 halted */
#endif
#ifdef EBADE
//case EBADE 52 /* Invalid exchange */
#endif
#ifdef EBADR
//case EBADR 53 /* Invalid request descriptor */
#endif
#ifdef EXFULL
//case EXFULL 54 /* Exchange full */
#endif
#ifdef ENOANO
//case ENOANO 55 /* No anode */
#endif
#ifdef EBADRQC
//case EBADRQC 56 /* Invalid request code */
#endif
#ifdef EBADSLT
//case EBADSLT 57 /* Invalid slot */
#endif
//case 58:
#ifdef EBFONT
//case EBFONT 59 /* Bad font file format */
#endif
#ifdef ENOSTR
//case ENOSTR 60 /* Device not a stream */
#endif
#ifdef ENODATA
case ENODATA: return VERR_NO_DATA;
#endif
#ifdef ETIME
//case ETIME 62 /* Timer expired */
#endif
#ifdef ENOSR
//case ENOSR 63 /* Out of streams resources */
#endif
#ifdef ENONET
case ENONET: return VERR_NET_NO_NETWORK;
#endif
#ifdef ENOPKG
//case ENOPKG 65 /* Package not installed */
#endif
#ifdef EREMOTE
//case EREMOTE 66 /* Object is remote */
#endif
#ifdef ENOLINK
//case ENOLINK 67 /* Link has been severed */
#endif
#ifdef EADV
//case EADV 68 /* Advertise error */
#endif
#ifdef ESRMNT
//case ESRMNT 69 /* Srmount error */
#endif
#ifdef ECOMM
//case ECOMM 70 /* Communication error on send */
#endif
#ifdef EPROTO
case EPROTO: return VERR_NET_PROTOCOL_ERROR;
#endif
#ifdef EMULTIHOP
//case EMULTIHOP 72 /* Multihop attempted */
#endif
#ifdef EDOTDOT
//case EDOTDOT 73 /* RFS specific error */
#endif
#ifdef EBADMSG
//case EBADMSG 74 /* Not a data message */
#endif
#ifdef EOVERFLOW
case EOVERFLOW: return VERR_TOO_MUCH_DATA; /** @todo fix duplicate error */
#endif
#ifdef ENOTUNIQ
case ENOTUNIQ: return VERR_NET_NOT_UNIQUE_NAME;
#endif
#ifdef EBADFD
case EBADFD: return VERR_INVALID_HANDLE; /** @todo fix duplicate error? */
#endif
#ifdef EREMCHG
//case EREMCHG 78 /* Remote address changed */
#endif
#ifdef ELIBACC
//case ELIBACC 79 /* Can not access a needed shared library */
#endif
#ifdef ELIBBAD
//case ELIBBAD 80 /* Accessing a corrupted shared library */
#endif
#ifdef ELIBSCN
//case ELIBSCN 81 /* .lib section in a.out corrupted */
#endif
#ifdef ELIBMAX
//case ELIBMAX 82 /* Attempting to link in too many shared libraries */
#endif
#ifdef ELIBEXEC
//case ELIBEXEC 83 /* Cannot exec a shared library directly */
#endif
#ifdef EILSEQ
case EILSEQ: return VERR_NO_TRANSLATION;
#endif
#ifdef ERESTART
case ERESTART: return VERR_INTERRUPTED;/** @todo fix duplicate error?*/
#endif
#ifdef ESTRPIPE
//case ESTRPIPE 86 /* Streams pipe error */
#endif
#ifdef EUSERS
//case EUSERS 87 /* Too many users */
#endif
#ifdef ENOTSOCK
case ENOTSOCK: return VERR_NET_NOT_SOCKET;
#endif
#ifdef EDESTADDRREQ
case EDESTADDRREQ: return VERR_NET_DEST_ADDRESS_REQUIRED;
#endif
#ifdef EMSGSIZE
case EMSGSIZE: return VERR_NET_MSG_SIZE;
#endif
#ifdef EPROTOTYPE
case EPROTOTYPE: return VERR_NET_PROTOCOL_TYPE;
#endif
#ifdef ENOPROTOOPT
case ENOPROTOOPT: return VERR_NET_PROTOCOL_NOT_AVAILABLE;
#endif
#ifdef EPROTONOSUPPORT
case EPROTONOSUPPORT: return VERR_NET_PROTOCOL_NOT_SUPPORTED;
#endif
#ifdef ESOCKTNOSUPPORT
case ESOCKTNOSUPPORT: return VERR_NET_SOCKET_TYPE_NOT_SUPPORTED;
#endif
#ifdef EOPNOTSUPP /** @todo map this differently on solaris. */
case EOPNOTSUPP: return VERR_NET_OPERATION_NOT_SUPPORTED;
#endif
#ifdef EPFNOSUPPORT
case EPFNOSUPPORT: return VERR_NET_PROTOCOL_FAMILY_NOT_SUPPORTED;
#endif
#ifdef EAFNOSUPPORT
case EAFNOSUPPORT: return VERR_NET_ADDRESS_FAMILY_NOT_SUPPORTED;
#endif
#ifdef EADDRINUSE
case EADDRINUSE: return VERR_NET_ADDRESS_IN_USE;
#endif
#ifdef EADDRNOTAVAIL
case EADDRNOTAVAIL: return VERR_NET_ADDRESS_NOT_AVAILABLE;
#endif
#ifdef ENETDOWN
case ENETDOWN: return VERR_NET_DOWN;
#endif
#ifdef ENETUNREACH
case ENETUNREACH: return VERR_NET_UNREACHABLE;
#endif
#ifdef ENETRESET
case ENETRESET: return VERR_NET_CONNECTION_RESET;
#endif
#ifdef ECONNABORTED
case ECONNABORTED: return VERR_NET_CONNECTION_ABORTED;
#endif
#ifdef ECONNRESET
case ECONNRESET: return VERR_NET_CONNECTION_RESET_BY_PEER;
#endif
#ifdef ENOBUFS
case ENOBUFS: return VERR_NET_NO_BUFFER_SPACE;
#endif
#ifdef EISCONN
case EISCONN: return VERR_NET_ALREADY_CONNECTED;
#endif
#ifdef ENOTCONN
case ENOTCONN: return VERR_NET_NOT_CONNECTED;
#endif
#ifdef ESHUTDOWN
case ESHUTDOWN: return VERR_NET_SHUTDOWN;
#endif
#ifdef ETOOMANYREFS
case ETOOMANYREFS: return VERR_NET_TOO_MANY_REFERENCES;
#endif
#ifdef ETIMEDOUT
case ETIMEDOUT: return VERR_TIMEOUT;
#endif
#ifdef ECONNREFUSED
case ECONNREFUSED: return VERR_NET_CONNECTION_REFUSED;
#endif
#ifdef EHOSTDOWN
case EHOSTDOWN: return VERR_NET_HOST_DOWN;
#endif
#ifdef EHOSTUNREACH
case EHOSTUNREACH: return VERR_NET_HOST_UNREACHABLE;
#endif
#ifdef EALREADY
# if !defined(ENOLCK) || (EALREADY != ENOLCK)
case EALREADY: return VERR_NET_ALREADY_IN_PROGRESS;
# endif
#endif
#ifdef EINPROGRESS
# if !defined(ENODEV) || (EINPROGRESS != ENODEV)
case EINPROGRESS: return VERR_NET_IN_PROGRESS;
# endif
#endif
#ifdef ESTALE
//case ESTALE 116 /* Stale NFS file handle */
#endif
#ifdef EUCLEAN
//case EUCLEAN 117 /* Structure needs cleaning */
#endif
#ifdef ENOTNAM
//case ENOTNAM 118 /* Not a XENIX named type file */
#endif
#ifdef ENAVAIL
//case ENAVAIL 119 /* No XENIX semaphores available */
#endif
#ifdef EISNAM
//case EISNAM 120 /* Is a named type file */
#endif
#ifdef EREMOTEIO
//case EREMOTEIO 121 /* Remote I/O error */
#endif
#ifdef EDQUOT
case EDQUOT: return VERR_DISK_FULL; /** @todo fix duplicate error */
#endif
#ifdef ENOMEDIUM
case ENOMEDIUM: return VERR_MEDIA_NOT_PRESENT;
#endif
#ifdef EMEDIUMTYPE
case EMEDIUMTYPE: return VERR_MEDIA_NOT_RECOGNIZED;
#endif
#if defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN)
case EWOULDBLOCK: return VERR_TRY_AGAIN;
#endif
/* Non-linux */
#ifdef EPROCLIM
case EPROCLIM: return VERR_MAX_PROCS_REACHED;
#endif
#ifdef EDOOFUS
# if EDOOFUS != EINVAL
case EDOOFUS: return VERR_INTERNAL_ERROR;
# endif
#endif
#ifdef ENOTSUP
# ifndef EOPNOTSUPP
case ENOTSUP: return VERR_NOT_SUPPORTED;
# else
# if ENOTSUP != EOPNOTSUPP
case ENOTSUP: return VERR_NOT_SUPPORTED;
# endif
# endif
#endif
default:
AssertLogRelMsgFailed(("Unhandled error code %d\n", uNativeCode));
return VERR_UNRESOLVED_ERROR;
}
}
RT_EXPORT_SYMBOL(RTErrConvertFromErrno);
|