mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 11:10:54 +03:00
fix(esp_libc): picolibc: add workaround for setvbuf on _IONBF
This commit is contained in:
@@ -77,7 +77,9 @@ else()
|
|||||||
"src/picolibc/picolibc_init.c"
|
"src/picolibc/picolibc_init.c"
|
||||||
"src/picolibc/rand.c"
|
"src/picolibc/rand.c"
|
||||||
"src/picolibc/open_memstream.c"
|
"src/picolibc/open_memstream.c"
|
||||||
"src/picolibc/errno.c")
|
"src/picolibc/errno.c"
|
||||||
|
"src/picolibc/bufio_setvbuf.c") # TODO IDF-15494: remove this and the following lines
|
||||||
|
list(APPEND EXTRA_LINK_FLAGS "-Wl,--wrap=__bufio_setvbuf")
|
||||||
if(CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY)
|
if(CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY)
|
||||||
list(APPEND srcs "src/picolibc/getreent.c")
|
list(APPEND srcs "src/picolibc/getreent.c")
|
||||||
list(APPEND srcs "src/picolibc/fopencookie.c")
|
list(APPEND srcs "src/picolibc/fopencookie.c")
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
#include <stdio-bufio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
int __real___bufio_setvbuf(FILE *f, char *buf, int mode, size_t size);
|
||||||
|
int __wrap___bufio_setvbuf(FILE *f, char *buf, int mode, size_t size)
|
||||||
|
{
|
||||||
|
// File lock is already acquired by the caller
|
||||||
|
int ret = -1;
|
||||||
|
bool workaround = false;
|
||||||
|
if (mode == _IONBF) {
|
||||||
|
workaround = true;
|
||||||
|
mode = _IOFBF;
|
||||||
|
size = 1;
|
||||||
|
buf = malloc(size);
|
||||||
|
if (buf == NULL) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret = __real___bufio_setvbuf(f, buf, mode, size);
|
||||||
|
if (workaround) {
|
||||||
|
struct __file_bufio *bf = (struct __file_bufio *)f;
|
||||||
|
|
||||||
|
// Free buf if not applied
|
||||||
|
if (ret != 0 || bf->buf != buf) {
|
||||||
|
free(buf);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
bf->bflags |= __BALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user