| // Copyright 2023 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "dlp/file_id.h" |
| |
| #include <fcntl.h> |
| #include <string> |
| #include <sys/stat.h> |
| |
| #include <base/logging.h> |
| #include <base/time/time.h> |
| |
| namespace dlp { |
| |
| namespace { |
| // Converts a statx_timestamp struct to time_t. |
| time_t ConvertStatxTimestampToTimeT(const struct statx_timestamp& sts) { |
| struct timespec ts; |
| ts.tv_sec = sts.tv_sec; |
| ts.tv_nsec = sts.tv_nsec; |
| return base::Time::FromTimeSpec(ts).ToTimeT(); |
| } |
| |
| } // namespace |
| |
| FileId GetFileId(const std::string& path) { |
| struct statx file_statx; |
| if (statx(AT_FDCWD, path.c_str(), AT_STATX_SYNC_AS_STAT, |
| STATX_INO | STATX_BTIME, &file_statx) != 0) { |
| PLOG(ERROR) << "Could not access " << path; |
| return {0, 0}; |
| } |
| if (!(file_statx.stx_mask & STATX_BTIME) || |
| !(file_statx.stx_mask & STATX_INO)) { |
| PLOG(ERROR) << "statx failed"; |
| return {0, 0}; |
| } |
| return std::make_pair(file_statx.stx_ino, |
| ConvertStatxTimestampToTimeT(file_statx.stx_btime)); |
| } |
| |
| } // namespace dlp |