2424#include < utility>
2525#include < vector>
2626#include < wasi/api.h>
27+ #include < time.h>
2728
2829#include " backend.h"
2930#include " file.h"
@@ -167,7 +168,7 @@ static __wasi_errno_t writeAtOffset(OffsetHandling setOffset,
167168 lockedOpenFile.setPosition (offset + bytesWritten);
168169 }
169170 if (bytesWritten) {
170- lockedFile.setMTime ( time ( NULL ) );
171+ lockedFile.updateMTime ( );
171172 }
172173 return __WASI_ERRNO_SUCCESS;
173174}
@@ -383,9 +384,9 @@ int __syscall_newfstatat(int dirfd, intptr_t path, intptr_t buf, int flags) {
383384 buffer->st_blocks = (buffer->st_size + 511 ) / 512 ;
384385 // Specifies the preferred blocksize for efficient disk I/O.
385386 buffer->st_blksize = 4096 ;
386- buffer->st_atim . tv_sec = lockedFile.getATime ();
387- buffer->st_mtim . tv_sec = lockedFile.getMTime ();
388- buffer->st_ctim . tv_sec = lockedFile.getCTime ();
387+ buffer->st_atim = lockedFile.getATime ();
388+ buffer->st_mtim = lockedFile.getMTime ();
389+ buffer->st_ctim = lockedFile.getCTime ();
389390 return __WASI_ERRNO_SUCCESS;
390391}
391392
@@ -1093,21 +1094,23 @@ int __syscall_utimensat(int dirFD, intptr_t path_, intptr_t times_, int flags) {
10931094 return err;
10941095 }
10951096
1096- // TODO: Set tv_nsec (nanoseconds) as well.
10971097 // TODO: Handle tv_nsec being UTIME_NOW or UTIME_OMIT.
10981098 // TODO: Check for write access to the file (see man page for specifics).
1099- time_t aSeconds, mSeconds ;
1099+ struct timespec aTime, mTime ;
1100+
11001101 if (times == NULL ) {
1101- aSeconds = time (NULL );
1102- mSeconds = aSeconds;
1102+ struct timespec ts;
1103+ clock_gettime (CLOCK_REALTIME, &ts);
1104+ aTime = ts;
1105+ mTime = ts;
11031106 } else {
1104- aSeconds = times[0 ]. tv_sec ;
1105- mSeconds = times[1 ]. tv_sec ;
1107+ aTime = times[0 ];
1108+ mTime = times[1 ];
11061109 }
11071110
11081111 auto locked = parsed.getFile ()->locked ();
1109- locked.setATime (aSeconds );
1110- locked.setMTime (mSeconds );
1112+ locked.setATime (aTime );
1113+ locked.setMTime (mTime );
11111114
11121115 return 0 ;
11131116}
@@ -1131,7 +1134,7 @@ int __syscall_fchmodat(int dirfd, intptr_t path, int mode, ...) {
11311134 auto lockedFile = parsed.getFile ()->locked ();
11321135 lockedFile.setMode (mode);
11331136 // On POSIX, ctime is updated on metadata changes, like chmod.
1134- lockedFile.setCTime ( time ( NULL ) );
1137+ lockedFile.updateCTime ( );
11351138 return 0 ;
11361139}
11371140
@@ -1146,7 +1149,7 @@ int __syscall_fchmod(int fd, int mode) {
11461149 }
11471150 auto lockedFile = openFile->locked ().getFile ()->locked ();
11481151 lockedFile.setMode (mode);
1149- lockedFile.setCTime ( time ( NULL ) );
1152+ lockedFile.updateCTime ( );
11501153 return 0 ;
11511154}
11521155
0 commit comments