+diff --git a/syscall.c b/syscall.c
+--- a/syscall.c
++++ b/syscall.c
+@@ -349,15 +349,15 @@ OFF_T do_lseek(int fd, OFF_T offset, int whence)
+ }
+
+ #ifdef HAVE_UTIMENSAT
+-int do_utimensat(const char *fname, time_t modtime, uint32 mod_nsec)
++int do_utimensat(const char *fname, time_t modtime, uint32 mod_nsec, time_t atime, uint32 a_nsec)
+ {
+ struct timespec t[2];
+
+ if (dry_run) return 0;
+ RETURN_ERROR_IF_RO_OR_LO;
+
+- t[0].tv_sec = 0;
+- t[0].tv_nsec = UTIME_NOW;
++ t[0].tv_sec = atime;
++ t[0].tv_nsec = a_nsec;
+ t[1].tv_sec = modtime;
+ t[1].tv_nsec = mod_nsec;
+ return utimensat(AT_FDCWD, fname, t, AT_SYMLINK_NOFOLLOW);
+@@ -365,15 +365,15 @@ int do_utimensat(const char *fname, time_t modtime, uint32 mod_nsec)
+ #endif
+
+ #ifdef HAVE_LUTIMES
+-int do_lutimes(const char *fname, time_t modtime, uint32 mod_nsec)
++int do_lutimes(const char *fname, time_t modtime, uint32 mod_nsec, time_t atime, uint32 a_nsec)
+ {
+ struct timeval t[2];
+
+ if (dry_run) return 0;
+ RETURN_ERROR_IF_RO_OR_LO;
+
+- t[0].tv_sec = time(NULL);
+- t[0].tv_usec = 0;
++ t[0].tv_sec = atime;
++ t[0].tv_usec = a_nsec;
+ t[1].tv_sec = modtime;
+ t[1].tv_usec = mod_nsec / 1000;
+ return lutimes(fname, t);
+@@ -381,22 +381,22 @@ int do_lutimes(const char *fname, time_t modtime, uint32 mod_nsec)
+ #endif
+
+ #ifdef HAVE_UTIMES
+-int do_utimes(const char *fname, time_t modtime, uint32 mod_nsec)
++int do_utimes(const char *fname, time_t modtime, uint32 mod_nsec, time_t atime, uint32 a_nsec)
+ {
+ struct timeval t[2];
+
+ if (dry_run) return 0;
+ RETURN_ERROR_IF_RO_OR_LO;
+
+- t[0].tv_sec = time(NULL);
+- t[0].tv_usec = 0;
++ t[0].tv_sec = atime;
++ t[0].tv_usec = a_nsec;
+ t[1].tv_sec = modtime;
+ t[1].tv_usec = mod_nsec / 1000;
+ return utimes(fname, t);
+ }
+
+ #elif defined HAVE_UTIME
+-int do_utime(const char *fname, time_t modtime, UNUSED(uint32 mod_nsec))
++int do_utime(const char *fname, time_t modtime, UNUSED(uint32 mod_nsec), time_t atime, UNUSED(uint32 a_nsec))
+ {
+ #ifdef HAVE_STRUCT_UTIMBUF
+ struct utimbuf tbuf;
+@@ -408,11 +408,11 @@ int do_utime(const char *fname, time_t modtime, UNUSED(uint32 mod_nsec))
+ RETURN_ERROR_IF_RO_OR_LO;
+
+ # ifdef HAVE_STRUCT_UTIMBUF
+- tbuf.actime = time(NULL);
++ tbuf.actime = atime;
+ tbuf.modtime = modtime;
+ return utime(fname, &tbuf);
+ # else
+- t[0] = time(NULL);
++ t[0] = atime;
+ t[1] = modtime;
+ return utime(fname, t);
+ # endif