VirtualBox

source: vbox/trunk/src/VBox/Runtime/common/err/RTErrConvertFromErrno.cpp@ 96159

Last change on this file since 96159 was 96159, checked in by vboxsync, 2 years ago

IPRT/nocrt: strtod, a makefile correction, and ERANGE errno mapping. bugref:10261

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

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette