Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
0002 
0003 /*
0004  * Copyright (C) 2013-2015 Alexei Starovoitov <ast@kernel.org>
0005  * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com>
0006  * Copyright (C) 2015 Huawei Inc.
0007  * Copyright (C) 2017 Nicira, Inc.
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 /* make sure libbpf doesn't use kernel-only integer typedefs */
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 }