1 /*
2  * Copyright (c) 2022 Meta
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <errno.h>
8 #include <string.h>
9 
10 #include <zephyr/sys/util.h>
11 
12 /*
13  * See scripts/build/gen_strerror_table.py
14  *
15  * #define sys_nerr N
16  * const char *const sys_errlist[sys_nerr];
17  * const uint8_t sys_errlen[sys_nerr];
18  */
19 #include "libc/minimal/strerror_table.h"
20 
21 /*
22  * See https://pubs.opengroup.org/onlinepubs/9699919799/functions/strerror.html
23  */
strerror(int errnum)24 char *strerror(int errnum)
25 {
26 	if (IS_ENABLED(CONFIG_MINIMAL_LIBC_STRING_ERROR_TABLE) &&
27 	    errnum >= 0 && errnum < sys_nerr) {
28 		return (char *)sys_errlist[errnum];
29 	}
30 
31 	return "";
32 }
33 
34 /*
35  * See
36  * https://pubs.opengroup.org/onlinepubs/9699919799/functions/strerror_r.html
37  */
strerror_r(int errnum,char * strerrbuf,size_t buflen)38 int strerror_r(int errnum, char *strerrbuf, size_t buflen)
39 {
40 	const char *msg;
41 	size_t msg_len;
42 
43 	if (errnum >= 0 && errnum < sys_nerr) {
44 		if (IS_ENABLED(CONFIG_MINIMAL_LIBC_STRING_ERROR_TABLE)) {
45 			msg = sys_errlist[errnum];
46 			msg_len = sys_errlen[errnum];
47 		} else {
48 			msg = "";
49 			msg_len = 1;
50 		}
51 
52 		if (buflen < msg_len) {
53 			return ERANGE;
54 		}
55 
56 		strncpy(strerrbuf, msg, msg_len);
57 	}
58 
59 	if (errnum < 0 || errnum >= sys_nerr) {
60 		return EINVAL;
61 	}
62 
63 	return 0;
64 }
65