| From: Ryan Roberts <ryan.roberts@arm.com> |
| Subject: tools/nolibc/stdio: add setvbuf() to set buffering mode |
| Date: Wed, 26 Jul 2023 08:06:55 +0100 |
| |
| Add a minimal implementation of setvbuf(), which error checks the mode |
| argument (as required by spec) and returns. Since nolibc never buffers |
| output, nothing needs to be done. |
| |
| The kselftest framework recently added a call to setvbuf(). As a result, |
| any tests that use the kselftest framework and nolibc cause a compiler |
| error due to missing function. This provides an urgent fix for the |
| problem which is preventing arm64 testing on linux-next. |
| |
| Example: |
| |
| clang --target=aarch64-linux-gnu -fintegrated-as |
| -Werror=unknown-warning-option -Werror=ignored-optimization-argument |
| -Werror=option-ignored -Werror=unused-command-line-argument |
| --target=aarch64-linux-gnu -fintegrated-as |
| -fno-asynchronous-unwind-tables -fno-ident -s -Os -nostdlib \ |
| -include ../../../../include/nolibc/nolibc.h -I../..\ |
| -static -ffreestanding -Wall za-fork.c |
| build/kselftest/arm64/fp/za-fork-asm.o |
| -o build/kselftest/arm64/fp/za-fork |
| In file included from <built-in>:1: |
| In file included from ./../../../../include/nolibc/nolibc.h:97: |
| In file included from ./../../../../include/nolibc/arch.h:25: |
| ./../../../../include/nolibc/arch-aarch64.h:178:35: warning: unknown |
| attribute 'optimize' ignored [-Wunknown-attributes] |
| void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) |
| __no_stack_protector _start(void) |
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| In file included from za-fork.c:12: |
| ../../kselftest.h:123:2: error: call to undeclared function 'setvbuf'; |
| ISO C99 and later do not support implicit function declarations |
| [-Wimplicit-function-declaration] |
| setvbuf(stdout, NULL, _IOLBF, 0); |
| ^ |
| ../../kselftest.h:123:24: error: use of undeclared identifier '_IOLBF' |
| setvbuf(stdout, NULL, _IOLBF, 0); |
| ^ |
| 1 warning and 2 errors generated. |
| |
| Link: https://lkml.kernel.org/r/20230726070655.2713530-1-ryan.roberts@arm.com |
| Signed-off-by: Ryan Roberts <ryan.roberts@arm.com> |
| Fixes: ecb7fe2cd610 ("selftests: line buffer test program's stdout") |
| Reported-by: Linux Kernel Functional Testing <lkft@linaro.org> |
| Link: https://lore.kernel.org/linux-kselftest/CA+G9fYus3Z8r2cg3zLv8uH8MRrzLFVWdnor02SNr=rCz+_WGVg@mail.gmail.com/ |
| Reviewed-by: Mark Brown <broonie@kernel.org> |
| Cc: Naresh Kamboju <naresh.kamboju@linaro.org> |
| Cc: Willy Tarreau <w@1wt.eu> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| tools/include/nolibc/stdio.h | 24 ++++++++++++++++++++++++ |
| 1 file changed, 24 insertions(+) |
| |
| --- a/tools/include/nolibc/stdio.h~selftests-line-buffer-test-programs-stdout-fix |
| +++ a/tools/include/nolibc/stdio.h |
| @@ -21,6 +21,11 @@ |
| #define EOF (-1) |
| #endif |
| |
| +/* Buffering mode used by setvbuf. */ |
| +#define _IOFBF 0 /* Fully buffered. */ |
| +#define _IOLBF 1 /* Line buffered. */ |
| +#define _IONBF 2 /* No buffering. */ |
| + |
| /* just define FILE as a non-empty type. The value of the pointer gives |
| * the FD: FILE=~fd for fd>=0 or NULL for fd<0. This way positive FILE |
| * are immediately identified as abnormal entries (i.e. possible copies |
| @@ -350,6 +355,25 @@ void perror(const char *msg) |
| fprintf(stderr, "%s%serrno=%d\n", (msg && *msg) ? msg : "", (msg && *msg) ? ": " : "", errno); |
| } |
| |
| +static __attribute__((unused)) |
| +int setvbuf(FILE *stream, char *buf, int mode, size_t size) |
| +{ |
| + /* |
| + * nolibc does not support buffering so this is a nop. Just check mode |
| + * is valid as required by the spec. |
| + */ |
| + switch (mode) { |
| + case _IOFBF: |
| + case _IOLBF: |
| + case _IONBF: |
| + break; |
| + default: |
| + return EOF; |
| + } |
| + |
| + return 0; |
| +} |
| + |
| /* make sure to include all global symbols */ |
| #include "nolibc.h" |
| |
| _ |