Coverage Report

Created: 2026-02-09 06:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Source/cmFileTime.cxx
Line
Count
Source
1
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2
   file LICENSE.rst or https://cmake.org/licensing for details.  */
3
#include "cmFileTime.h"
4
5
#include <ctime>
6
#include <string>
7
8
// Use a platform-specific API to get file times efficiently.
9
#if !defined(_WIN32) || defined(__CYGWIN__)
10
#  include "cm_sys_stat.h"
11
#else
12
#  include <windows.h>
13
14
#  include "cmsys/Encoding.hxx"
15
#endif
16
17
bool cmFileTime::Load(std::string const& fileName)
18
0
{
19
0
#if !defined(_WIN32) || defined(__CYGWIN__)
20
  // POSIX version.  Use the stat function.
21
0
  struct stat fst;
22
0
  if (::stat(fileName.c_str(), &fst) != 0) {
23
0
    return false;
24
0
  }
25
0
#  if CMake_STAT_HAS_ST_MTIM
26
  // Nanosecond resolution
27
0
  this->Time = fst.st_mtim.tv_sec * UtPerS + fst.st_mtim.tv_nsec;
28
#  elif CMake_STAT_HAS_ST_MTIMESPEC
29
  // Nanosecond resolution
30
  this->Time = fst.st_mtimespec.tv_sec * UtPerS + fst.st_mtimespec.tv_nsec;
31
#  else
32
  // Second resolution
33
  this->Time = fst.st_mtime * UtPerS;
34
#  endif
35
#else
36
  // Windows version.  Get the modification time from extended file attributes.
37
  WIN32_FILE_ATTRIBUTE_DATA fdata;
38
  if (!GetFileAttributesExW(cmsys::Encoding::ToWide(fileName).c_str(),
39
                            GetFileExInfoStandard, &fdata)) {
40
    return false;
41
  }
42
43
  // Copy the file time to the output location.
44
  using uint64 = unsigned long long;
45
46
  this->Time = static_cast<TimeType>(
47
    (uint64(fdata.ftLastWriteTime.dwHighDateTime) << 32) +
48
    fdata.ftLastWriteTime.dwLowDateTime);
49
#endif
50
0
  return true;
51
0
}