ntdll: Add a helper function to set file times.
This commit is contained in:
parent
aacc450955
commit
7b704102a8
|
@ -1558,6 +1558,42 @@ NTSTATUS WINAPI NtSetVolumeInformationFile(
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NTSTATUS set_file_times( int fd, const LARGE_INTEGER *mtime, const LARGE_INTEGER *atime )
|
||||||
|
{
|
||||||
|
struct timeval tv[2];
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (!atime->QuadPart || !mtime->QuadPart)
|
||||||
|
{
|
||||||
|
|
||||||
|
tv[0].tv_sec = tv[0].tv_usec = 0;
|
||||||
|
tv[1].tv_sec = tv[1].tv_usec = 0;
|
||||||
|
if (!fstat( fd, &st ))
|
||||||
|
{
|
||||||
|
tv[0].tv_sec = st.st_atime;
|
||||||
|
tv[1].tv_sec = st.st_mtime;
|
||||||
|
#ifdef HAVE_STRUCT_STAT_ST_ATIM
|
||||||
|
tv[0].tv_usec = st.st_atim.tv_nsec / 1000;
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_STRUCT_STAT_ST_MTIM
|
||||||
|
tv[1].tv_usec = st.st_mtim.tv_nsec / 1000;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (atime->QuadPart)
|
||||||
|
{
|
||||||
|
tv[0].tv_sec = atime->QuadPart / 10000000 - SECS_1601_TO_1970;
|
||||||
|
tv[0].tv_usec = (atime->QuadPart % 10000000) / 10;
|
||||||
|
}
|
||||||
|
if (mtime->QuadPart)
|
||||||
|
{
|
||||||
|
tv[1].tv_sec = mtime->QuadPart / 10000000 - SECS_1601_TO_1970;
|
||||||
|
tv[1].tv_usec = (mtime->QuadPart % 10000000) / 10;
|
||||||
|
}
|
||||||
|
if (!futimes( fd, tv )) return STATUS_SUCCESS;
|
||||||
|
return FILE_GetNtStatus();
|
||||||
|
}
|
||||||
|
|
||||||
static inline void get_file_times( const struct stat *st, LARGE_INTEGER *mtime, LARGE_INTEGER *ctime,
|
static inline void get_file_times( const struct stat *st, LARGE_INTEGER *mtime, LARGE_INTEGER *ctime,
|
||||||
LARGE_INTEGER *atime, LARGE_INTEGER *creation )
|
LARGE_INTEGER *atime, LARGE_INTEGER *creation )
|
||||||
{
|
{
|
||||||
|
@ -2047,36 +2083,7 @@ NTSTATUS WINAPI NtSetInformationFile(HANDLE handle, PIO_STATUS_BLOCK io,
|
||||||
return io->u.Status;
|
return io->u.Status;
|
||||||
|
|
||||||
if (info->LastAccessTime.QuadPart || info->LastWriteTime.QuadPart)
|
if (info->LastAccessTime.QuadPart || info->LastWriteTime.QuadPart)
|
||||||
{
|
io->u.Status = set_file_times( fd, &info->LastAccessTime, &info->LastWriteTime );
|
||||||
struct timeval tv[2];
|
|
||||||
|
|
||||||
if (!info->LastAccessTime.QuadPart || !info->LastWriteTime.QuadPart)
|
|
||||||
{
|
|
||||||
|
|
||||||
tv[0].tv_sec = tv[0].tv_usec = 0;
|
|
||||||
tv[1].tv_sec = tv[1].tv_usec = 0;
|
|
||||||
if (!fstat( fd, &st ))
|
|
||||||
{
|
|
||||||
tv[0].tv_sec = st.st_atime;
|
|
||||||
tv[1].tv_sec = st.st_mtime;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (info->LastAccessTime.QuadPart)
|
|
||||||
{
|
|
||||||
ULONGLONG sec = info->LastAccessTime.QuadPart / 10000000;
|
|
||||||
UINT nsec = info->LastAccessTime.QuadPart % 10000000;
|
|
||||||
tv[0].tv_sec = sec - SECS_1601_TO_1970;
|
|
||||||
tv[0].tv_usec = nsec / 10;
|
|
||||||
}
|
|
||||||
if (info->LastWriteTime.QuadPart)
|
|
||||||
{
|
|
||||||
ULONGLONG sec = info->LastWriteTime.QuadPart / 10000000;
|
|
||||||
UINT nsec = info->LastWriteTime.QuadPart % 10000000;
|
|
||||||
tv[1].tv_sec = sec - SECS_1601_TO_1970;
|
|
||||||
tv[1].tv_usec = nsec / 10;
|
|
||||||
}
|
|
||||||
if (futimes( fd, tv ) == -1) io->u.Status = FILE_GetNtStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (io->u.Status == STATUS_SUCCESS && info->FileAttributes)
|
if (io->u.Status == STATUS_SUCCESS && info->FileAttributes)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue