1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 /* 27 * Copyright 2015 Joyent, Inc. 28 * Copyright 2025 Oxide Computer Company 29 */ 30 31 /* Copyright (c) 1988 AT&T */ 32 /* All Rights Reserved */ 33 34 #include "lint.h" 35 #include "_libc_gettext.h" 36 #include "syserr.h" 37 #include <string.h> 38 #include <sys/types.h> 39 #include <errno.h> 40 41 char * 42 strerror_l(int errnum, locale_t loc) 43 { 44 if (errnum < _sys_num_nerr && errnum >= 0) 45 return (_libc_gettext_l(&_sys_nerrs[_sys_nindex[errnum]], 46 loc)); 47 48 errno = EINVAL; 49 return (_libc_gettext_l("Unknown error", loc)); 50 } 51 52 char * 53 strerror(int errnum) 54 { 55 return (strerror_l(errnum, uselocale(NULL))); 56 } 57 58 /* 59 * A version of sterror() that always operates in the C locale. It returns NULL 60 * rather than the "Unknown error" string. 61 */ 62 const char * 63 strerrordesc_np(int errnum) 64 { 65 if (errnum < _sys_num_nerr && errnum >= 0) 66 return (&_sys_nerrs[_sys_nindex[errnum]]); 67 68 errno = EINVAL; 69 return (NULL); 70 } 71 72 const char * 73 strerrorname_np(int errnum) 74 { 75 if (errnum >= 0 && errnum < _sys_num_nerr && 76 _sys_err_names[errnum] != NULL) { 77 return (_sys_err_names[errnum]); 78 } 79 80 errno = EINVAL; 81 return (NULL); 82 } 83 84 /* 85 * Implemented strerror_r in Solaris 10 to comply with SUSv3 2001. 86 */ 87 int 88 strerror_r(int errnum, char *strerrbuf, size_t buflen) 89 { 90 char *buf; 91 int ret = 0; 92 93 if (errnum < _sys_num_nerr && errnum >= 0) { 94 buf = _libc_gettext((char *)&_sys_nerrs[_sys_nindex[errnum]]); 95 } else { 96 buf = _libc_gettext("Unknown error"); 97 ret = errno = EINVAL; 98 } 99 100 /* 101 * At compile time, there is no way to determine the max size of 102 * language-dependent error message. 103 */ 104 if (buflen < (strlen(buf) + 1)) { 105 ret = errno = ERANGE; 106 } else { 107 (void) strcpy(strerrbuf, buf); 108 } 109 110 return (ret); 111 } 112