glocalfileinfo: Support STX_BTIME for G_FILE_ATTRIBUTE_TIME_CREATED

If `statx()` is supported, query it for the file creation time and use
that if returned.

Incorporating some minor code rearrangement by Philip Withnall
<withnall@endlessm.com>.

Fixes: #1970
This commit is contained in:
Andre Miranda 2020-08-14 16:12:05 +01:00 committed by Philip Withnall
parent 60eefd4de9
commit 18aaf33cf1
2 changed files with 15 additions and 8 deletions

View File

@ -540,7 +540,8 @@ typedef struct _GFileInfoClass GFileInfoClass;
* and contains the time since the file was created, in seconds since the UNIX
* epoch.
*
* This corresponds to the NTFS ctime.
* This may correspond to Linux stx_btime, FreeBSD st_birthtim, NetBSD
* st_birthtime or NTFS ctime.
**/
#define G_FILE_ATTRIBUTE_TIME_CREATED "time::created" /* uint64 */

View File

@ -1048,7 +1048,13 @@ set_info_from_stat (GFileInfo *info,
#endif
#endif
#if defined (HAVE_STRUCT_STAT_ST_BIRTHTIME) && defined (HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC)
#if defined (HAVE_STATX)
if (_g_stat_has_field (statbuf, G_LOCAL_FILE_STAT_FIELD_BTIME))
{
_g_file_info_set_attribute_uint64_by_id (info, G_FILE_ATTRIBUTE_ID_TIME_CREATED, statbuf->stx_btime.tv_sec);
_g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_TIME_CREATED_USEC, statbuf->stx_btime.tv_nsec / 1000);
}
#elif defined (HAVE_STRUCT_STAT_ST_BIRTHTIME) && defined (HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC)
_g_file_info_set_attribute_uint64_by_id (info, G_FILE_ATTRIBUTE_ID_TIME_CREATED, statbuf->st_birthtime);
_g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_TIME_CREATED_USEC, statbuf->st_birthtimensec / 1000);
#elif defined (HAVE_STRUCT_STAT_ST_BIRTHTIM) && defined (HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC)
@ -1798,8 +1804,8 @@ _g_local_file_info_get (const char *basename,
}
res = g_local_file_lstat (path,
G_LOCAL_FILE_STAT_FIELD_BASIC_STATS,
G_LOCAL_FILE_STAT_FIELD_ALL,
G_LOCAL_FILE_STAT_FIELD_BASIC_STATS | G_LOCAL_FILE_STAT_FIELD_BTIME,
G_LOCAL_FILE_STAT_FIELD_ALL & (~G_LOCAL_FILE_STAT_FIELD_BTIME),
&statbuf);
if (res == -1)
@ -1848,8 +1854,8 @@ _g_local_file_info_get (const char *basename,
if (!(flags & G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS))
{
res = g_local_file_stat (path,
G_LOCAL_FILE_STAT_FIELD_BASIC_STATS,
G_LOCAL_FILE_STAT_FIELD_ALL,
G_LOCAL_FILE_STAT_FIELD_BASIC_STATS | G_LOCAL_FILE_STAT_FIELD_BTIME,
G_LOCAL_FILE_STAT_FIELD_ALL & (~G_LOCAL_FILE_STAT_FIELD_BTIME),
&statbuf2);
/* Report broken links as symlinks */
@ -2071,8 +2077,8 @@ _g_local_file_info_get_from_fd (int fd,
GFileInfo *info;
if (g_local_file_fstat (fd,
G_LOCAL_FILE_STAT_FIELD_BASIC_STATS,
G_LOCAL_FILE_STAT_FIELD_ALL,
G_LOCAL_FILE_STAT_FIELD_BASIC_STATS | G_LOCAL_FILE_STAT_FIELD_BTIME,
G_LOCAL_FILE_STAT_FIELD_ALL & (~G_LOCAL_FILE_STAT_FIELD_BTIME),
&stat_buf) == -1)
{
int errsv = errno;