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