Message ID | 20181129203803.1547309-1-yhs@fb.com |
---|---|
State | Changes Requested, archived |
Delegated to: | BPF Maintainers |
Headers | show |
Series | [bpf-next] tools/bpf: make libbpf _GNU_SOURCE friendly | expand |
On Thu, 29 Nov 2018 12:38:03 -0800, Yonghong Song wrote: > diff --git a/tools/lib/bpf/libbpf_errno.c b/tools/lib/bpf/libbpf_errno.c > index d83b17f8435c..286e497c50ec 100644 > --- a/tools/lib/bpf/libbpf_errno.c > +++ b/tools/lib/bpf/libbpf_errno.c > @@ -40,9 +40,19 @@ int libbpf_strerror(int err, char *buf, size_t size) > err = err > 0 ? err : -err; > > if (err < __LIBBPF_ERRNO__START) { > +#ifdef _GNU_SOURCE > + const char *ret_buf; > +#endif > int ret; > > +#ifdef _GNU_SOURCE > + ret_buf = strerror_r(err, buf, size); > + if (ret_buf != buf) > + snprintf(buf, size, "%s", ret_buf); > + ret = 0; > +#else > ret = strerror_r(err, buf, size); > +#endif > buf[size - 1] = '\0'; > return ret; > } That is kinda strange, the whole point for this file was to have non-GNU strerror_r, would doing #undef _GNU_SOURCE at the top not work?
On 11/29/18 1:00 PM, Jakub Kicinski wrote: > On Thu, 29 Nov 2018 12:38:03 -0800, Yonghong Song wrote: >> diff --git a/tools/lib/bpf/libbpf_errno.c b/tools/lib/bpf/libbpf_errno.c >> index d83b17f8435c..286e497c50ec 100644 >> --- a/tools/lib/bpf/libbpf_errno.c >> +++ b/tools/lib/bpf/libbpf_errno.c >> @@ -40,9 +40,19 @@ int libbpf_strerror(int err, char *buf, size_t size) >> err = err > 0 ? err : -err; >> >> if (err < __LIBBPF_ERRNO__START) { >> +#ifdef _GNU_SOURCE >> + const char *ret_buf; >> +#endif >> int ret; >> >> +#ifdef _GNU_SOURCE >> + ret_buf = strerror_r(err, buf, size); >> + if (ret_buf != buf) >> + snprintf(buf, size, "%s", ret_buf); >> + ret = 0; >> +#else >> ret = strerror_r(err, buf, size); >> +#endif >> buf[size - 1] = '\0'; >> return ret; >> } > > That is kinda strange, the whole point for this file was to have > non-GNU strerror_r, would doing #undef _GNU_SOURCE at the top not work? Thanks for suggestion as I did not the history of this file. Yes, #undef _GNU_SOURCE works. Will send a revision shortly.
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index ed4212a4c5f9..59b748ebd15f 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -9,7 +9,9 @@ * Copyright (C) 2017 Nicira, Inc. */ +#ifndef _GNU_SOURCE #define _GNU_SOURCE +#endif #include <stdlib.h> #include <stdio.h> #include <stdarg.h> diff --git a/tools/lib/bpf/libbpf_errno.c b/tools/lib/bpf/libbpf_errno.c index d83b17f8435c..286e497c50ec 100644 --- a/tools/lib/bpf/libbpf_errno.c +++ b/tools/lib/bpf/libbpf_errno.c @@ -40,9 +40,19 @@ int libbpf_strerror(int err, char *buf, size_t size) err = err > 0 ? err : -err; if (err < __LIBBPF_ERRNO__START) { +#ifdef _GNU_SOURCE + const char *ret_buf; +#endif int ret; +#ifdef _GNU_SOURCE + ret_buf = strerror_r(err, buf, size); + if (ret_buf != buf) + snprintf(buf, size, "%s", ret_buf); + ret = 0; +#else ret = strerror_r(err, buf, size); +#endif buf[size - 1] = '\0'; return ret; }
During porting libbpf to bcc, I got some warnings like below: ... [ 2%] Building C object src/cc/CMakeFiles/bpf-shared.dir/libbpf/src/libbpf.c.o /home/yhs/work/bcc2/src/cc/libbpf/src/libbpf.c:12:0: warning: "_GNU_SOURCE" redefined [enabled by default] #define _GNU_SOURCE ... [ 3%] Building C object src/cc/CMakeFiles/bpf-shared.dir/libbpf/src/libbpf_errno.c.o /home/yhs/work/bcc2/src/cc/libbpf/src/libbpf_errno.c: In function ‘libbpf_strerror’: /home/yhs/work/bcc2/src/cc/libbpf/src/libbpf_errno.c:45:7: warning: assignment makes integer from pointer without a cast [enabled by default] ret = strerror_r(err, buf, size); ... bcc is built with _GNU_SOURCE defined and this caused the above warning. This patch intends to make libpf _GNU_SOURCE friendly by . define _GNU_SOURCE unless it is not defined . gnu version strerror_r has different return value than non-gnu version, so strerror_r return value is handled differently if _GNU_SOURCE is defined. Signed-off-by: Yonghong Song <yhs@fb.com> --- tools/lib/bpf/libbpf.c | 2 ++ tools/lib/bpf/libbpf_errno.c | 10 ++++++++++ 2 files changed, 12 insertions(+)