-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tools: libbpf: move library error code into a separate file
libbpf_strerror() depends on XSI-compliant (POSIX) version of strerror_r(), which prevents us from using GNU-extensions in libbpf.c, like reallocarray() or dup3(). Move error printing code into a separate file to allow it to continue using POSIX strerror_r(). No functional changes. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
- Loading branch information
Jakub Kicinski
authored and
Daniel Borkmann
committed
Jul 11, 2018
1 parent
c840684
commit 8d13406
Showing
3 changed files
with
75 additions
and
49 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
libbpf-y := libbpf.o bpf.o nlattr.o btf.o | ||
libbpf-y := libbpf.o bpf.o nlattr.o btf.o libbpf_errno.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
// SPDX-License-Identifier: LGPL-2.1 | ||
|
||
/* | ||
* Copyright (C) 2013-2015 Alexei Starovoitov <ast@kernel.org> | ||
* Copyright (C) 2015 Wang Nan <wangnan0@huawei.com> | ||
* Copyright (C) 2015 Huawei Inc. | ||
* Copyright (C) 2017 Nicira, Inc. | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU Lesser General Public | ||
* License as published by the Free Software Foundation; | ||
* version 2.1 of the License (not later!) | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU Lesser General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Lesser General Public | ||
* License along with this program; if not, see <http://www.gnu.org/licenses> | ||
*/ | ||
|
||
#include <stdio.h> | ||
#include <string.h> | ||
|
||
#include "libbpf.h" | ||
|
||
#define ERRNO_OFFSET(e) ((e) - __LIBBPF_ERRNO__START) | ||
#define ERRCODE_OFFSET(c) ERRNO_OFFSET(LIBBPF_ERRNO__##c) | ||
#define NR_ERRNO (__LIBBPF_ERRNO__END - __LIBBPF_ERRNO__START) | ||
|
||
static const char *libbpf_strerror_table[NR_ERRNO] = { | ||
[ERRCODE_OFFSET(LIBELF)] = "Something wrong in libelf", | ||
[ERRCODE_OFFSET(FORMAT)] = "BPF object format invalid", | ||
[ERRCODE_OFFSET(KVERSION)] = "'version' section incorrect or lost", | ||
[ERRCODE_OFFSET(ENDIAN)] = "Endian mismatch", | ||
[ERRCODE_OFFSET(INTERNAL)] = "Internal error in libbpf", | ||
[ERRCODE_OFFSET(RELOC)] = "Relocation failed", | ||
[ERRCODE_OFFSET(VERIFY)] = "Kernel verifier blocks program loading", | ||
[ERRCODE_OFFSET(PROG2BIG)] = "Program too big", | ||
[ERRCODE_OFFSET(KVER)] = "Incorrect kernel version", | ||
[ERRCODE_OFFSET(PROGTYPE)] = "Kernel doesn't support this program type", | ||
[ERRCODE_OFFSET(WRNGPID)] = "Wrong pid in netlink message", | ||
[ERRCODE_OFFSET(INVSEQ)] = "Invalid netlink sequence", | ||
}; | ||
|
||
int libbpf_strerror(int err, char *buf, size_t size) | ||
{ | ||
if (!buf || !size) | ||
return -1; | ||
|
||
err = err > 0 ? err : -err; | ||
|
||
if (err < __LIBBPF_ERRNO__START) { | ||
int ret; | ||
|
||
ret = strerror_r(err, buf, size); | ||
buf[size - 1] = '\0'; | ||
return ret; | ||
} | ||
|
||
if (err < __LIBBPF_ERRNO__END) { | ||
const char *msg; | ||
|
||
msg = libbpf_strerror_table[ERRNO_OFFSET(err)]; | ||
snprintf(buf, size, "%s", msg); | ||
buf[size - 1] = '\0'; | ||
return 0; | ||
} | ||
|
||
snprintf(buf, size, "Unknown libbpf error %d", err); | ||
buf[size - 1] = '\0'; | ||
return -1; | ||
} |