xref: /freebsd/contrib/openbsm/libbsm/bsm_errno.c (revision 7a0a89d2cb29ee2c383600fa59e42d714a6dcbcb)
17a0a89d2SRobert Watson /*-
27a0a89d2SRobert Watson  * Copyright (c) 2008 Apple Inc.
37a0a89d2SRobert Watson  * All rights reserved.
47a0a89d2SRobert Watson  *
57a0a89d2SRobert Watson  * Redistribution and use in source and binary forms, with or without
67a0a89d2SRobert Watson  * modification, are permitted provided that the following conditions
77a0a89d2SRobert Watson  * are met:
87a0a89d2SRobert Watson  * 1.  Redistributions of source code must retain the above copyright
97a0a89d2SRobert Watson  *     notice, this list of conditions and the following disclaimer.
107a0a89d2SRobert Watson  * 2.  Redistributions in binary form must reproduce the above copyright
117a0a89d2SRobert Watson  *     notice, this list of conditions and the following disclaimer in the
127a0a89d2SRobert Watson  *     documentation and/or other materials provided with the distribution.
137a0a89d2SRobert Watson  * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
147a0a89d2SRobert Watson  *     its contributors may be used to endorse or promote products derived
157a0a89d2SRobert Watson  *     from this software without specific prior written permission.
167a0a89d2SRobert Watson  *
177a0a89d2SRobert Watson  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
187a0a89d2SRobert Watson  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
197a0a89d2SRobert Watson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
207a0a89d2SRobert Watson  * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
217a0a89d2SRobert Watson  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
227a0a89d2SRobert Watson  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
237a0a89d2SRobert Watson  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
247a0a89d2SRobert Watson  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
257a0a89d2SRobert Watson  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
267a0a89d2SRobert Watson  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
277a0a89d2SRobert Watson  * POSSIBILITY OF SUCH DAMAGE.
287a0a89d2SRobert Watson  *
297a0a89d2SRobert Watson  * $P4: //depot/projects/trustedbsd/openbsm/libbsm/bsm_errno.c#12 $
307a0a89d2SRobert Watson  */
317a0a89d2SRobert Watson 
327a0a89d2SRobert Watson #include <sys/types.h>
337a0a89d2SRobert Watson 
347a0a89d2SRobert Watson #include <config/config.h>
357a0a89d2SRobert Watson 
367a0a89d2SRobert Watson #include <bsm/audit_errno.h>
377a0a89d2SRobert Watson #include <bsm/libbsm.h>
387a0a89d2SRobert Watson 
397a0a89d2SRobert Watson #include <errno.h>
407a0a89d2SRobert Watson #include <string.h>
417a0a89d2SRobert Watson 
427a0a89d2SRobert Watson /*
437a0a89d2SRobert Watson  * Different operating systems use different numeric constants for different
447a0a89d2SRobert Watson  * error numbers, and sometimes error numbers don't exist in more than one
457a0a89d2SRobert Watson  * operating system.  These routines convert between BSM and local error
467a0a89d2SRobert Watson  * number spaces, subject to the above realities.  BSM error numbers are
477a0a89d2SRobert Watson  * stored in a single 8-bit character, so don't have a byte order.
487a0a89d2SRobert Watson  */
497a0a89d2SRobert Watson 
507a0a89d2SRobert Watson struct bsm_errors {
517a0a89d2SRobert Watson 	int		 be_bsm_error;
527a0a89d2SRobert Watson 	int		 be_os_error;
537a0a89d2SRobert Watson 	const char	*be_strerror;
547a0a89d2SRobert Watson };
557a0a89d2SRobert Watson 
567a0a89d2SRobert Watson #define	ERRNO_NO_LOCAL_MAPPING	-600
577a0a89d2SRobert Watson 
587a0a89d2SRobert Watson /*
597a0a89d2SRobert Watson  * Mapping table -- please maintain in numeric sorted order with respect to
607a0a89d2SRobert Watson  * the BSM constant.  Today we do a linear lookup, but could switch to a
617a0a89d2SRobert Watson  * binary search if it makes sense.  We only ifdef errors that aren't
627a0a89d2SRobert Watson  * generally available, but it does make the table a lot more ugly.
637a0a89d2SRobert Watson  *
647a0a89d2SRobert Watson  * XXXRW: It would be nice to have a similar ordered table mapping to BSM
657a0a89d2SRobert Watson  * constant from local constant, but the order of local constants varies by
667a0a89d2SRobert Watson  * OS.  Really we need to build that table at compile-time but don't do that
677a0a89d2SRobert Watson  * yet.
687a0a89d2SRobert Watson  *
697a0a89d2SRobert Watson  * XXXRW: We currently embed English-language error strings here, but should
707a0a89d2SRobert Watson  * support catalogues; these are only used if the OS doesn't have an error
717a0a89d2SRobert Watson  * string using strerror(3).
727a0a89d2SRobert Watson  */
737a0a89d2SRobert Watson static const struct bsm_errors bsm_errors[] = {
747a0a89d2SRobert Watson 	{ BSM_ESUCCESS, 0, "Success" },
757a0a89d2SRobert Watson 	{ BSM_EPERM, EPERM, "Operation not permitted" },
767a0a89d2SRobert Watson 	{ BSM_ENOENT, ENOENT, "No such file or directory" },
777a0a89d2SRobert Watson 	{ BSM_ESRCH, ESRCH, "No such process" },
787a0a89d2SRobert Watson 	{ BSM_EINTR, EINTR, "Interrupted system call" },
797a0a89d2SRobert Watson 	{ BSM_EIO, EIO, "Input/output error" },
807a0a89d2SRobert Watson 	{ BSM_ENXIO, ENXIO, "Device not configured" },
817a0a89d2SRobert Watson 	{ BSM_E2BIG, E2BIG, "Argument list too long" },
827a0a89d2SRobert Watson 	{ BSM_ENOEXEC, ENOEXEC, "Exec format error" },
837a0a89d2SRobert Watson 	{ BSM_EBADF, EBADF, "BAd file descriptor" },
847a0a89d2SRobert Watson 	{ BSM_ECHILD, ECHILD, "No child processes" },
857a0a89d2SRobert Watson 	{ BSM_EAGAIN, EAGAIN, "Resource temporarily unavailable" },
867a0a89d2SRobert Watson 	{ BSM_ENOMEM, ENOMEM, "Cannot allocate memory" },
877a0a89d2SRobert Watson 	{ BSM_EACCES, EACCES, "Permission denied" },
887a0a89d2SRobert Watson 	{ BSM_EFAULT, EFAULT, "Bad address" },
897a0a89d2SRobert Watson 	{ BSM_ENOTBLK, ENOTBLK, "Block device required" },
907a0a89d2SRobert Watson 	{ BSM_EBUSY, EBUSY, "Device busy" },
917a0a89d2SRobert Watson 	{ BSM_EEXIST, EEXIST, "File exists" },
927a0a89d2SRobert Watson 	{ BSM_EXDEV, EXDEV, "Cross-device link" },
937a0a89d2SRobert Watson 	{ BSM_ENODEV, ENODEV, "Operation not supported by device" },
947a0a89d2SRobert Watson 	{ BSM_ENOTDIR, ENOTDIR, "Not a directory" },
957a0a89d2SRobert Watson 	{ BSM_EISDIR, EISDIR, "Is a directory" },
967a0a89d2SRobert Watson 	{ BSM_EINVAL, EINVAL, "Invalid argument" },
977a0a89d2SRobert Watson 	{ BSM_ENFILE, ENFILE, "Too many open files in system" },
987a0a89d2SRobert Watson 	{ BSM_EMFILE, EMFILE, "Too many open files" },
997a0a89d2SRobert Watson 	{ BSM_ENOTTY, ENOTTY, "Inappropriate ioctl for device" },
1007a0a89d2SRobert Watson 	{ BSM_ETXTBSY, ETXTBSY, "Text file busy" },
1017a0a89d2SRobert Watson 	{ BSM_EFBIG, EFBIG, "File too large" },
1027a0a89d2SRobert Watson 	{ BSM_ENOSPC, ENOSPC, "No space left on device" },
1037a0a89d2SRobert Watson 	{ BSM_ESPIPE, ESPIPE, "Illegal seek" },
1047a0a89d2SRobert Watson 	{ BSM_EROFS, EROFS, "Read-only file system" },
1057a0a89d2SRobert Watson 	{ BSM_EMLINK, EMLINK, "Too many links" },
1067a0a89d2SRobert Watson 	{ BSM_EPIPE, EPIPE, "Broken pipe" },
1077a0a89d2SRobert Watson 	{ BSM_EDOM, EDOM, "Numerical argument out of domain" },
1087a0a89d2SRobert Watson 	{ BSM_ERANGE, ERANGE, "Result too large" },
1097a0a89d2SRobert Watson 	{ BSM_ENOMSG, ENOMSG, "No message of desired type" },
1107a0a89d2SRobert Watson 	{ BSM_EIDRM, EIDRM, "Identifier removed" },
1117a0a89d2SRobert Watson 	{ BSM_ECHRNG,
1127a0a89d2SRobert Watson #ifdef ECHRNG
1137a0a89d2SRobert Watson 	ECHRNG,
1147a0a89d2SRobert Watson #else
1157a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
1167a0a89d2SRobert Watson #endif
1177a0a89d2SRobert Watson 	"Channel number out of range" },
1187a0a89d2SRobert Watson 	{ BSM_EL2NSYNC,
1197a0a89d2SRobert Watson #ifdef EL2NSYNC
1207a0a89d2SRobert Watson 	EL2NSYNC,
1217a0a89d2SRobert Watson #else
1227a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
1237a0a89d2SRobert Watson #endif
1247a0a89d2SRobert Watson 	"Level 2 not synchronized" },
1257a0a89d2SRobert Watson 	{ BSM_EL3HLT,
1267a0a89d2SRobert Watson #ifdef EL3HLT
1277a0a89d2SRobert Watson 	EL3HLT,
1287a0a89d2SRobert Watson #else
1297a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
1307a0a89d2SRobert Watson #endif
1317a0a89d2SRobert Watson 	"Level 3 halted" },
1327a0a89d2SRobert Watson 	{ BSM_EL3RST,
1337a0a89d2SRobert Watson #ifdef EL3RST
1347a0a89d2SRobert Watson 	EL3RST,
1357a0a89d2SRobert Watson #else
1367a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
1377a0a89d2SRobert Watson #endif
1387a0a89d2SRobert Watson 	"Level 3 reset" },
1397a0a89d2SRobert Watson 	{ BSM_ELNRNG,
1407a0a89d2SRobert Watson #ifdef ELNRNG
1417a0a89d2SRobert Watson 	ELNRNG,
1427a0a89d2SRobert Watson #else
1437a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
1447a0a89d2SRobert Watson #endif
1457a0a89d2SRobert Watson 	"Link number out of range" },
1467a0a89d2SRobert Watson 	{ BSM_EUNATCH,
1477a0a89d2SRobert Watson #ifdef EUNATCH
1487a0a89d2SRobert Watson 	EUNATCH,
1497a0a89d2SRobert Watson #else
1507a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
1517a0a89d2SRobert Watson #endif
1527a0a89d2SRobert Watson 	"Protocol driver not attached" },
1537a0a89d2SRobert Watson 	{ BSM_ENOCSI,
1547a0a89d2SRobert Watson #ifdef ENOCSI
1557a0a89d2SRobert Watson 	ENOCSI,
1567a0a89d2SRobert Watson #else
1577a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
1587a0a89d2SRobert Watson #endif
1597a0a89d2SRobert Watson 	"No CSI structure available" },
1607a0a89d2SRobert Watson 	{ BSM_EL2HLT,
1617a0a89d2SRobert Watson #ifdef EL2HLT
1627a0a89d2SRobert Watson 	EL2HLT,
1637a0a89d2SRobert Watson #else
1647a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
1657a0a89d2SRobert Watson #endif
1667a0a89d2SRobert Watson 	"Level 2 halted" },
1677a0a89d2SRobert Watson 	{ BSM_EDEADLK, EDEADLK, "Resource deadlock avoided" },
1687a0a89d2SRobert Watson 	{ BSM_ENOLCK, ENOLCK, "No locks available" },
1697a0a89d2SRobert Watson 	{ BSM_ECANCELED, ECANCELED, "Operation canceled" },
1707a0a89d2SRobert Watson 	{ BSM_ENOTSUP, ENOTSUP, "Operation not supported" },
1717a0a89d2SRobert Watson 	{ BSM_EDQUOT, EDQUOT, "Disc quota exceeded" },
1727a0a89d2SRobert Watson 	{ BSM_EBADE,
1737a0a89d2SRobert Watson #ifdef EBADE
1747a0a89d2SRobert Watson 	EBADE,
1757a0a89d2SRobert Watson #else
1767a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
1777a0a89d2SRobert Watson #endif
1787a0a89d2SRobert Watson 	"Invalid exchange" },
1797a0a89d2SRobert Watson 	{ BSM_EBADR,
1807a0a89d2SRobert Watson #ifdef EBADR
1817a0a89d2SRobert Watson 	EBADR,
1827a0a89d2SRobert Watson #else
1837a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
1847a0a89d2SRobert Watson #endif
1857a0a89d2SRobert Watson 	"Invalid request descriptor" },
1867a0a89d2SRobert Watson 	{ BSM_EXFULL,
1877a0a89d2SRobert Watson #ifdef EXFULL
1887a0a89d2SRobert Watson 	EXFULL,
1897a0a89d2SRobert Watson #else
1907a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
1917a0a89d2SRobert Watson #endif
1927a0a89d2SRobert Watson 	"Exchange full" },
1937a0a89d2SRobert Watson 	{ BSM_ENOANO,
1947a0a89d2SRobert Watson #ifdef ENOANO
1957a0a89d2SRobert Watson 	ENOANO,
1967a0a89d2SRobert Watson #else
1977a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
1987a0a89d2SRobert Watson #endif
1997a0a89d2SRobert Watson 	"No anode" },
2007a0a89d2SRobert Watson 	{ BSM_EBADRQC,
2017a0a89d2SRobert Watson #ifdef EBADRQC
2027a0a89d2SRobert Watson 	EBADRQC,
2037a0a89d2SRobert Watson #else
2047a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
2057a0a89d2SRobert Watson #endif
2067a0a89d2SRobert Watson 	"Invalid request descriptor" },
2077a0a89d2SRobert Watson 	{ BSM_EBADSLT,
2087a0a89d2SRobert Watson #ifdef EBADSLT
2097a0a89d2SRobert Watson 	EBADSLT,
2107a0a89d2SRobert Watson #else
2117a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
2127a0a89d2SRobert Watson #endif
2137a0a89d2SRobert Watson 	"Invalid slot" },
2147a0a89d2SRobert Watson 	{ BSM_EDEADLOCK,
2157a0a89d2SRobert Watson #ifdef EDEADLOCK
2167a0a89d2SRobert Watson 	EDEADLOCK,
2177a0a89d2SRobert Watson #else
2187a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
2197a0a89d2SRobert Watson #endif
2207a0a89d2SRobert Watson 	"Resource deadlock avoided" },
2217a0a89d2SRobert Watson 	{ BSM_EBFONT,
2227a0a89d2SRobert Watson #ifdef EBFONT
2237a0a89d2SRobert Watson 	EBFONT,
2247a0a89d2SRobert Watson #else
2257a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
2267a0a89d2SRobert Watson #endif
2277a0a89d2SRobert Watson 	"Bad font file format" },
2287a0a89d2SRobert Watson 	{ BSM_EOWNERDEAD,
2297a0a89d2SRobert Watson #ifdef EOWNERDEAD
2307a0a89d2SRobert Watson 	EOWNERDEAD,
2317a0a89d2SRobert Watson #else
2327a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
2337a0a89d2SRobert Watson #endif
2347a0a89d2SRobert Watson 	"Process died with the lock" },
2357a0a89d2SRobert Watson 	{ BSM_ENOTRECOVERABLE,
2367a0a89d2SRobert Watson #ifdef ENOTRECOVERABLE
2377a0a89d2SRobert Watson 	ENOTRECOVERABLE,
2387a0a89d2SRobert Watson #else
2397a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
2407a0a89d2SRobert Watson #endif
2417a0a89d2SRobert Watson 	"Lock is not recoverable" },
2427a0a89d2SRobert Watson 	{ BSM_ENOSTR,
2437a0a89d2SRobert Watson #ifdef ENOSTR
2447a0a89d2SRobert Watson 	ENOSTR,
2457a0a89d2SRobert Watson #else
2467a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
2477a0a89d2SRobert Watson #endif
2487a0a89d2SRobert Watson 	"Device not a stream" },
2497a0a89d2SRobert Watson 	{ BSM_ENONET,
2507a0a89d2SRobert Watson #ifdef ENONET
2517a0a89d2SRobert Watson 	ENONET,
2527a0a89d2SRobert Watson #else
2537a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
2547a0a89d2SRobert Watson #endif
2557a0a89d2SRobert Watson 	"Machine is not on the network" },
2567a0a89d2SRobert Watson 	{ BSM_ENOPKG,
2577a0a89d2SRobert Watson #ifdef ENOPKG
2587a0a89d2SRobert Watson 	ENOPKG,
2597a0a89d2SRobert Watson #else
2607a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
2617a0a89d2SRobert Watson #endif
2627a0a89d2SRobert Watson 	"Package not installed" },
2637a0a89d2SRobert Watson 	{ BSM_EREMOTE, EREMOTE, "Too many levels of remote in path" },
2647a0a89d2SRobert Watson 	{ BSM_ENOLINK,
2657a0a89d2SRobert Watson #ifdef ENOLINK
2667a0a89d2SRobert Watson 	ENOLINK,
2677a0a89d2SRobert Watson #else
2687a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
2697a0a89d2SRobert Watson #endif
2707a0a89d2SRobert Watson 	"Link has been severed" },
2717a0a89d2SRobert Watson 	{ BSM_EADV,
2727a0a89d2SRobert Watson #ifdef EADV
2737a0a89d2SRobert Watson 	EADV,
2747a0a89d2SRobert Watson #else
2757a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
2767a0a89d2SRobert Watson #endif
2777a0a89d2SRobert Watson 	"Advertise error" },
2787a0a89d2SRobert Watson 	{ BSM_ESRMNT,
2797a0a89d2SRobert Watson #ifdef ESRMNT
2807a0a89d2SRobert Watson 	ESRMNT,
2817a0a89d2SRobert Watson #else
2827a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
2837a0a89d2SRobert Watson #endif
2847a0a89d2SRobert Watson 	"srmount error" },
2857a0a89d2SRobert Watson 	{ BSM_ECOMM,
2867a0a89d2SRobert Watson #ifdef ECOMM
2877a0a89d2SRobert Watson 	ECOMM,
2887a0a89d2SRobert Watson #else
2897a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
2907a0a89d2SRobert Watson #endif
2917a0a89d2SRobert Watson 	"Communication error on send" },
2927a0a89d2SRobert Watson 	{ BSM_EPROTO,
2937a0a89d2SRobert Watson #ifdef EPROTO
2947a0a89d2SRobert Watson 	EPROTO,
2957a0a89d2SRobert Watson #else
2967a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
2977a0a89d2SRobert Watson #endif
2987a0a89d2SRobert Watson 	"Protocol error" },
2997a0a89d2SRobert Watson 	{ BSM_ELOCKUNMAPPED,
3007a0a89d2SRobert Watson #ifdef ELOCKUNMAPPED
3017a0a89d2SRobert Watson 	ELOCKUNMAPPED,
3027a0a89d2SRobert Watson #else
3037a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
3047a0a89d2SRobert Watson #endif
3057a0a89d2SRobert Watson 	"Locked lock was unmapped" },
3067a0a89d2SRobert Watson 	{ BSM_ENOTACTIVE,
3077a0a89d2SRobert Watson #ifdef ENOTACTIVE
3087a0a89d2SRobert Watson 	ENOTACTIVE,
3097a0a89d2SRobert Watson #else
3107a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
3117a0a89d2SRobert Watson #endif
3127a0a89d2SRobert Watson 	"Facility is not active" },
3137a0a89d2SRobert Watson 	{ BSM_EMULTIHOP,
3147a0a89d2SRobert Watson #ifdef EMULTIHOP
3157a0a89d2SRobert Watson 	EMULTIHOP,
3167a0a89d2SRobert Watson #else
3177a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
3187a0a89d2SRobert Watson #endif
3197a0a89d2SRobert Watson 	"Multihop attempted" },
3207a0a89d2SRobert Watson 	{ BSM_EBADMSG,
3217a0a89d2SRobert Watson #ifdef EBADMSG
3227a0a89d2SRobert Watson 	EBADMSG,
3237a0a89d2SRobert Watson #else
3247a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
3257a0a89d2SRobert Watson #endif
3267a0a89d2SRobert Watson 	"Bad message" },
3277a0a89d2SRobert Watson 	{ BSM_ENAMETOOLONG, ENAMETOOLONG, "File name too long" },
3287a0a89d2SRobert Watson 	{ BSM_EOVERFLOW, EOVERFLOW, "Value too large to be stored in data type" },
3297a0a89d2SRobert Watson 	{ BSM_ENOTUNIQ,
3307a0a89d2SRobert Watson #ifdef ENOTUNIQ
3317a0a89d2SRobert Watson 	ENOTUNIQ,
3327a0a89d2SRobert Watson #else
3337a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
3347a0a89d2SRobert Watson #endif
3357a0a89d2SRobert Watson 	"Given log name not unique" },
3367a0a89d2SRobert Watson 	{ BSM_EBADFD,
3377a0a89d2SRobert Watson #ifdef EBADFD
3387a0a89d2SRobert Watson 	EBADFD,
3397a0a89d2SRobert Watson #else
3407a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
3417a0a89d2SRobert Watson #endif
3427a0a89d2SRobert Watson 	"Given f.d. invalid for this operation" },
3437a0a89d2SRobert Watson 	{ BSM_EREMCHG,
3447a0a89d2SRobert Watson #ifdef EREMCHG
3457a0a89d2SRobert Watson 	EREMCHG,
3467a0a89d2SRobert Watson #else
3477a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
3487a0a89d2SRobert Watson #endif
3497a0a89d2SRobert Watson 	"Remote address changed" },
3507a0a89d2SRobert Watson 	{ BSM_ELIBACC,
3517a0a89d2SRobert Watson #ifdef ELIBACC
3527a0a89d2SRobert Watson 	ELIBACC,
3537a0a89d2SRobert Watson #else
3547a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
3557a0a89d2SRobert Watson #endif
3567a0a89d2SRobert Watson 	"Can't access a needed shared lib" },
3577a0a89d2SRobert Watson 	{ BSM_ELIBBAD,
3587a0a89d2SRobert Watson #ifdef ELIBBAD
3597a0a89d2SRobert Watson 	ELIBBAD,
3607a0a89d2SRobert Watson #else
3617a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
3627a0a89d2SRobert Watson #endif
3637a0a89d2SRobert Watson 	"Accessing a corrupted shared lib" },
3647a0a89d2SRobert Watson 	{ BSM_ELIBSCN,
3657a0a89d2SRobert Watson #ifdef ELIBSCN
3667a0a89d2SRobert Watson 	ELIBSCN,
3677a0a89d2SRobert Watson #else
3687a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
3697a0a89d2SRobert Watson #endif
3707a0a89d2SRobert Watson 	".lib section in a.out corrupted" },
3717a0a89d2SRobert Watson 	{ BSM_ELIBMAX,
3727a0a89d2SRobert Watson #ifdef ELIBMAX
3737a0a89d2SRobert Watson 	ELIBMAX,
3747a0a89d2SRobert Watson #else
3757a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
3767a0a89d2SRobert Watson #endif
3777a0a89d2SRobert Watson 	"Attempting to link in too many libs" },
3787a0a89d2SRobert Watson 	{ BSM_ELIBEXEC,
3797a0a89d2SRobert Watson #ifdef ELIBEXEC
3807a0a89d2SRobert Watson 	ELIBEXEC,
3817a0a89d2SRobert Watson #else
3827a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
3837a0a89d2SRobert Watson #endif
3847a0a89d2SRobert Watson 	"Attempting to exec a shared library" },
3857a0a89d2SRobert Watson 	{ BSM_EILSEQ, EILSEQ, "Illegal byte sequence" },
3867a0a89d2SRobert Watson 	{ BSM_ENOSYS, ENOSYS, "Function not implemented" },
3877a0a89d2SRobert Watson 	{ BSM_ELOOP, ELOOP, "Too many levels of symbolic links" },
3887a0a89d2SRobert Watson 	{ BSM_ERESTART,
3897a0a89d2SRobert Watson #ifdef ERESTART
3907a0a89d2SRobert Watson 	ERESTART,
3917a0a89d2SRobert Watson #else
3927a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
3937a0a89d2SRobert Watson #endif
3947a0a89d2SRobert Watson 	"Restart syscall" },
3957a0a89d2SRobert Watson 	{ BSM_ESTRPIPE,
3967a0a89d2SRobert Watson #ifdef ESTRPIPE
3977a0a89d2SRobert Watson 	ESTRPIPE,
3987a0a89d2SRobert Watson #else
3997a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
4007a0a89d2SRobert Watson #endif
4017a0a89d2SRobert Watson 	"If pipe/FIFO, don't sleep in stream head" },
4027a0a89d2SRobert Watson 	{ BSM_ENOTEMPTY, ENOTEMPTY, "Directory not empty" },
4037a0a89d2SRobert Watson 	{ BSM_EUSERS, EUSERS, "Too many users" },
4047a0a89d2SRobert Watson 	{ BSM_ENOTSOCK, ENOTSOCK, "Socket operation on non-socket" },
4057a0a89d2SRobert Watson 	{ BSM_EDESTADDRREQ, EDESTADDRREQ, "Destination address required" },
4067a0a89d2SRobert Watson 	{ BSM_EMSGSIZE, EMSGSIZE, "Message too long" },
4077a0a89d2SRobert Watson 	{ BSM_EPROTOTYPE, EPROTOTYPE, "Protocol wrong type for socket" },
4087a0a89d2SRobert Watson 	{ BSM_ENOPROTOOPT, ENOPROTOOPT, "Protocol not available" },
4097a0a89d2SRobert Watson 	{ BSM_EPROTONOSUPPORT, EPROTONOSUPPORT, "Protocol not supported" },
4107a0a89d2SRobert Watson 	{ BSM_ESOCKTNOSUPPORT, ESOCKTNOSUPPORT, "Socket type not supported" },
4117a0a89d2SRobert Watson 	{ BSM_EOPNOTSUPP, EOPNOTSUPP, "Operation not supported" },
4127a0a89d2SRobert Watson 	{ BSM_EPFNOSUPPORT, EPFNOSUPPORT, "Protocol family not supported" },
4137a0a89d2SRobert Watson 	{ BSM_EAFNOSUPPORT, EAFNOSUPPORT, "Address family not supported by protocol family" },
4147a0a89d2SRobert Watson 	{ BSM_EADDRINUSE, EADDRINUSE, "Address already in use" },
4157a0a89d2SRobert Watson 	{ BSM_EADDRNOTAVAIL, EADDRNOTAVAIL, "Can't assign requested address" },
4167a0a89d2SRobert Watson 	{ BSM_ENETDOWN, ENETDOWN, "Network is down" },
4177a0a89d2SRobert Watson 	{ BSM_ENETRESET, ENETRESET, "Network dropped connection on reset" },
4187a0a89d2SRobert Watson 	{ BSM_ECONNABORTED, ECONNABORTED, "Software caused connection abort" },
4197a0a89d2SRobert Watson 	{ BSM_ECONNRESET, ECONNRESET, "Connection reset by peer" },
4207a0a89d2SRobert Watson 	{ BSM_ENOBUFS, ENOBUFS, "No buffer space available" },
4217a0a89d2SRobert Watson 	{ BSM_EISCONN, EISCONN, "Socket is already connected" },
4227a0a89d2SRobert Watson 	{ BSM_ENOTCONN, ENOTCONN, "Socket is not connected" },
4237a0a89d2SRobert Watson 	{ BSM_ESHUTDOWN, ESHUTDOWN, "Can't send after socket shutdown" },
4247a0a89d2SRobert Watson 	{ BSM_ETOOMANYREFS, ETOOMANYREFS, "Too many references: can't splice" },
4257a0a89d2SRobert Watson 	{ BSM_ETIMEDOUT, ETIMEDOUT, "Operation timed out" },
4267a0a89d2SRobert Watson 	{ BSM_ECONNREFUSED, ECONNREFUSED, "Connection refused" },
4277a0a89d2SRobert Watson 	{ BSM_EHOSTDOWN, EHOSTDOWN, "Host is down" },
4287a0a89d2SRobert Watson 	{ BSM_EHOSTUNREACH, EHOSTUNREACH, "No route to host" },
4297a0a89d2SRobert Watson 	{ BSM_EALREADY, EALREADY, "Operation already in progress" },
4307a0a89d2SRobert Watson 	{ BSM_EINPROGRESS, EINPROGRESS, "Operation now in progress" },
4317a0a89d2SRobert Watson 	{ BSM_ESTALE, ESTALE, "Stale NFS file handle" },
4327a0a89d2SRobert Watson 	{ BSM_EPWROFF,
4337a0a89d2SRobert Watson #ifdef EPWROFF
4347a0a89d2SRobert Watson 	EPWROFF,
4357a0a89d2SRobert Watson #else
4367a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
4377a0a89d2SRobert Watson #endif
4387a0a89d2SRobert Watson 	"Device power is off" },
4397a0a89d2SRobert Watson 	{ BSM_EDEVERR,
4407a0a89d2SRobert Watson #ifdef EDEVERR
4417a0a89d2SRobert Watson 	EDEVERR,
4427a0a89d2SRobert Watson #else
4437a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
4447a0a89d2SRobert Watson #endif
4457a0a89d2SRobert Watson 	"Device error" },
4467a0a89d2SRobert Watson 	{ BSM_EBADEXEC,
4477a0a89d2SRobert Watson #ifdef EBADEXEC
4487a0a89d2SRobert Watson 	EBADEXEC,
4497a0a89d2SRobert Watson #else
4507a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
4517a0a89d2SRobert Watson #endif
4527a0a89d2SRobert Watson 	"Bad executable" },
4537a0a89d2SRobert Watson 	{ BSM_EBADARCH,
4547a0a89d2SRobert Watson #ifdef EBADARCH
4557a0a89d2SRobert Watson 	EBADARCH,
4567a0a89d2SRobert Watson #else
4577a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
4587a0a89d2SRobert Watson #endif
4597a0a89d2SRobert Watson 	"Bad CPU type in executable" },
4607a0a89d2SRobert Watson 	{ BSM_ESHLIBVERS,
4617a0a89d2SRobert Watson #ifdef ESHLIBVERS
4627a0a89d2SRobert Watson 	ESHLIBVERS,
4637a0a89d2SRobert Watson #else
4647a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
4657a0a89d2SRobert Watson #endif
4667a0a89d2SRobert Watson 	"Shared library version mismatch" },
4677a0a89d2SRobert Watson 	{ BSM_EBADMACHO,
4687a0a89d2SRobert Watson #ifdef EBADMACHO
4697a0a89d2SRobert Watson 	EBADMACHO,
4707a0a89d2SRobert Watson #else
4717a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
4727a0a89d2SRobert Watson #endif
4737a0a89d2SRobert Watson 	"Malfored Macho file" },
4747a0a89d2SRobert Watson 	{ BSM_EPOLICY,
4757a0a89d2SRobert Watson #ifdef EPOLICY
4767a0a89d2SRobert Watson 	EPOLICY,
4777a0a89d2SRobert Watson #else
4787a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
4797a0a89d2SRobert Watson #endif
4807a0a89d2SRobert Watson 	"Operation failed by policy" },
4817a0a89d2SRobert Watson 	{ BSM_EDOTDOT,
4827a0a89d2SRobert Watson #ifdef EDOTDOT
4837a0a89d2SRobert Watson 	EDOTDOT,
4847a0a89d2SRobert Watson #else
4857a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
4867a0a89d2SRobert Watson #endif
4877a0a89d2SRobert Watson 	"RFS specific error" },
4887a0a89d2SRobert Watson 	{ BSM_EUCLEAN,
4897a0a89d2SRobert Watson #ifdef EUCLEAN
4907a0a89d2SRobert Watson 	EUCLEAN,
4917a0a89d2SRobert Watson #else
4927a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
4937a0a89d2SRobert Watson #endif
4947a0a89d2SRobert Watson 	"Structure needs cleaning" },
4957a0a89d2SRobert Watson 	{ BSM_ENOTNAM,
4967a0a89d2SRobert Watson #ifdef ENOTNAM
4977a0a89d2SRobert Watson 	ENOTNAM,
4987a0a89d2SRobert Watson #else
4997a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
5007a0a89d2SRobert Watson #endif
5017a0a89d2SRobert Watson 	"Not a XENIX named type file" },
5027a0a89d2SRobert Watson 	{ BSM_ENAVAIL,
5037a0a89d2SRobert Watson #ifdef ENAVAIL
5047a0a89d2SRobert Watson 	ENAVAIL,
5057a0a89d2SRobert Watson #else
5067a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
5077a0a89d2SRobert Watson #endif
5087a0a89d2SRobert Watson 	"No XENIX semaphores available" },
5097a0a89d2SRobert Watson 	{ BSM_EISNAM,
5107a0a89d2SRobert Watson #ifdef EISNAM
5117a0a89d2SRobert Watson 	EISNAM,
5127a0a89d2SRobert Watson #else
5137a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
5147a0a89d2SRobert Watson #endif
5157a0a89d2SRobert Watson 	"Is a named type file" },
5167a0a89d2SRobert Watson 	{ BSM_EREMOTEIO,
5177a0a89d2SRobert Watson #ifdef EREMOTEIO
5187a0a89d2SRobert Watson 	EREMOTEIO,
5197a0a89d2SRobert Watson #else
5207a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
5217a0a89d2SRobert Watson #endif
5227a0a89d2SRobert Watson 	"Remote I/O error" },
5237a0a89d2SRobert Watson 	{ BSM_ENOMEDIUM,
5247a0a89d2SRobert Watson #ifdef ENOMEDIUM
5257a0a89d2SRobert Watson 	ENOMEDIUM,
5267a0a89d2SRobert Watson #else
5277a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
5287a0a89d2SRobert Watson #endif
5297a0a89d2SRobert Watson 	"No medium found" },
5307a0a89d2SRobert Watson 	{ BSM_EMEDIUMTYPE,
5317a0a89d2SRobert Watson #ifdef EMEDIUMTYPE
5327a0a89d2SRobert Watson 	EMEDIUMTYPE,
5337a0a89d2SRobert Watson #else
5347a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
5357a0a89d2SRobert Watson #endif
5367a0a89d2SRobert Watson 	"Wrong medium type" },
5377a0a89d2SRobert Watson 	{ BSM_ENOKEY,
5387a0a89d2SRobert Watson #ifdef ENOKEY
5397a0a89d2SRobert Watson 	ENOKEY,
5407a0a89d2SRobert Watson #else
5417a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
5427a0a89d2SRobert Watson #endif
5437a0a89d2SRobert Watson 	"Required key not available" },
5447a0a89d2SRobert Watson 	{ BSM_EKEYEXPIRED,
5457a0a89d2SRobert Watson #ifdef EKEEXPIRED
5467a0a89d2SRobert Watson 	EKEYEXPIRED,
5477a0a89d2SRobert Watson #else
5487a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
5497a0a89d2SRobert Watson #endif
5507a0a89d2SRobert Watson 	"Key has expired" },
5517a0a89d2SRobert Watson 	{ BSM_EKEYREVOKED,
5527a0a89d2SRobert Watson #ifdef EKEYREVOKED
5537a0a89d2SRobert Watson 	EKEYREVOKED,
5547a0a89d2SRobert Watson #else
5557a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
5567a0a89d2SRobert Watson #endif
5577a0a89d2SRobert Watson 	"Key has been revoked" },
5587a0a89d2SRobert Watson 	{ BSM_EKEYREJECTED,
5597a0a89d2SRobert Watson #ifdef EKEREJECTED
5607a0a89d2SRobert Watson 	EKEYREJECTED,
5617a0a89d2SRobert Watson #else
5627a0a89d2SRobert Watson 	ERRNO_NO_LOCAL_MAPPING,
5637a0a89d2SRobert Watson #endif
5647a0a89d2SRobert Watson 	"Key was rejected by service" },
5657a0a89d2SRobert Watson };
5667a0a89d2SRobert Watson static const int bsm_errors_count = sizeof(bsm_errors) / sizeof(bsm_errors[0]);
5677a0a89d2SRobert Watson 
5687a0a89d2SRobert Watson static const struct bsm_errors *
5697a0a89d2SRobert Watson au_bsm_error_lookup_errno(int error)
5707a0a89d2SRobert Watson {
5717a0a89d2SRobert Watson 	int i;
5727a0a89d2SRobert Watson 
5737a0a89d2SRobert Watson 	if (error == ERRNO_NO_LOCAL_MAPPING)
5747a0a89d2SRobert Watson 		return (NULL);
5757a0a89d2SRobert Watson 	for (i = 0; i < bsm_errors_count; i++) {
5767a0a89d2SRobert Watson 		if (bsm_errors[i].be_os_error == error)
5777a0a89d2SRobert Watson 			return (&bsm_errors[i]);
5787a0a89d2SRobert Watson 	}
5797a0a89d2SRobert Watson 	return (NULL);
5807a0a89d2SRobert Watson }
5817a0a89d2SRobert Watson 
5827a0a89d2SRobert Watson static const struct bsm_errors *
5837a0a89d2SRobert Watson au_bsm_error_lookup_bsm(u_char bsm_error)
5847a0a89d2SRobert Watson {
5857a0a89d2SRobert Watson 	int i;
5867a0a89d2SRobert Watson 
5877a0a89d2SRobert Watson 	for (i = 0; i < bsm_errors_count; i++) {
5887a0a89d2SRobert Watson 		if (bsm_errors[i].be_bsm_error == bsm_error)
5897a0a89d2SRobert Watson 			return (&bsm_errors[i]);
5907a0a89d2SRobert Watson 	}
5917a0a89d2SRobert Watson 	return (NULL);
5927a0a89d2SRobert Watson }
5937a0a89d2SRobert Watson 
5947a0a89d2SRobert Watson /*
5957a0a89d2SRobert Watson  * Converstion from a BSM error to a local error number may fail if either
5967a0a89d2SRobert Watson  * OpenBSM doesn't recognize the error on the wire, or because there is no
5977a0a89d2SRobert Watson  * appropriate local mapping.  However, we don't allow conversion to BSM to
5987a0a89d2SRobert Watson  * fail, we just convert to BSM_UKNOWNERR.
5997a0a89d2SRobert Watson  */
6007a0a89d2SRobert Watson int
6017a0a89d2SRobert Watson au_bsm_to_errno(u_char bsm_error, int *errorp)
6027a0a89d2SRobert Watson {
6037a0a89d2SRobert Watson 	const struct bsm_errors *bsme;
6047a0a89d2SRobert Watson 
6057a0a89d2SRobert Watson 	bsme = au_bsm_error_lookup_bsm(bsm_error);
6067a0a89d2SRobert Watson 	if (bsme == NULL || bsme->be_os_error == ERRNO_NO_LOCAL_MAPPING)
6077a0a89d2SRobert Watson 		return (-1);
6087a0a89d2SRobert Watson 	*errorp = bsme->be_os_error;
6097a0a89d2SRobert Watson 	return (0);
6107a0a89d2SRobert Watson }
6117a0a89d2SRobert Watson 
6127a0a89d2SRobert Watson u_char
6137a0a89d2SRobert Watson au_errno_to_bsm(int error)
6147a0a89d2SRobert Watson {
6157a0a89d2SRobert Watson 	const struct bsm_errors *bsme;
6167a0a89d2SRobert Watson 
6177a0a89d2SRobert Watson 	/*
6187a0a89d2SRobert Watson 	 * We should never be passed this libbsm-internal constant, and
6197a0a89d2SRobert Watson 	 * because it is ambiguous we just return an error.
6207a0a89d2SRobert Watson 	 */
6217a0a89d2SRobert Watson 	if (error == ERRNO_NO_LOCAL_MAPPING)
6227a0a89d2SRobert Watson 		return (BSM_UNKNOWNERR);
6237a0a89d2SRobert Watson 	bsme = au_bsm_error_lookup_errno(error);
6247a0a89d2SRobert Watson 	if (bsme == NULL)
6257a0a89d2SRobert Watson 		return (BSM_UNKNOWNERR);
6267a0a89d2SRobert Watson 	return (bsme->be_bsm_error);
6277a0a89d2SRobert Watson }
6287a0a89d2SRobert Watson 
6297a0a89d2SRobert Watson #if !defined(KERNEL) && !defined(_KERNEL)
6307a0a89d2SRobert Watson const char *
6317a0a89d2SRobert Watson au_strerror(u_char bsm_error)
6327a0a89d2SRobert Watson {
6337a0a89d2SRobert Watson 	const struct bsm_errors *bsme;
6347a0a89d2SRobert Watson 
6357a0a89d2SRobert Watson 	bsme = au_bsm_error_lookup_bsm(bsm_error);
6367a0a89d2SRobert Watson 	if (bsme == NULL)
6377a0a89d2SRobert Watson 		return ("Unrecognized BSM error");
6387a0a89d2SRobert Watson 	if (bsme->be_os_error != ERRNO_NO_LOCAL_MAPPING)
6397a0a89d2SRobert Watson 		return (strerror(bsme->be_os_error));
6407a0a89d2SRobert Watson 	return (bsme->be_strerror);
6417a0a89d2SRobert Watson }
6427a0a89d2SRobert Watson #endif
643