selftests/nolibc: test compatibility of nolibc and kernel time types

Keeping 'struct timespec' and 'struct __kernel_timespec' compatible
allows the source code to stay simple.

Validate that the types stay compatible.

The test is specific to nolibc and does not compile on other libcs, so
skip it there.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
Acked-by: Willy Tarreau <w@1wt.eu>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Link: https://patch.msgid.link/20251220-nolibc-uapi-types-v3-10-c662992f75d7@weissschuh.net
This commit is contained in:
Thomas Weißschuh 2025-12-20 14:55:54 +01:00
parent bdcfc417f2
commit ca7206b6ad

View File

@ -1430,6 +1430,34 @@ int test_difftime(void)
return 0;
}
int test_time_types(void)
{
#ifdef NOLIBC
struct __kernel_timespec kts;
struct timespec ts;
if (!__builtin_types_compatible_p(time_t, __kernel_time64_t))
return 1;
if (sizeof(ts) != sizeof(kts))
return 1;
if (!__builtin_types_compatible_p(__typeof__(ts.tv_sec), __typeof__(kts.tv_sec)))
return 1;
if (!__builtin_types_compatible_p(__typeof__(ts.tv_nsec), __typeof__(kts.tv_nsec)))
return 1;
if (offsetof(__typeof__(ts), tv_sec) != offsetof(__typeof__(kts), tv_sec))
return 1;
if (offsetof(__typeof__(ts), tv_nsec) != offsetof(__typeof__(kts), tv_nsec))
return 1;
#endif /* NOLIBC */
return 0;
}
int run_stdlib(int min, int max)
{
int test;
@ -1555,6 +1583,7 @@ int run_stdlib(int min, int max)
CASE_TEST(difftime); EXPECT_ZR(1, test_difftime()); break;
CASE_TEST(memchr_foobar6_o); EXPECT_STREQ(1, memchr("foobar", 'o', 6), "oobar"); break;
CASE_TEST(memchr_foobar3_b); EXPECT_STRZR(1, memchr("foobar", 'b', 3)); break;
CASE_TEST(time_types); EXPECT_ZR(is_nolibc, test_time_types()); break;
case __LINE__:
return ret; /* must be last */