diff --git a/components/newlib/syscalls.c b/components/newlib/syscalls.c index 9adb78bb2..5993981e8 100644 --- a/components/newlib/syscalls.c +++ b/components/newlib/syscalls.c @@ -15,10 +15,12 @@ #include #include #include +#include #include #include #include -#include +#include +#include int system(const char* str) @@ -65,6 +67,17 @@ void _exit(int __status) abort(); } +/* Replaces newlib fcntl, which has been compiled without HAVE_FCNTL */ +int fcntl(int fd, int cmd, ...) +{ + va_list args; + va_start(args, cmd); + int arg = va_arg(args, int); + va_end(args); + struct _reent* r = __getreent(); + return _fcntl_r(r, fd, cmd, arg); +} + /* No-op function, used to force linking this file, instead of the syscalls implementation from libgloss. */ diff --git a/components/vfs/test/test_vfs_uart.c b/components/vfs/test/test_vfs_uart.c index 5c3d3f1d6..21af9a0fd 100644 --- a/components/vfs/test/test_vfs_uart.c +++ b/components/vfs/test/test_vfs_uart.c @@ -202,6 +202,17 @@ TEST_CASE("can write to UART while another task is reading", "[vfs]") vSemaphoreDelete(write_arg.done); } +TEST_CASE("fcntl supported in UART VFS", "[vfs]") +{ + int flags = fcntl(STDIN_FILENO, F_GETFL, 0); + TEST_ASSERT_NOT_EQUAL(-1, flags); + int res = fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK); + TEST_ASSERT_NOT_EQUAL(-1, res); + /* revert */ + res = fcntl(STDIN_FILENO, F_SETFL, flags); + TEST_ASSERT_NOT_EQUAL(-1, res); +} + #ifdef CONFIG_VFS_SUPPORT_TERMIOS TEST_CASE("Can use termios for UART", "[vfs]") { diff --git a/components/vfs/vfs.c b/components/vfs/vfs.c index a40a28684..af6c41aeb 100644 --- a/components/vfs/vfs.c +++ b/components/vfs/vfs.c @@ -725,16 +725,6 @@ int _fcntl_r(struct _reent *r, int fd, int cmd, int arg) return ret; } -int __attribute__((weak)) fcntl(int fd, int cmd, ...) -{ - va_list args; - va_start(args, cmd); - int arg = va_arg(args, int); - va_end(args); - struct _reent* r = __getreent(); - return _fcntl_r(r, fd, cmd, arg); -} - int ioctl(int fd, int cmd, ...) { const vfs_entry_t* vfs = get_vfs_for_fd(fd);