Commit 1201f6fb authored by Thomas Weißschuh's avatar Thomas Weißschuh Committed by Thomas Weißschuh
Browse files

tools/nolibc: fix error return value of clock_nanosleep()



clock_nanosleep() returns a positive error value. Unlike other libc
functions it *does not* return -1 nor set errno.

Fix the return value and also adapt nanosleep().

Fixes: 7c02bc40 ("tools/nolibc: add support for clock_nanosleep() and nanosleep()")
Signed-off-by: default avatarThomas Weißschuh <thomas.weissschuh@linutronix.de>
Acked-by: default avatarWilly Tarreau <w@1wt.eu>
Link: https://lore.kernel.org/r/20250731-nolibc-clock_nanosleep-ret-v1-1-9e4af7855e61@linutronix.de


Signed-off-by: default avatarThomas Weißschuh <linux@weissschuh.net>
parent 8f5ae30d
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -133,7 +133,8 @@ static __attribute__((unused))
int clock_nanosleep(clockid_t clockid, int flags, const struct timespec *rqtp,
		    struct timespec *rmtp)
{
	return __sysret(sys_clock_nanosleep(clockid, flags, rqtp, rmtp));
	/* Directly return a positive error number */
	return -sys_clock_nanosleep(clockid, flags, rqtp, rmtp);
}

static __inline__
@@ -145,7 +146,7 @@ double difftime(time_t time1, time_t time2)
static __inline__
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
{
	return clock_nanosleep(CLOCK_REALTIME, 0, rqtp, rmtp);
	return __sysret(sys_clock_nanosleep(CLOCK_REALTIME, 0, rqtp, rmtp));
}


+1 −0
Original line number Diff line number Diff line
@@ -1334,6 +1334,7 @@ int run_syscall(int min, int max)
		CASE_TEST(chroot_root);       EXPECT_SYSZR(euid0, chroot("/")); break;
		CASE_TEST(chroot_blah);       EXPECT_SYSER(1, chroot("/proc/self/blah"), -1, ENOENT); break;
		CASE_TEST(chroot_exe);        EXPECT_SYSER(1, chroot(argv0), -1, ENOTDIR); break;
		CASE_TEST(clock_nanosleep);   ts.tv_nsec = -1; EXPECT_EQ(1, EINVAL, clock_nanosleep(CLOCK_REALTIME, 0, &ts, NULL)); break;
		CASE_TEST(close_m1);          EXPECT_SYSER(1, close(-1), -1, EBADF); break;
		CASE_TEST(close_dup);         EXPECT_SYSZR(1, close(dup(0))); break;
		CASE_TEST(dup_0);             tmp = dup(0);  EXPECT_SYSNE(1, tmp, -1); close(tmp); break;