X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/8b79c94af7f7cf2e5e5342294bc6e5a908cacabf..d415fc795a69d6a5039964e88f97561183d6ab44:/methods/aptmethod.h diff --git a/methods/aptmethod.h b/methods/aptmethod.h index cf3496e45..d3c948636 100644 --- a/methods/aptmethod.h +++ b/methods/aptmethod.h @@ -3,10 +3,18 @@ #include #include +#include #include #include +#include +#include +#include +#include + +#include + class aptMethod : public pkgAcqMethod { char const * const Binary; @@ -43,10 +51,37 @@ public: va_end(args); } + bool TransferModificationTimes(char const * const From, char const * const To, time_t &LastModified) + { + if (strcmp(To, "/dev/null") == 0) + return true; + + struct stat Buf2; + if (lstat(To, &Buf2) != 0 || S_ISLNK(Buf2.st_mode)) + return true; + + struct stat Buf; + if (stat(From, &Buf) != 0) + return _error->Errno("stat",_("Failed to stat")); + + // we don't use utimensat here for compatibility reasons: #738567 + struct timeval times[2]; + times[0].tv_sec = Buf.st_atime; + LastModified = times[1].tv_sec = Buf.st_mtime; + times[0].tv_usec = times[1].tv_usec = 0; + if (utimes(To, times) != 0) + return _error->Errno("utimes",_("Failed to set modification time")); + return true; + } + aptMethod(char const * const Binary, char const * const Ver, unsigned long const Flags) : pkgAcqMethod(Ver, Flags), Binary(Binary) { - std::locale::global(std::locale("")); + try { + std::locale::global(std::locale("")); + } catch (...) { + setlocale(LC_ALL, ""); + } } };