VirtualBox

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

Last change on this file since 77110 was 77110, checked in by vboxsync, 6 years ago

RTErrConvertFromErrno(): Convert the uNativeCode parameter from unsigned to int. errno is specified to be of type int and while it should only ever contain positive values RTErrConvertFromErrno() is also used inside the various kernel drivers where errno does not exist and the return code might be negative as well. The example here is ERESTART (-1) on FreeBSD causing a compile error with clang and this fix is cleaner IMO instead of casting ERSTART to unsigned.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 13.9 KB
Line 
1/* $Id: RTErrConvertFromErrno.cpp 77110 2019-02-01 11:00:12Z vboxsync $ */
2/** @file
3 * IPRT - Convert errno to iprt status codes.
4 */
5
6/*
7 * Copyright (C) 2006-2019 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_INVALID_PARAMETER; /** @todo fix duplicate error */
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 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", uNativeCode));
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