0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #undef _GNU_SOURCE
0011 #include <stdio.h>
0012 #include <string.h>
0013
0014 #include "libbpf.h"
0015 #include "libbpf_internal.h"
0016
0017
0018 #pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64
0019
0020 #define ERRNO_OFFSET(e) ((e) - __LIBBPF_ERRNO__START)
0021 #define ERRCODE_OFFSET(c) ERRNO_OFFSET(LIBBPF_ERRNO__##c)
0022 #define NR_ERRNO (__LIBBPF_ERRNO__END - __LIBBPF_ERRNO__START)
0023
0024 static const char *libbpf_strerror_table[NR_ERRNO] = {
0025 [ERRCODE_OFFSET(LIBELF)] = "Something wrong in libelf",
0026 [ERRCODE_OFFSET(FORMAT)] = "BPF object format invalid",
0027 [ERRCODE_OFFSET(KVERSION)] = "'version' section incorrect or lost",
0028 [ERRCODE_OFFSET(ENDIAN)] = "Endian mismatch",
0029 [ERRCODE_OFFSET(INTERNAL)] = "Internal error in libbpf",
0030 [ERRCODE_OFFSET(RELOC)] = "Relocation failed",
0031 [ERRCODE_OFFSET(VERIFY)] = "Kernel verifier blocks program loading",
0032 [ERRCODE_OFFSET(PROG2BIG)] = "Program too big",
0033 [ERRCODE_OFFSET(KVER)] = "Incorrect kernel version",
0034 [ERRCODE_OFFSET(PROGTYPE)] = "Kernel doesn't support this program type",
0035 [ERRCODE_OFFSET(WRNGPID)] = "Wrong pid in netlink message",
0036 [ERRCODE_OFFSET(INVSEQ)] = "Invalid netlink sequence",
0037 [ERRCODE_OFFSET(NLPARSE)] = "Incorrect netlink message parsing",
0038 };
0039
0040 int libbpf_strerror(int err, char *buf, size_t size)
0041 {
0042 if (!buf || !size)
0043 return libbpf_err(-EINVAL);
0044
0045 err = err > 0 ? err : -err;
0046
0047 if (err < __LIBBPF_ERRNO__START) {
0048 int ret;
0049
0050 ret = strerror_r(err, buf, size);
0051 buf[size - 1] = '\0';
0052 return libbpf_err_errno(ret);
0053 }
0054
0055 if (err < __LIBBPF_ERRNO__END) {
0056 const char *msg;
0057
0058 msg = libbpf_strerror_table[ERRNO_OFFSET(err)];
0059 snprintf(buf, size, "%s", msg);
0060 buf[size - 1] = '\0';
0061 return 0;
0062 }
0063
0064 snprintf(buf, size, "Unknown libbpf error %d", err);
0065 buf[size - 1] = '\0';
0066 return libbpf_err(-ENOENT);
0067 }