Fix futimes() regression

Fixes #647
This commit is contained in:
Justine Tunney 2022-10-05 19:25:07 -07:00
parent f155205eb0
commit 81ee11a16e
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
22 changed files with 200 additions and 138 deletions

View file

@ -64,12 +64,19 @@ TEST(_timespec_frommicros, test) {
}
TEST(_timespec_tomillis, test) {
EXPECT_EQ(0, _timespec_tomillis((struct timespec){0, 0}));
EXPECT_EQ(1, _timespec_tomillis((struct timespec){0, 1}));
EXPECT_EQ(1, _timespec_tomillis((struct timespec){0, 999999}));
EXPECT_EQ(1, _timespec_tomillis((struct timespec){0, 1000000}));
EXPECT_EQ(1000, _timespec_tomillis((struct timespec){0, 999999999}));
EXPECT_EQ(2123, _timespec_tomillis((struct timespec){2, 123000000}));
EXPECT_EQ(INT64_MAX, _timespec_tomillis((struct timespec){INT64_MAX, 0}));
EXPECT_EQ(INT64_MIN, _timespec_tomillis((struct timespec){INT64_MIN, 0}));
}
TEST(_timespec_tomicros, test) {
EXPECT_EQ(0, _timespec_tomicros((struct timespec){0, 0}));
EXPECT_EQ(1, _timespec_tomicros((struct timespec){0, 1}));
EXPECT_EQ(2000123, _timespec_tomicros((struct timespec){2, 123000}));
EXPECT_EQ(INT64_MAX, _timespec_tomicros((struct timespec){INT64_MAX, 0}));
EXPECT_EQ(INT64_MIN, _timespec_tomicros((struct timespec){INT64_MIN, 0}));

View file

@ -22,6 +22,7 @@
#include "libc/calls/struct/timespec.h"
#include "libc/errno.h"
#include "libc/intrin/describeflags.internal.h"
#include "libc/sysv/consts/clock.h"
#include "libc/sysv/consts/itimer.h"
#include "libc/sysv/consts/sa.h"
#include "libc/sysv/consts/sig.h"
@ -41,11 +42,16 @@ TEST(nanosleep, testInvalid) {
EXPECT_SYS(EINVAL, -1, nanosleep(&ts, 0));
}
TEST(nanosleep, testNoSignalIsDelivered_remIsSetToZero) {
TEST(nanosleep, testNoSignalIsDelivered) {
struct timespec ts = {0, 1};
ASSERT_SYS(0, 0, nanosleep(&ts, &ts));
EXPECT_EQ(0, ts.tv_sec);
EXPECT_EQ(0, ts.tv_nsec);
ASSERT_SYS(0, 0, nanosleep(&ts, 0));
}
TEST(clock_nanosleep, testNoSignalIsDelivered) {
struct timespec ts = {0, 1};
ASSERT_SYS(0, 0, clock_nanosleep(CLOCK_REALTIME, 0, &ts, &ts));
ASSERT_SYS(0, 0, clock_nanosleep(CLOCK_REALTIME, 0, &ts, 0));
}
TEST(nanosleep, testInterrupt_remIsUpdated) {

View file

@ -19,8 +19,10 @@
#include "libc/calls/calls.h"
#include "libc/calls/struct/stat.h"
#include "libc/calls/struct/timespec.h"
#include "libc/calls/struct/timeval.h"
#include "libc/calls/syscall_support-sysv.internal.h"
#include "libc/dce.h"
#include "libc/errno.h"
#include "libc/sysv/consts/at.h"
#include "libc/sysv/consts/o.h"
#include "libc/sysv/consts/utime.h"
@ -33,6 +35,50 @@ void SetUpOnce(void) {
ASSERT_SYS(0, 0, pledge("stdio rpath wpath cpath fattr", 0));
}
TEST(utimes, test) {
struct stat st;
struct timeval tv[2] = {
{1655455857, 1}, // atim: Fri Jun 17 2022 08:50:57 GMT+0000
{827727928, 2}, // mtim: Mon Mar 25 1996 04:25:28 GMT+0000
};
EXPECT_SYS(0, 0, touch("boop", 0644));
EXPECT_SYS(0, 0, utimes("boop", tv));
EXPECT_SYS(0, 0, stat("boop", &st));
EXPECT_EQ(1655455857, st.st_atim.tv_sec);
EXPECT_EQ(827727928, st.st_mtim.tv_sec);
if (IsLinux() && !__is_linux_2_6_23()) {
// rhel5 only seems to have second granularity
EXPECT_EQ(0, st.st_atim.tv_nsec);
EXPECT_EQ(0, st.st_mtim.tv_nsec);
} else {
EXPECT_EQ(1000, st.st_atim.tv_nsec);
EXPECT_EQ(2000, st.st_mtim.tv_nsec);
}
}
TEST(futimes, test) {
if (IsLinux() && !__is_linux_2_6_23()) return;
struct stat st;
struct timeval tv[2] = {{1655455857, 1}, {827727928, 2}};
EXPECT_SYS(0, 3, creat("boop", 0644));
EXPECT_SYS(0, 0, futimes(3, tv));
EXPECT_SYS(0, 0, fstat(3, &st));
EXPECT_EQ(1655455857, st.st_atim.tv_sec);
EXPECT_EQ(827727928, st.st_mtim.tv_sec);
EXPECT_EQ(1000, st.st_atim.tv_nsec);
EXPECT_EQ(2000, st.st_mtim.tv_nsec);
EXPECT_SYS(0, 0, close(3));
}
TEST(futimes, rhel5_enosys) {
if (IsLinux() && !__is_linux_2_6_23()) {
struct timeval tv[2] = {{1655455857}, {827727928}};
EXPECT_SYS(0, 3, creat("boop", 0644));
EXPECT_SYS(ENOSYS, -1, futimes(3, tv));
EXPECT_SYS(0, 0, close(3));
}
}
TEST(utimensat, test) {
struct stat st;
struct timespec ts[2] = {