diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2018-09-14 15:47:14 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2018-09-18 09:16:18 -0400 |
commit | 6d41907c630d3196be89c9ed5a7f8258486b3eaf (patch) | |
tree | b969a05b22fae00348dce01721468c79c555491d | |
parent | cb48b6a26cace226d8b299a48c73e808eb0c4f61 (diff) |
tools lib bpf: Provide wrapper for strerror_r to build in !_GNU_SOURCE systems
Same problem that got fixed in a similar fashion in tools/perf/ in
c8b5f2c96d1b ("tools: Introduce str_error_r()"), fix it in the same
way, licensing needs to be sorted out to libbpf to use libapi, so,
for this simple case, just get the same wrapper in tools/lib/bpf.
This makes libbpf and its users (bpftool, selftests, perf) to build
again in Alpine Linux 3.[45678] and edge.
Acked-by: Alexei Starovoitov <ast@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: David Ahern <dsahern@gmail.com>
Cc: Hendrik Brueckner <brueckner@linux.ibm.com>
Cc: Jakub Kicinski <jakub.kicinski@netronome.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Martin KaFai Lau <kafai@fb.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Quentin Monnet <quentin.monnet@netronome.com>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: Yonghong Song <yhs@fb.com>
Fixes: 1ce6a9fc1549 ("bpf: fix build error in libbpf with EXTRA_CFLAGS="-Wp, -D_FORTIFY_SOURCE=2 -O2"")
Link: https://lkml.kernel.org/r/20180917151636.GA21790@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/lib/bpf/Build | 2 | ||||
-rw-r--r-- | tools/lib/bpf/libbpf.c | 20 | ||||
-rw-r--r-- | tools/lib/bpf/str_error.c | 18 | ||||
-rw-r--r-- | tools/lib/bpf/str_error.h | 6 |
4 files changed, 35 insertions, 11 deletions
diff --git a/tools/lib/bpf/Build b/tools/lib/bpf/Build index 13a861135127..6eb9bacd1948 100644 --- a/tools/lib/bpf/Build +++ b/tools/lib/bpf/Build | |||
@@ -1 +1 @@ | |||
libbpf-y := libbpf.o bpf.o nlattr.o btf.o libbpf_errno.o | libbpf-y := libbpf.o bpf.o nlattr.o btf.o libbpf_errno.o str_error.o | ||
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 2abd0f112627..bdb94939fd60 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c | |||
@@ -50,6 +50,7 @@ | |||
50 | #include "libbpf.h" | 50 | #include "libbpf.h" |
51 | #include "bpf.h" | 51 | #include "bpf.h" |
52 | #include "btf.h" | 52 | #include "btf.h" |
53 | #include "str_error.h" | ||
53 | 54 | ||
54 | #ifndef EM_BPF | 55 | #ifndef EM_BPF |
55 | #define EM_BPF 247 | 56 | #define EM_BPF 247 |
@@ -469,7 +470,7 @@ static int bpf_object__elf_init(struct bpf_object *obj) | |||
469 | obj->efile.fd = open(obj->path, O_RDONLY); | 470 | obj->efile.fd = open(obj->path, O_RDONLY); |
470 | if (obj->efile.fd < 0) { | 471 | if (obj->efile.fd < 0) { |
471 | char errmsg[STRERR_BUFSIZE]; | 472 | char errmsg[STRERR_BUFSIZE]; |
472 | char *cp = strerror_r(errno, errmsg, sizeof(errmsg)); | 473 | char *cp = str_error(errno, errmsg, sizeof(errmsg)); |
473 | 474 | ||
474 | pr_warning("failed to open %s: %s\n", obj->path, cp); | 475 | pr_warning("failed to open %s: %s\n", obj->path, cp); |
475 | return -errno; | 476 | return -errno; |
@@ -810,8 +811,7 @@ static int bpf_object__elf_collect(struct bpf_object *obj) | |||
810 | data->d_size, name, idx); | 811 | data->d_size, name, idx); |
811 | if (err) { | 812 | if (err) { |
812 | char errmsg[STRERR_BUFSIZE]; | 813 | char errmsg[STRERR_BUFSIZE]; |
813 | char *cp = strerror_r(-err, errmsg, | 814 | char *cp = str_error(-err, errmsg, sizeof(errmsg)); |
814 | sizeof(errmsg)); | ||
815 | 815 | ||
816 | pr_warning("failed to alloc program %s (%s): %s", | 816 | pr_warning("failed to alloc program %s (%s): %s", |
817 | name, obj->path, cp); | 817 | name, obj->path, cp); |
@@ -1140,7 +1140,7 @@ bpf_object__create_maps(struct bpf_object *obj) | |||
1140 | 1140 | ||
1141 | *pfd = bpf_create_map_xattr(&create_attr); | 1141 | *pfd = bpf_create_map_xattr(&create_attr); |
1142 | if (*pfd < 0 && create_attr.btf_key_type_id) { | 1142 | if (*pfd < 0 && create_attr.btf_key_type_id) { |
1143 | cp = strerror_r(errno, errmsg, sizeof(errmsg)); | 1143 | cp = str_error(errno, errmsg, sizeof(errmsg)); |
1144 | pr_warning("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n", | 1144 | pr_warning("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n", |
1145 | map->name, cp, errno); | 1145 | map->name, cp, errno); |
1146 | create_attr.btf_fd = 0; | 1146 | create_attr.btf_fd = 0; |
@@ -1155,7 +1155,7 @@ bpf_object__create_maps(struct bpf_object *obj) | |||
1155 | size_t j; | 1155 | size_t j; |
1156 | 1156 | ||
1157 | err = *pfd; | 1157 | err = *pfd; |
1158 | cp = strerror_r(errno, errmsg, sizeof(errmsg)); | 1158 | cp = str_error(errno, errmsg, sizeof(errmsg)); |
1159 | pr_warning("failed to create map (name: '%s'): %s\n", | 1159 | pr_warning("failed to create map (name: '%s'): %s\n", |
1160 | map->name, cp); | 1160 | map->name, cp); |
1161 | for (j = 0; j < i; j++) | 1161 | for (j = 0; j < i; j++) |
@@ -1339,7 +1339,7 @@ load_program(enum bpf_prog_type type, enum bpf_attach_type expected_attach_type, | |||
1339 | } | 1339 | } |
1340 | 1340 | ||
1341 | ret = -LIBBPF_ERRNO__LOAD; | 1341 | ret = -LIBBPF_ERRNO__LOAD; |
1342 | cp = strerror_r(errno, errmsg, sizeof(errmsg)); | 1342 | cp = str_error(errno, errmsg, sizeof(errmsg)); |
1343 | pr_warning("load bpf program failed: %s\n", cp); | 1343 | pr_warning("load bpf program failed: %s\n", cp); |
1344 | 1344 | ||
1345 | if (log_buf && log_buf[0] != '\0') { | 1345 | if (log_buf && log_buf[0] != '\0') { |
@@ -1654,7 +1654,7 @@ static int check_path(const char *path) | |||
1654 | 1654 | ||
1655 | dir = dirname(dname); | 1655 | dir = dirname(dname); |
1656 | if (statfs(dir, &st_fs)) { | 1656 | if (statfs(dir, &st_fs)) { |
1657 | cp = strerror_r(errno, errmsg, sizeof(errmsg)); | 1657 | cp = str_error(errno, errmsg, sizeof(errmsg)); |
1658 | pr_warning("failed to statfs %s: %s\n", dir, cp); | 1658 | pr_warning("failed to statfs %s: %s\n", dir, cp); |
1659 | err = -errno; | 1659 | err = -errno; |
1660 | } | 1660 | } |
@@ -1690,7 +1690,7 @@ int bpf_program__pin_instance(struct bpf_program *prog, const char *path, | |||
1690 | } | 1690 | } |
1691 | 1691 | ||
1692 | if (bpf_obj_pin(prog->instances.fds[instance], path)) { | 1692 | if (bpf_obj_pin(prog->instances.fds[instance], path)) { |
1693 | cp = strerror_r(errno, errmsg, sizeof(errmsg)); | 1693 | cp = str_error(errno, errmsg, sizeof(errmsg)); |
1694 | pr_warning("failed to pin program: %s\n", cp); | 1694 | pr_warning("failed to pin program: %s\n", cp); |
1695 | return -errno; | 1695 | return -errno; |
1696 | } | 1696 | } |
@@ -1708,7 +1708,7 @@ static int make_dir(const char *path) | |||
1708 | err = -errno; | 1708 | err = -errno; |
1709 | 1709 | ||
1710 | if (err) { | 1710 | if (err) { |
1711 | cp = strerror_r(-err, errmsg, sizeof(errmsg)); | 1711 | cp = str_error(-err, errmsg, sizeof(errmsg)); |
1712 | pr_warning("failed to mkdir %s: %s\n", path, cp); | 1712 | pr_warning("failed to mkdir %s: %s\n", path, cp); |
1713 | } | 1713 | } |
1714 | return err; | 1714 | return err; |
@@ -1770,7 +1770,7 @@ int bpf_map__pin(struct bpf_map *map, const char *path) | |||
1770 | } | 1770 | } |
1771 | 1771 | ||
1772 | if (bpf_obj_pin(map->fd, path)) { | 1772 | if (bpf_obj_pin(map->fd, path)) { |
1773 | cp = strerror_r(errno, errmsg, sizeof(errmsg)); | 1773 | cp = str_error(errno, errmsg, sizeof(errmsg)); |
1774 | pr_warning("failed to pin map: %s\n", cp); | 1774 | pr_warning("failed to pin map: %s\n", cp); |
1775 | return -errno; | 1775 | return -errno; |
1776 | } | 1776 | } |
diff --git a/tools/lib/bpf/str_error.c b/tools/lib/bpf/str_error.c new file mode 100644 index 000000000000..b8798114a357 --- /dev/null +++ b/tools/lib/bpf/str_error.c | |||
@@ -0,0 +1,18 @@ | |||
1 | // SPDX-License-Identifier: LGPL-2.1 | ||
2 | #undef _GNU_SOURCE | ||
3 | #include <string.h> | ||
4 | #include <stdio.h> | ||
5 | #include "str_error.h" | ||
6 | |||
7 | /* | ||
8 | * Wrapper to allow for building in non-GNU systems such as Alpine Linux's musl | ||
9 | * libc, while checking strerror_r() return to avoid having to check this in | ||
10 | * all places calling it. | ||
11 | */ | ||
12 | char *str_error(int err, char *dst, int len) | ||
13 | { | ||
14 | int ret = strerror_r(err, dst, len); | ||
15 | if (ret) | ||
16 | snprintf(dst, len, "ERROR: strerror_r(%d)=%d", err, ret); | ||
17 | return dst; | ||
18 | } | ||
diff --git a/tools/lib/bpf/str_error.h b/tools/lib/bpf/str_error.h new file mode 100644 index 000000000000..355b1db571d1 --- /dev/null +++ b/tools/lib/bpf/str_error.h | |||
@@ -0,0 +1,6 @@ | |||
1 | // SPDX-License-Identifier: LGPL-2.1 | ||
2 | #ifndef BPF_STR_ERROR | ||
3 | #define BPF_STR_ERROR | ||
4 | |||
5 | char *str_error(int err, char *dst, int len); | ||
6 | #endif // BPF_STR_ERROR | ||