File indexing completed on 2024-05-12 04:39:41
0001 /* 0002 SPDX-FileCopyrightText: 2003-2005 Jaroslaw Staniek <staniek@kde.org> 0003 SPDX-FileCopyrightText: 2005 Christian Ehrlicher <Ch.Ehrlicher@gmx.de> 0004 SPDX-FileCopyrightText: 2014 Kevin Funk <kfunk@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.0-or-later 0007 */ 0008 0009 #include "helper.h" 0010 0011 #include <QDateTime> 0012 0013 #ifndef Q_OS_WIN 0014 #include <sys/time.h> 0015 #else 0016 #include <windows.h> 0017 #include <winsock2.h> 0018 #endif 0019 0020 namespace { 0021 0022 #ifdef Q_OS_WIN 0023 0024 // Copied from kdewin.git's src/time.c 0025 0026 #define KDE_SECONDS_SINCE_1601 11644473600LL 0027 #define KDE_USEC_IN_SEC 1000000LL 0028 0029 void UnixTimevalToFileTime(struct timeval t, LPFILETIME pft) 0030 { 0031 LONGLONG ll; 0032 0033 ll = Int32x32To64(t.tv_sec, KDE_USEC_IN_SEC*10) + t.tv_usec*10 + KDE_SECONDS_SINCE_1601*KDE_USEC_IN_SEC*10; 0034 pft->dwLowDateTime = (DWORD)ll; 0035 pft->dwHighDateTime = ll >> 32; 0036 } 0037 0038 int utimes(const char *filename, const struct timeval times[2]) 0039 { 0040 FILETIME LastAccessTime; 0041 FILETIME LastModificationTime; 0042 HANDLE hFile; 0043 0044 if(times) { 0045 UnixTimevalToFileTime(times[0], &LastAccessTime); 0046 UnixTimevalToFileTime(times[1], &LastModificationTime); 0047 } 0048 else { 0049 GetSystemTimeAsFileTime(&LastAccessTime); 0050 GetSystemTimeAsFileTime(&LastModificationTime); 0051 } 0052 0053 hFile=CreateFileA(filename, FILE_WRITE_ATTRIBUTES, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, 0054 NULL, OPEN_EXISTING, 0, NULL); 0055 if(hFile==INVALID_HANDLE_VALUE) { 0056 switch(GetLastError()) { 0057 case ERROR_FILE_NOT_FOUND: 0058 errno=ENOENT; 0059 break; 0060 case ERROR_PATH_NOT_FOUND: 0061 case ERROR_INVALID_DRIVE: 0062 errno=ENOTDIR; 0063 break; 0064 case ERROR_ACCESS_DENIED: 0065 errno=EACCES; 0066 break; 0067 default: 0068 errno=ENOENT; /*what other errors can occur? */ 0069 } 0070 return -1; 0071 } 0072 0073 if(!SetFileTime(hFile, NULL, &LastAccessTime, &LastModificationTime)) { 0074 /*can this happen? */ 0075 errno=ENOENT; 0076 return -1; 0077 } 0078 CloseHandle(hFile); 0079 return 0; 0080 } 0081 0082 #endif 0083 0084 } 0085 0086 int Helper::changeAccessAndModificationTime(const QString& filename, 0087 const QDateTime& accessTime, const QDateTime& modificationTime) 0088 { 0089 struct timeval times[2]; 0090 times[0].tv_usec = 0; 0091 times[0].tv_sec = accessTime.toSecsSinceEpoch(); 0092 times[1].tv_usec = 0; 0093 times[1].tv_sec = modificationTime.toSecsSinceEpoch(); 0094 return utimes(filename.toLocal8Bit().constData(), times); 0095 }