xref: /illumos-gate/usr/src/lib/libc/port/gen/strerror.c (revision e4e529b2beb8a30e14beb0573c4a114275d157cc)
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