1/*-
2 * Copyright (c) 2015 Nuxi, https://nuxi.nl/
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 */
25
26#include <sys/cdefs.h>
27__FBSDID("$FreeBSD$");
28
29#include <sys/param.h>
30
31#include <contrib/cloudabi/cloudabi_types_common.h>
32
33#include <compat/cloudabi/cloudabi_util.h>
34
35/* Converts a FreeBSD errno to a CloudABI errno. */
36cloudabi_errno_t
37cloudabi_convert_errno(int error)
38{
39	static const int table[] = {
40		[E2BIG]			= CLOUDABI_E2BIG,
41		[EACCES]		= CLOUDABI_EACCES,
42		[EADDRINUSE]		= CLOUDABI_EADDRINUSE,
43		[EADDRNOTAVAIL]		= CLOUDABI_EADDRNOTAVAIL,
44		[EAFNOSUPPORT]		= CLOUDABI_EAFNOSUPPORT,
45		[EAGAIN]		= CLOUDABI_EAGAIN,
46		[EALREADY]		= CLOUDABI_EALREADY,
47		[EBADF]			= CLOUDABI_EBADF,
48		[EBADMSG]		= CLOUDABI_EBADMSG,
49		[EBUSY]			= CLOUDABI_EBUSY,
50		[ECANCELED]		= CLOUDABI_ECANCELED,
51		[ECHILD]		= CLOUDABI_ECHILD,
52		[ECONNABORTED]		= CLOUDABI_ECONNABORTED,
53		[ECONNREFUSED]		= CLOUDABI_ECONNREFUSED,
54		[ECONNRESET]		= CLOUDABI_ECONNRESET,
55		[EDEADLK]		= CLOUDABI_EDEADLK,
56		[EDESTADDRREQ]		= CLOUDABI_EDESTADDRREQ,
57		[EDOM]			= CLOUDABI_EDOM,
58		[EDQUOT]		= CLOUDABI_EDQUOT,
59		[EEXIST]		= CLOUDABI_EEXIST,
60		[EFAULT]		= CLOUDABI_EFAULT,
61		[EFBIG]			= CLOUDABI_EFBIG,
62		[EHOSTUNREACH]		= CLOUDABI_EHOSTUNREACH,
63		[EIDRM]			= CLOUDABI_EIDRM,
64		[EILSEQ]		= CLOUDABI_EILSEQ,
65		[EINPROGRESS]		= CLOUDABI_EINPROGRESS,
66		[EINTEGRITY]		= CLOUDABI_EINVAL,
67		[EINTR]			= CLOUDABI_EINTR,
68		[EINVAL]		= CLOUDABI_EINVAL,
69		[EIO]			= CLOUDABI_EIO,
70		[EISCONN]		= CLOUDABI_EISCONN,
71		[EISDIR]		= CLOUDABI_EISDIR,
72		[ELOOP]			= CLOUDABI_ELOOP,
73		[EMFILE]		= CLOUDABI_EMFILE,
74		[EMLINK]		= CLOUDABI_EMLINK,
75		[EMSGSIZE]		= CLOUDABI_EMSGSIZE,
76		[EMULTIHOP]		= CLOUDABI_EMULTIHOP,
77		[ENAMETOOLONG]		= CLOUDABI_ENAMETOOLONG,
78		[ENETDOWN]		= CLOUDABI_ENETDOWN,
79		[ENETRESET]		= CLOUDABI_ENETRESET,
80		[ENETUNREACH]		= CLOUDABI_ENETUNREACH,
81		[ENFILE]		= CLOUDABI_ENFILE,
82		[ENOBUFS]		= CLOUDABI_ENOBUFS,
83		[ENODEV]		= CLOUDABI_ENODEV,
84		[ENOENT]		= CLOUDABI_ENOENT,
85		[ENOEXEC]		= CLOUDABI_ENOEXEC,
86		[ENOLCK]		= CLOUDABI_ENOLCK,
87		[ENOLINK]		= CLOUDABI_ENOLINK,
88		[ENOMEM]		= CLOUDABI_ENOMEM,
89		[ENOMSG]		= CLOUDABI_ENOMSG,
90		[ENOPROTOOPT]		= CLOUDABI_ENOPROTOOPT,
91		[ENOSPC]		= CLOUDABI_ENOSPC,
92		[ENOSYS]		= CLOUDABI_ENOSYS,
93		[ENOTCONN]		= CLOUDABI_ENOTCONN,
94		[ENOTDIR]		= CLOUDABI_ENOTDIR,
95		[ENOTEMPTY]		= CLOUDABI_ENOTEMPTY,
96		[ENOTRECOVERABLE]	= CLOUDABI_ENOTRECOVERABLE,
97		[ENOTSOCK]		= CLOUDABI_ENOTSOCK,
98		[ENOTSUP]		= CLOUDABI_ENOTSUP,
99		[ENOTTY]		= CLOUDABI_ENOTTY,
100		[ENXIO]			= CLOUDABI_ENXIO,
101		[EOVERFLOW]		= CLOUDABI_EOVERFLOW,
102		[EOWNERDEAD]		= CLOUDABI_EOWNERDEAD,
103		[EPERM]			= CLOUDABI_EPERM,
104		[EPIPE]			= CLOUDABI_EPIPE,
105		[EPROTO]		= CLOUDABI_EPROTO,
106		[EPROTONOSUPPORT]	= CLOUDABI_EPROTONOSUPPORT,
107		[EPROTOTYPE]		= CLOUDABI_EPROTOTYPE,
108		[ERANGE]		= CLOUDABI_ERANGE,
109		[EROFS]			= CLOUDABI_EROFS,
110		[ESPIPE]		= CLOUDABI_ESPIPE,
111		[ESRCH]			= CLOUDABI_ESRCH,
112		[ESTALE]		= CLOUDABI_ESTALE,
113		[ETIMEDOUT]		= CLOUDABI_ETIMEDOUT,
114		[ETXTBSY]		= CLOUDABI_ETXTBSY,
115		[EXDEV]			= CLOUDABI_EXDEV,
116		[ENOTCAPABLE]		= CLOUDABI_ENOTCAPABLE,
117	};
118
119	/* Unknown error: fall back to returning ENOSYS. */
120	if (error < 0 || error >= nitems(table) || table[error] == 0)
121		return (error == 0 ? 0 : CLOUDABI_ENOSYS);
122	return (table[error]);
123}
124