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 }