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
81633a83bSMykyta Yatsenko #ifndef ENOTSUPP
91633a83bSMykyta Yatsenko #define ENOTSUPP 524
101633a83bSMykyta Yatsenko #endif
111633a83bSMykyta 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 */
libbpf_strerror_r(int err,char * dst,int len)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 }
381633a83bSMykyta Yatsenko
libbpf_errstr(int err)39*307ef667SIan Rogers const char *libbpf_errstr(int err)
401633a83bSMykyta Yatsenko {
411633a83bSMykyta Yatsenko static __thread char buf[12];
421633a83bSMykyta Yatsenko
431633a83bSMykyta Yatsenko if (err > 0)
441633a83bSMykyta Yatsenko err = -err;
451633a83bSMykyta Yatsenko
461633a83bSMykyta Yatsenko switch (err) {
471633a83bSMykyta Yatsenko case -E2BIG: return "-E2BIG";
481633a83bSMykyta Yatsenko case -EACCES: return "-EACCES";
491633a83bSMykyta Yatsenko case -EADDRINUSE: return "-EADDRINUSE";
501633a83bSMykyta Yatsenko case -EADDRNOTAVAIL: return "-EADDRNOTAVAIL";
511633a83bSMykyta Yatsenko case -EAGAIN: return "-EAGAIN";
521633a83bSMykyta Yatsenko case -EALREADY: return "-EALREADY";
531633a83bSMykyta Yatsenko case -EBADF: return "-EBADF";
541633a83bSMykyta Yatsenko case -EBADFD: return "-EBADFD";
551633a83bSMykyta Yatsenko case -EBUSY: return "-EBUSY";
561633a83bSMykyta Yatsenko case -ECANCELED: return "-ECANCELED";
571633a83bSMykyta Yatsenko case -ECHILD: return "-ECHILD";
581633a83bSMykyta Yatsenko case -EDEADLK: return "-EDEADLK";
591633a83bSMykyta Yatsenko case -EDOM: return "-EDOM";
601633a83bSMykyta Yatsenko case -EEXIST: return "-EEXIST";
611633a83bSMykyta Yatsenko case -EFAULT: return "-EFAULT";
621633a83bSMykyta Yatsenko case -EFBIG: return "-EFBIG";
631633a83bSMykyta Yatsenko case -EILSEQ: return "-EILSEQ";
641633a83bSMykyta Yatsenko case -EINPROGRESS: return "-EINPROGRESS";
651633a83bSMykyta Yatsenko case -EINTR: return "-EINTR";
661633a83bSMykyta Yatsenko case -EINVAL: return "-EINVAL";
671633a83bSMykyta Yatsenko case -EIO: return "-EIO";
681633a83bSMykyta Yatsenko case -EISDIR: return "-EISDIR";
691633a83bSMykyta Yatsenko case -ELOOP: return "-ELOOP";
701633a83bSMykyta Yatsenko case -EMFILE: return "-EMFILE";
711633a83bSMykyta Yatsenko case -EMLINK: return "-EMLINK";
721633a83bSMykyta Yatsenko case -EMSGSIZE: return "-EMSGSIZE";
731633a83bSMykyta Yatsenko case -ENAMETOOLONG: return "-ENAMETOOLONG";
741633a83bSMykyta Yatsenko case -ENFILE: return "-ENFILE";
751633a83bSMykyta Yatsenko case -ENODATA: return "-ENODATA";
761633a83bSMykyta Yatsenko case -ENODEV: return "-ENODEV";
771633a83bSMykyta Yatsenko case -ENOENT: return "-ENOENT";
781633a83bSMykyta Yatsenko case -ENOEXEC: return "-ENOEXEC";
791633a83bSMykyta Yatsenko case -ENOLINK: return "-ENOLINK";
801633a83bSMykyta Yatsenko case -ENOMEM: return "-ENOMEM";
811633a83bSMykyta Yatsenko case -ENOSPC: return "-ENOSPC";
821633a83bSMykyta Yatsenko case -ENOTBLK: return "-ENOTBLK";
831633a83bSMykyta Yatsenko case -ENOTDIR: return "-ENOTDIR";
841633a83bSMykyta Yatsenko case -ENOTSUPP: return "-ENOTSUPP";
851633a83bSMykyta Yatsenko case -ENOTTY: return "-ENOTTY";
861633a83bSMykyta Yatsenko case -ENXIO: return "-ENXIO";
871633a83bSMykyta Yatsenko case -EOPNOTSUPP: return "-EOPNOTSUPP";
881633a83bSMykyta Yatsenko case -EOVERFLOW: return "-EOVERFLOW";
891633a83bSMykyta Yatsenko case -EPERM: return "-EPERM";
901633a83bSMykyta Yatsenko case -EPIPE: return "-EPIPE";
911633a83bSMykyta Yatsenko case -EPROTO: return "-EPROTO";
921633a83bSMykyta Yatsenko case -EPROTONOSUPPORT: return "-EPROTONOSUPPORT";
931633a83bSMykyta Yatsenko case -ERANGE: return "-ERANGE";
941633a83bSMykyta Yatsenko case -EROFS: return "-EROFS";
951633a83bSMykyta Yatsenko case -ESPIPE: return "-ESPIPE";
961633a83bSMykyta Yatsenko case -ESRCH: return "-ESRCH";
971633a83bSMykyta Yatsenko case -ETXTBSY: return "-ETXTBSY";
981633a83bSMykyta Yatsenko case -EUCLEAN: return "-EUCLEAN";
991633a83bSMykyta Yatsenko case -EXDEV: return "-EXDEV";
1001633a83bSMykyta Yatsenko default:
1011633a83bSMykyta Yatsenko snprintf(buf, sizeof(buf), "%d", err);
1021633a83bSMykyta Yatsenko return buf;
1031633a83bSMykyta Yatsenko }
1041633a83bSMykyta Yatsenko }
105