| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | #include "libnetdata/libnetdata.h" |
| 4 | #include <errno.h> |
| 5 | |
| 6 | //#if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_MACOS) |
| 7 | #include <sys/stat.h> |
| 8 | |
| 9 | OS_FILE_METADATA os_get_file_metadata(const char *path) { |
| 10 | OS_FILE_METADATA metadata = {0}; |
| 11 | struct stat st; |
| 12 | |
| 13 | if (stat(path, &st) != 0) |
| 14 | return metadata; |
| 15 | |
| 16 | metadata.size_bytes = st.st_size; |
| 17 | metadata.modified_time = st.st_mtime; |
| 18 | return metadata; |
| 19 | } |
| 20 | //#endif |
| 21 | |
| 22 | //#if defined(OS_WINDOWS) |
| 23 | //#include <windows.h> |
| 24 | // |
| 25 | //OS_FILE_METADATA os_get_file_metadata(const char *path) { |
| 26 | // OS_FILE_METADATA metadata = {0}; |
| 27 | // |
| 28 | // // Convert UTF-8 path to wide-character string |
| 29 | // int wlen = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, path, -1, NULL, 0); |
| 30 | // if (wlen == 0) |
| 31 | // return metadata; |
| 32 | // |
| 33 | // wchar_t *wpath = (wchar_t *)mallocz(wlen * sizeof(wchar_t)); |
| 34 | // if (!wpath) |
| 35 | // return metadata; |
| 36 | // |
| 37 | // if (MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, path, -1, wpath, wlen) == 0) { |
| 38 | // freez(wpath); |
| 39 | // return metadata; |
| 40 | // } |
| 41 | // |
| 42 | // WIN32_FILE_ATTRIBUTE_DATA attr_data; |
| 43 | // if (!GetFileAttributesExW(wpath, GetFileExInfoStandard, &attr_data)) { |
| 44 | // freez(wpath); |
| 45 | // return metadata; |
| 46 | // } |
| 47 | // |
| 48 | // freez(wpath); |
| 49 | // |
| 50 | // // Combine high and low parts for 64-bit file size |
| 51 | // ULARGE_INTEGER file_size; |
| 52 | // file_size.HighPart = attr_data.nFileSizeHigh; |
| 53 | // file_size.LowPart = attr_data.nFileSizeLow; |
| 54 | // metadata.size_bytes = file_size.QuadPart; |
| 55 | // |
| 56 | // // Convert Windows FILETIME to Unix timestamp |
| 57 | // // Windows FILETIME is in 100-nanosecond intervals since January 1, 1601 UTC |
| 58 | // // Need to convert to seconds since January 1, 1970 UTC |
| 59 | // ULARGE_INTEGER win_time; |
| 60 | // win_time.HighPart = attr_data.ftLastWriteTime.dwHighDateTime; |
| 61 | // win_time.LowPart = attr_data.ftLastWriteTime.dwLowDateTime; |
| 62 | // |
| 63 | // // Subtract Windows epoch start (January 1, 1601 UTC) |
| 64 | // // Add Unix epoch start (January 1, 1970 UTC) |
| 65 | // // Convert from 100-nanosecond intervals to seconds |
| 66 | // const uint64_t WINDOWS_TICK = 10000000; |
| 67 | // const uint64_t SEC_TO_UNIX_EPOCH = 11644473600LL; |
| 68 | // metadata.modified_time = (time_t)((win_time.QuadPart / WINDOWS_TICK) - SEC_TO_UNIX_EPOCH); |
| 69 | // |
| 70 | // return metadata; |
| 71 | //} |
| 72 | //#endif |