xref: /linux-6.15/tools/lib/bpf/str_error.c (revision 1633a83b)
11bc38b8fSAlexei Starovoitov // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
26d41907cSArnaldo Carvalho de Melo #undef _GNU_SOURCE
36d41907cSArnaldo Carvalho de Melo #include <string.h>
46d41907cSArnaldo Carvalho de Melo #include <stdio.h>
5548c2edeSAndrii Nakryiko #include <errno.h>
66d41907cSArnaldo Carvalho de Melo #include "str_error.h"
76d41907cSArnaldo Carvalho de Melo 
8*1633a83bSMykyta Yatsenko #ifndef ENOTSUPP
9*1633a83bSMykyta Yatsenko #define ENOTSUPP	524
10*1633a83bSMykyta Yatsenko #endif
11*1633a83bSMykyta Yatsenko 
121d1a3bcfSAndrii Nakryiko /* make sure libbpf doesn't use kernel-only integer typedefs */
131d1a3bcfSAndrii Nakryiko #pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64
141d1a3bcfSAndrii Nakryiko 
156d41907cSArnaldo Carvalho de Melo /*
166d41907cSArnaldo Carvalho de Melo  * Wrapper to allow for building in non-GNU systems such as Alpine Linux's musl
176d41907cSArnaldo Carvalho de Melo  * libc, while checking strerror_r() return to avoid having to check this in
186d41907cSArnaldo Carvalho de Melo  * all places calling it.
196d41907cSArnaldo Carvalho de Melo  */
2024d6a808SAndrey Ignatov char *libbpf_strerror_r(int err, char *dst, int len)
216d41907cSArnaldo Carvalho de Melo {
22d66f4366SAndrii Nakryiko 	int ret = strerror_r(err < 0 ? -err : err, dst, len);
23548c2edeSAndrii Nakryiko 	/* on glibc <2.13, ret == -1 and errno is set, if strerror_r() can't
24548c2edeSAndrii Nakryiko 	 * handle the error, on glibc >=2.13 *positive* (errno-like) error
25548c2edeSAndrii Nakryiko 	 * code is returned directly
26548c2edeSAndrii Nakryiko 	 */
27548c2edeSAndrii Nakryiko 	if (ret == -1)
28548c2edeSAndrii Nakryiko 		ret = errno;
29548c2edeSAndrii Nakryiko 	if (ret) {
30548c2edeSAndrii Nakryiko 		if (ret == EINVAL)
31548c2edeSAndrii Nakryiko 			/* strerror_r() doesn't recognize this specific error */
32548c2edeSAndrii Nakryiko 			snprintf(dst, len, "unknown error (%d)", err < 0 ? err : -err);
33548c2edeSAndrii Nakryiko 		else
346d41907cSArnaldo Carvalho de Melo 			snprintf(dst, len, "ERROR: strerror_r(%d)=%d", err, ret);
35548c2edeSAndrii Nakryiko 	}
366d41907cSArnaldo Carvalho de Melo 	return dst;
376d41907cSArnaldo Carvalho de Melo }
38*1633a83bSMykyta Yatsenko 
39*1633a83bSMykyta Yatsenko const char *errstr(int err)
40*1633a83bSMykyta Yatsenko {
41*1633a83bSMykyta Yatsenko 	static __thread char buf[12];
42*1633a83bSMykyta Yatsenko 
43*1633a83bSMykyta Yatsenko 	if (err > 0)
44*1633a83bSMykyta Yatsenko 		err = -err;
45*1633a83bSMykyta Yatsenko 
46*1633a83bSMykyta Yatsenko 	switch (err) {
47*1633a83bSMykyta Yatsenko 	case -E2BIG:		return "-E2BIG";
48*1633a83bSMykyta Yatsenko 	case -EACCES:		return "-EACCES";
49*1633a83bSMykyta Yatsenko 	case -EADDRINUSE:	return "-EADDRINUSE";
50*1633a83bSMykyta Yatsenko 	case -EADDRNOTAVAIL:	return "-EADDRNOTAVAIL";
51*1633a83bSMykyta Yatsenko 	case -EAGAIN:		return "-EAGAIN";
52*1633a83bSMykyta Yatsenko 	case -EALREADY:		return "-EALREADY";
53*1633a83bSMykyta Yatsenko 	case -EBADF:		return "-EBADF";
54*1633a83bSMykyta Yatsenko 	case -EBADFD:		return "-EBADFD";
55*1633a83bSMykyta Yatsenko 	case -EBUSY:		return "-EBUSY";
56*1633a83bSMykyta Yatsenko 	case -ECANCELED:	return "-ECANCELED";
57*1633a83bSMykyta Yatsenko 	case -ECHILD:		return "-ECHILD";
58*1633a83bSMykyta Yatsenko 	case -EDEADLK:		return "-EDEADLK";
59*1633a83bSMykyta Yatsenko 	case -EDOM:		return "-EDOM";
60*1633a83bSMykyta Yatsenko 	case -EEXIST:		return "-EEXIST";
61*1633a83bSMykyta Yatsenko 	case -EFAULT:		return "-EFAULT";
62*1633a83bSMykyta Yatsenko 	case -EFBIG:		return "-EFBIG";
63*1633a83bSMykyta Yatsenko 	case -EILSEQ:		return "-EILSEQ";
64*1633a83bSMykyta Yatsenko 	case -EINPROGRESS:	return "-EINPROGRESS";
65*1633a83bSMykyta Yatsenko 	case -EINTR:		return "-EINTR";
66*1633a83bSMykyta Yatsenko 	case -EINVAL:		return "-EINVAL";
67*1633a83bSMykyta Yatsenko 	case -EIO:		return "-EIO";
68*1633a83bSMykyta Yatsenko 	case -EISDIR:		return "-EISDIR";
69*1633a83bSMykyta Yatsenko 	case -ELOOP:		return "-ELOOP";
70*1633a83bSMykyta Yatsenko 	case -EMFILE:		return "-EMFILE";
71*1633a83bSMykyta Yatsenko 	case -EMLINK:		return "-EMLINK";
72*1633a83bSMykyta Yatsenko 	case -EMSGSIZE:		return "-EMSGSIZE";
73*1633a83bSMykyta Yatsenko 	case -ENAMETOOLONG:	return "-ENAMETOOLONG";
74*1633a83bSMykyta Yatsenko 	case -ENFILE:		return "-ENFILE";
75*1633a83bSMykyta Yatsenko 	case -ENODATA:		return "-ENODATA";
76*1633a83bSMykyta Yatsenko 	case -ENODEV:		return "-ENODEV";
77*1633a83bSMykyta Yatsenko 	case -ENOENT:		return "-ENOENT";
78*1633a83bSMykyta Yatsenko 	case -ENOEXEC:		return "-ENOEXEC";
79*1633a83bSMykyta Yatsenko 	case -ENOLINK:		return "-ENOLINK";
80*1633a83bSMykyta Yatsenko 	case -ENOMEM:		return "-ENOMEM";
81*1633a83bSMykyta Yatsenko 	case -ENOSPC:		return "-ENOSPC";
82*1633a83bSMykyta Yatsenko 	case -ENOTBLK:		return "-ENOTBLK";
83*1633a83bSMykyta Yatsenko 	case -ENOTDIR:		return "-ENOTDIR";
84*1633a83bSMykyta Yatsenko 	case -ENOTSUPP:		return "-ENOTSUPP";
85*1633a83bSMykyta Yatsenko 	case -ENOTTY:		return "-ENOTTY";
86*1633a83bSMykyta Yatsenko 	case -ENXIO:		return "-ENXIO";
87*1633a83bSMykyta Yatsenko 	case -EOPNOTSUPP:	return "-EOPNOTSUPP";
88*1633a83bSMykyta Yatsenko 	case -EOVERFLOW:	return "-EOVERFLOW";
89*1633a83bSMykyta Yatsenko 	case -EPERM:		return "-EPERM";
90*1633a83bSMykyta Yatsenko 	case -EPIPE:		return "-EPIPE";
91*1633a83bSMykyta Yatsenko 	case -EPROTO:		return "-EPROTO";
92*1633a83bSMykyta Yatsenko 	case -EPROTONOSUPPORT:	return "-EPROTONOSUPPORT";
93*1633a83bSMykyta Yatsenko 	case -ERANGE:		return "-ERANGE";
94*1633a83bSMykyta Yatsenko 	case -EROFS:		return "-EROFS";
95*1633a83bSMykyta Yatsenko 	case -ESPIPE:		return "-ESPIPE";
96*1633a83bSMykyta Yatsenko 	case -ESRCH:		return "-ESRCH";
97*1633a83bSMykyta Yatsenko 	case -ETXTBSY:		return "-ETXTBSY";
98*1633a83bSMykyta Yatsenko 	case -EUCLEAN:		return "-EUCLEAN";
99*1633a83bSMykyta Yatsenko 	case -EXDEV:		return "-EXDEV";
100*1633a83bSMykyta Yatsenko 	default:
101*1633a83bSMykyta Yatsenko 		snprintf(buf, sizeof(buf), "%d", err);
102*1633a83bSMykyta Yatsenko 		return buf;
103*1633a83bSMykyta Yatsenko 	}
104*1633a83bSMykyta Yatsenko }
105