diff --git a/components/esp_libc/CMakeLists.txt b/components/esp_libc/CMakeLists.txt index 5f3beec8a04..ce2529d143c 100644 --- a/components/esp_libc/CMakeLists.txt +++ b/components/esp_libc/CMakeLists.txt @@ -77,6 +77,7 @@ else() list(APPEND srcs "src/picolibc/picolibc_init.c" "src/picolibc/rand.c" + "src/picolibc/timespec_get.c" "src/picolibc/open_memstream.c" "src/picolibc/errno.c" "src/picolibc/bufio_setvbuf.c") # TODO IDF-15494: remove this and the following lines diff --git a/components/esp_libc/src/picolibc/timespec_get.c b/components/esp_libc/src/picolibc/timespec_get.c new file mode 100644 index 00000000000..81d3d5c5abc --- /dev/null +++ b/components/esp_libc/src/picolibc/timespec_get.c @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +int timespec_get(struct timespec *ts, int base) +{ + if (base != TIME_UTC || clock_gettime(CLOCK_REALTIME, ts) < 0) { + return 0; + } + return base; +} diff --git a/components/esp_libc/test_apps/newlib/main/test_time.c b/components/esp_libc/test_apps/newlib/main/test_time.c index 5b885dffb77..ffded3907ff 100644 --- a/components/esp_libc/test_apps/newlib/main/test_time.c +++ b/components/esp_libc/test_apps/newlib/main/test_time.c @@ -548,6 +548,17 @@ TEST_CASE("test posix_timers clock_... functions", "[newlib]") test_posix_timers_clock(); } +TEST_CASE("timespec_get returns UTC time", "[newlib]") +{ + struct timespec ts = {0}; + + TEST_ASSERT_EQUAL_INT(TIME_UTC, timespec_get(&ts, TIME_UTC)); + TEST_ASSERT_GREATER_OR_EQUAL_INT64(0, ts.tv_sec); + TEST_ASSERT_GREATER_OR_EQUAL_INT32(0, ts.tv_nsec); + TEST_ASSERT_LESS_THAN_INT32(1000000000L, ts.tv_nsec); + TEST_ASSERT_EQUAL_INT(0, timespec_get(&ts, -1)); +} + #define TEST_USE_CPU_CYCLES 1 #if TEST_USE_CPU_CYCLES && CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE #include "esp_cpu.h"