summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/libsysdecode/Makefile4
-rw-r--r--lib/libsysdecode/errno.c209
-rw-r--r--lib/libsysdecode/sysdecode.31
-rw-r--r--lib/libsysdecode/sysdecode.h2
-rw-r--r--lib/libsysdecode/sysdecode_abi_to_freebsd_errno.394
-rw-r--r--lib/libsysdecode/sysdecode_syscallnames.35
6 files changed, 312 insertions, 3 deletions
diff --git a/lib/libsysdecode/Makefile b/lib/libsysdecode/Makefile
index 75a9e31ad785..742c513469fe 100644
--- a/lib/libsysdecode/Makefile
+++ b/lib/libsysdecode/Makefile
@@ -5,15 +5,17 @@
PACKAGE=lib${LIB}
LIB= sysdecode
-SRCS= ioctl.c syscallnames.c utrace.c
+SRCS= errno.c ioctl.c syscallnames.c utrace.c
INCS= sysdecode.h
CFLAGS+= -I${.CURDIR}/../../sys
MAN+= sysdecode.3 \
+ sysdecode_abi_to_freebsd_errno.3 \
sysdecode_ioctlname.3 \
sysdecode_syscallnames.3 \
sysdecode_utrace.3
+MLINKS+= sysdecode_abi_to_freebsd_errno.3 sysdecode_freebsd_to_abi_errno.3
CLEANFILES= ioctl.c
diff --git a/lib/libsysdecode/errno.c b/lib/libsysdecode/errno.c
new file mode 100644
index 000000000000..1e863bb69dc2
--- /dev/null
+++ b/lib/libsysdecode/errno.c
@@ -0,0 +1,209 @@
+/*-
+ * Copyright (c) 2015 John H. Baldwin <jhb@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <sysdecode.h>
+
+#if defined(__i386__) || defined(__amd64__)
+/*
+ * Linux syscalls return negative errno's, we do positive and map them
+ * Reference:
+ * FreeBSD: src/sys/sys/errno.h
+ * Linux: linux-2.6.17.8/include/asm-generic/errno-base.h
+ * linux-2.6.17.8/include/asm-generic/errno.h
+ */
+static int bsd_to_linux_errno[ELAST + 1] = {
+ -0, -1, -2, -3, -4, -5, -6, -7, -8, -9,
+ -10, -35, -12, -13, -14, -15, -16, -17, -18, -19,
+ -20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
+ -30, -31, -32, -33, -34, -11,-115,-114, -88, -89,
+ -90, -91, -92, -93, -94, -95, -96, -97, -98, -99,
+ -100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
+ -110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
+ -116, -66, -6, -6, -6, -6, -6, -37, -38, -9,
+ -6, -6, -43, -42, -75,-125, -84, -95, -16, -74,
+ -72, -67, -71
+};
+#endif
+
+#if defined(__aarch64__) || defined(__amd64__)
+#include <compat/cloudabi/cloudabi_syscalldefs.h>
+
+static const int cloudabi_errno_table[] = {
+ [CLOUDABI_E2BIG] = E2BIG,
+ [CLOUDABI_EACCES] = EACCES,
+ [CLOUDABI_EADDRINUSE] = EADDRINUSE,
+ [CLOUDABI_EADDRNOTAVAIL] = EADDRNOTAVAIL,
+ [CLOUDABI_EAFNOSUPPORT] = EAFNOSUPPORT,
+ [CLOUDABI_EAGAIN] = EAGAIN,
+ [CLOUDABI_EALREADY] = EALREADY,
+ [CLOUDABI_EBADF] = EBADF,
+ [CLOUDABI_EBADMSG] = EBADMSG,
+ [CLOUDABI_EBUSY] = EBUSY,
+ [CLOUDABI_ECANCELED] = ECANCELED,
+ [CLOUDABI_ECHILD] = ECHILD,
+ [CLOUDABI_ECONNABORTED] = ECONNABORTED,
+ [CLOUDABI_ECONNREFUSED] = ECONNREFUSED,
+ [CLOUDABI_ECONNRESET] = ECONNRESET,
+ [CLOUDABI_EDEADLK] = EDEADLK,
+ [CLOUDABI_EDESTADDRREQ] = EDESTADDRREQ,
+ [CLOUDABI_EDOM] = EDOM,
+ [CLOUDABI_EDQUOT] = EDQUOT,
+ [CLOUDABI_EEXIST] = EEXIST,
+ [CLOUDABI_EFAULT] = EFAULT,
+ [CLOUDABI_EFBIG] = EFBIG,
+ [CLOUDABI_EHOSTUNREACH] = EHOSTUNREACH,
+ [CLOUDABI_EIDRM] = EIDRM,
+ [CLOUDABI_EILSEQ] = EILSEQ,
+ [CLOUDABI_EINPROGRESS] = EINPROGRESS,
+ [CLOUDABI_EINTR] = EINTR,
+ [CLOUDABI_EINVAL] = EINVAL,
+ [CLOUDABI_EIO] = EIO,
+ [CLOUDABI_EISCONN] = EISCONN,
+ [CLOUDABI_EISDIR] = EISDIR,
+ [CLOUDABI_ELOOP] = ELOOP,
+ [CLOUDABI_EMFILE] = EMFILE,
+ [CLOUDABI_EMLINK] = EMLINK,
+ [CLOUDABI_EMSGSIZE] = EMSGSIZE,
+ [CLOUDABI_EMULTIHOP] = EMULTIHOP,
+ [CLOUDABI_ENAMETOOLONG] = ENAMETOOLONG,
+ [CLOUDABI_ENETDOWN] = ENETDOWN,
+ [CLOUDABI_ENETRESET] = ENETRESET,
+ [CLOUDABI_ENETUNREACH] = ENETUNREACH,
+ [CLOUDABI_ENFILE] = ENFILE,
+ [CLOUDABI_ENOBUFS] = ENOBUFS,
+ [CLOUDABI_ENODEV] = ENODEV,
+ [CLOUDABI_ENOENT] = ENOENT,
+ [CLOUDABI_ENOEXEC] = ENOEXEC,
+ [CLOUDABI_ENOLCK] = ENOLCK,
+ [CLOUDABI_ENOLINK] = ENOLINK,
+ [CLOUDABI_ENOMEM] = ENOMEM,
+ [CLOUDABI_ENOMSG] = ENOMSG,
+ [CLOUDABI_ENOPROTOOPT] = ENOPROTOOPT,
+ [CLOUDABI_ENOSPC] = ENOSPC,
+ [CLOUDABI_ENOSYS] = ENOSYS,
+ [CLOUDABI_ENOTCONN] = ENOTCONN,
+ [CLOUDABI_ENOTDIR] = ENOTDIR,
+ [CLOUDABI_ENOTEMPTY] = ENOTEMPTY,
+ [CLOUDABI_ENOTRECOVERABLE] = ENOTRECOVERABLE,
+ [CLOUDABI_ENOTSOCK] = ENOTSOCK,
+ [CLOUDABI_ENOTSUP] = ENOTSUP,
+ [CLOUDABI_ENOTTY] = ENOTTY,
+ [CLOUDABI_ENXIO] = ENXIO,
+ [CLOUDABI_EOVERFLOW] = EOVERFLOW,
+ [CLOUDABI_EOWNERDEAD] = EOWNERDEAD,
+ [CLOUDABI_EPERM] = EPERM,
+ [CLOUDABI_EPIPE] = EPIPE,
+ [CLOUDABI_EPROTO] = EPROTO,
+ [CLOUDABI_EPROTONOSUPPORT] = EPROTONOSUPPORT,
+ [CLOUDABI_EPROTOTYPE] = EPROTOTYPE,
+ [CLOUDABI_ERANGE] = ERANGE,
+ [CLOUDABI_EROFS] = EROFS,
+ [CLOUDABI_ESPIPE] = ESPIPE,
+ [CLOUDABI_ESRCH] = ESRCH,
+ [CLOUDABI_ESTALE] = ESTALE,
+ [CLOUDABI_ETIMEDOUT] = ETIMEDOUT,
+ [CLOUDABI_ETXTBSY] = ETXTBSY,
+ [CLOUDABI_EXDEV] = EXDEV,
+ [CLOUDABI_ENOTCAPABLE] = ENOTCAPABLE,
+};
+#endif
+
+int
+sysdecode_abi_to_freebsd_errno(enum sysdecode_abi abi, int error)
+{
+
+ switch (abi) {
+ case SYSDECODE_ABI_FREEBSD:
+ case SYSDECODE_ABI_FREEBSD32:
+ return (error);
+#if defined(__i386__) || defined(__amd64__)
+ case SYSDECODE_ABI_LINUX:
+ case SYSDECODE_ABI_LINUX32: {
+ unsigned int i;
+
+ /*
+ * This is imprecise since it returns the first
+ * matching errno.
+ */
+ for (i = 0; i < nitems(bsd_to_linux_errno); i++) {
+ if (error == bsd_to_linux_errno[i])
+ return (i);
+ }
+ break;
+ }
+#endif
+#if defined(__aarch64__) || defined(__amd64__)
+ case SYSDECODE_ABI_CLOUDABI64:
+ if (error >= 0 &&
+ (unsigned int)error < nitems(cloudabi_errno_table))
+ return (cloudabi_errno_table[error]);
+ break;
+#endif
+ default:
+ break;
+ }
+ return (INT_MAX);
+}
+
+int
+sysdecode_freebsd_to_abi_errno(enum sysdecode_abi abi, int error)
+{
+
+ switch (abi) {
+ case SYSDECODE_ABI_FREEBSD:
+ case SYSDECODE_ABI_FREEBSD32:
+ return (error);
+#if defined(__i386__) || defined(__amd64__)
+ case SYSDECODE_ABI_LINUX:
+ case SYSDECODE_ABI_LINUX32:
+ if (error >= 0 && error <= ELAST)
+ return (bsd_to_linux_errno[error]);
+ break;
+#endif
+#if defined(__aarch64__) || defined(__amd64__)
+ case SYSDECODE_ABI_CLOUDABI64: {
+ unsigned int i;
+
+ for (i = 0; i < nitems(cloudabi_errno_table); i++) {
+ if (error == cloudabi_errno_table[i])
+ return (i);
+ }
+ break;
+ }
+#endif
+ default:
+ break;
+ }
+ return (INT_MAX);
+}
+
diff --git a/lib/libsysdecode/sysdecode.3 b/lib/libsysdecode/sysdecode.3
index f058f59c60cf..ab7e972b2f93 100644
--- a/lib/libsysdecode/sysdecode.3
+++ b/lib/libsysdecode/sysdecode.3
@@ -64,6 +64,7 @@ Supported on aarch64 and amd64.
A placeholder for use when the ABI is not known.
.El
.Sh SEE ALSO
+.Xr sysdecode_abi_to_freebsd_errno 3 ,
.Xr sysdecode_ioctlname 3 ,
.Xr sysdecode_syscallnames 3 ,
.Xr sysdecode_utrace 3
diff --git a/lib/libsysdecode/sysdecode.h b/lib/libsysdecode/sysdecode.h
index fa00716826db..8a30206f66fb 100644
--- a/lib/libsysdecode/sysdecode.h
+++ b/lib/libsysdecode/sysdecode.h
@@ -38,6 +38,8 @@ enum sysdecode_abi {
SYSDECODE_ABI_CLOUDABI64
};
+int sysdecode_abi_to_freebsd_errno(enum sysdecode_abi _abi, int _error);
+int sysdecode_freebsd_to_abi_errno(enum sysdecode_abi _abi, int _error);
const char *sysdecode_ioctlname(unsigned long _val);
const char *sysdecode_syscallname(enum sysdecode_abi _abi, unsigned int _code);
int sysdecode_utrace(FILE *_fp, void *_buf, size_t _len);
diff --git a/lib/libsysdecode/sysdecode_abi_to_freebsd_errno.3 b/lib/libsysdecode/sysdecode_abi_to_freebsd_errno.3
new file mode 100644
index 000000000000..74826f8e20ce
--- /dev/null
+++ b/lib/libsysdecode/sysdecode_abi_to_freebsd_errno.3
@@ -0,0 +1,94 @@
+.\"
+.\" Copyright (c) 2016 John Baldwin <jhb@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd February 23, 2016
+.Dt sysdecode_abi_to_freebsd_errno 3
+.Os
+.Sh NAME
+.Nm sysdecode_abi_to_freebsd_errno ,
+.Nm sysdecode_freebsd_to_abi_errno
+.Nd translate error numbers between process ABIs
+.Sh LIBRARY
+.Lb libsysdecode
+.Sh SYNOPSIS
+.Ft int
+.Fn sysdecode_abi_to_freebsd_errno "enum sysdecode_abi abi" "int error"
+.Ft int
+.Fn sysdecode_freebsd_to_abi_errno "enum sysdecode_abi abi" "int error"
+.Sh DESCRIPTION
+The
+.Fn sysdecode_abi_to_freebsd_errno
+function returns the native
+.Xr errno 3
+value that corresponds to the error indicated by
+.Fa error
+for the process ABI
+.Fa abi .
+If
+.Fa error
+does not identify a valid error for
+.Fa abi ,
+.Dv INT_MAX
+is returned.
+.Pp
+The
+.Fn sysdecode_freebsd_to_abi_errno
+function the error value for the process ABI
+.Fa abi
+that corresponds to the native
+.Xr errno 3
+value
+.Fa error .
+If
+.Fa error
+does not identify a valid
+.Xr errno 3
+error,
+.Dv INT_MAX
+is returned.
+.Pp
+Note that the mappings between native
+.Xr errno 3
+values and errors for other ABIs are not exhaustive.
+If a mapping does not exist,
+these functions return
+.Dv INT_MAX .
+In addition, multiple error values in one ABI may map to a single
+error in another ABI.
+.Sh RETURN VALUES
+These functions return an error value on success or
+.Dv INT_MAX
+if
+.Fa error
+is not valid.
+.Pp
+For the list of supported ABIs,
+see
+.Xr sysdecode 3 .
+.Sh SEE ALSO
+.Xr sysdecode 3 ,
+.Xr sysdecode_syscallnames 3
diff --git a/lib/libsysdecode/sysdecode_syscallnames.3 b/lib/libsysdecode/sysdecode_syscallnames.3
index 1c75ab6e9d17..e920edb29c55 100644
--- a/lib/libsysdecode/sysdecode_syscallnames.3
+++ b/lib/libsysdecode/sysdecode_syscallnames.3
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 24, 2016
+.Dd January 30, 2016
.Dt sysdecode_syscallnames 3
.Os
.Sh NAME
@@ -64,4 +64,5 @@ or
.Fa ABI
is invalid .
.Sh SEE ALSO
-.Xr sysdecode 3
+.Xr sysdecode 3 ,
+.Xr sysdecode_abi_to_freebsd_errno 3