diff --git a/configure b/configure index 638ddfbb495..bf5c81ccb31 100755 --- a/configure +++ b/configure @@ -14176,6 +14176,51 @@ cat >>confdefs.h <<_ACEOF _ACEOF +fi +ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtime" "ac_cv_member_struct_stat_st_birthtime" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_birthtime" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STAT_ST_BIRTHTIME 1 +_ACEOF + + +fi +ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtim" "ac_cv_member_struct_stat_st_birthtim" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_birthtim" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STAT_ST_BIRTHTIM 1 +_ACEOF + + +fi +ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimespec" "ac_cv_member_struct_stat_st_birthtimespec" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_birthtimespec" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC 1 +_ACEOF + + +fi +ac_fn_c_check_member "$LINENO" "struct stat" "__st_birthtime" "ac_cv_member_struct_stat___st_birthtime" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat___st_birthtime" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STAT___ST_BIRTHTIME 1 +_ACEOF + + +fi +ac_fn_c_check_member "$LINENO" "struct stat" "__st_birthtim" "ac_cv_member_struct_stat___st_birthtim" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat___st_birthtim" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STAT___ST_BIRTHTIM 1 +_ACEOF + + fi diff --git a/configure.ac b/configure.ac index 5d2b4f48f99..2f1032b32e4 100644 --- a/configure.ac +++ b/configure.ac @@ -2269,7 +2269,19 @@ AC_CHECK_MEMBERS([struct option.name],,, #endif]) dnl Check for stat.st_blocks and ns-resolved times -AC_CHECK_MEMBERS([struct stat.st_blocks,struct stat.st_mtim,struct stat.st_mtimespec,struct stat.st_ctim,struct stat.st_ctimespec,struct stat.st_atim,struct stat.st_atimespec]) +AC_CHECK_MEMBERS([ + struct stat.st_blocks, + struct stat.st_mtim, + struct stat.st_mtimespec, + struct stat.st_ctim, + struct stat.st_ctimespec, + struct stat.st_atim, + struct stat.st_atimespec, + struct stat.st_birthtime, + struct stat.st_birthtim, + struct stat.st_birthtimespec, + struct stat.__st_birthtime, + struct stat.__st_birthtim]) dnl Check for sin6_scope_id AC_CHECK_MEMBERS([struct sockaddr_in6.sin6_scope_id],,, diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c index ccf593394ff..93695f0bd6e 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -1648,7 +1648,21 @@ static inline void get_file_times( const struct stat *st, LARGE_INTEGER *mtime, #elif defined(HAVE_STRUCT_STAT_ST_ATIMESPEC) atime->QuadPart += st->st_atimespec.tv_nsec / 100; #endif +#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME + RtlSecondsSince1970ToTime( st->st_birthtime, creation ); +#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIM + creation->QuadPart += st->st_birthtim.tv_nsec / 100; +#elif defined(HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC) + creation->QuadPart += st->st_birthtimespec.tv_nsec / 100; +#endif +#elif defined(HAVE_STRUCT_STAT___ST_BIRTHTIME) + RtlSecondsSince1970ToTime( st->__st_birthtime, creation ); +#ifdef HAVE_STRUCT_STAT___ST_BIRTHTIM + creation->QuadPart += st->__st_birthtim.tv_nsec / 100; +#endif +#else *creation = *mtime; +#endif } /* fill in the file information that depends on the stat info */ diff --git a/include/config.h.in b/include/config.h.in index f22c5ebc966..0081c25d90d 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -860,6 +860,15 @@ /* Define to 1 if `st_atimespec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_ATIMESPEC +/* Define to 1 if `st_birthtim' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_BIRTHTIM + +/* Define to 1 if `st_birthtime' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_BIRTHTIME + +/* Define to 1 if `st_birthtimespec' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC + /* Define to 1 if `st_blocks' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BLOCKS @@ -875,6 +884,12 @@ /* Define to 1 if `st_mtimespec' is a member of `struct stat'. */ #undef HAVE_STRUCT_STAT_ST_MTIMESPEC +/* Define to 1 if `__st_birthtim' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT___ST_BIRTHTIM + +/* Define to 1 if `__st_birthtime' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT___ST_BIRTHTIME + /* Define to 1 if `tcps_connattempt' is a member of `struct tcpstat'. */ #undef HAVE_STRUCT_TCPSTAT_TCPS_CONNATTEMPT