make fstatat fill in old time32 stat fields too
authorRich Felker <dalias@aerifal.cx>
Fri, 2 Aug 2019 01:33:57 +0000 (21:33 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 28 Oct 2019 23:26:52 +0000 (19:26 -0400)
here _REDIR_TIME64 is used as an indication that there's an old ABI,
and thereby the old time32 timespec fields of struct stat.

keeping struct stat compatible and providing both versions of the
timespec fields is done so that ftw/nftw does not need painful compat
shims, and (more importantly) so that similar interfaces between pairs
of libc consumers (applications/libraries) will be less likely to
break when one has been rebuilt for time64 but the other has not.

src/stat/fstatat.c

index bf0a554ca0fe60cf90266174e96c58bb68436ac6..de165b5c9725bf5b87c865f83b8222bdf7f7d5f1 100644 (file)
@@ -57,6 +57,14 @@ static int fstatat_statx(int fd, const char *restrict path, struct stat *restric
                .st_mtim.tv_nsec = stx.stx_mtime.tv_nsec,
                .st_ctim.tv_sec = stx.stx_ctime.tv_sec,
                .st_ctim.tv_nsec = stx.stx_ctime.tv_nsec,
+#if _REDIR_TIME64
+               .__st_atim32.tv_sec = stx.stx_atime.tv_sec,
+               .__st_atim32.tv_nsec = stx.stx_atime.tv_nsec,
+               .__st_mtim32.tv_sec = stx.stx_mtime.tv_sec,
+               .__st_mtim32.tv_nsec = stx.stx_mtime.tv_nsec,
+               .__st_ctim32.tv_sec = stx.stx_ctime.tv_sec,
+               .__st_ctim32.tv_nsec = stx.stx_ctime.tv_nsec,
+#endif
        };
        return 0;
 }
@@ -110,6 +118,14 @@ static int fstatat_kstat(int fd, const char *restrict path, struct stat *restric
                .st_mtim.tv_nsec = kst.st_mtime_nsec,
                .st_ctim.tv_sec = kst.st_ctime_sec,
                .st_ctim.tv_nsec = kst.st_ctime_nsec,
+#if _REDIR_TIME64
+               .__st_atim32.tv_sec = kst.st_atime_sec,
+               .__st_atim32.tv_nsec = kst.st_atime_nsec,
+               .__st_mtim32.tv_sec = kst.st_mtime_sec,
+               .__st_mtim32.tv_nsec = kst.st_mtime_nsec,
+               .__st_ctim32.tv_sec = kst.st_ctime_sec,
+               .__st_ctim32.tv_nsec = kst.st_ctime_nsec,
+#endif
        };
 
        return 0;