diff options
Diffstat (limited to 'methods')
-rw-r--r-- | methods/aptmethod.h | 31 | ||||
-rw-r--r-- | methods/copy.cc | 9 | ||||
-rw-r--r-- | methods/store.cc | 16 |
3 files changed, 35 insertions, 21 deletions
diff --git a/methods/aptmethod.h b/methods/aptmethod.h index f8a68c92b..dd488fe6f 100644 --- a/methods/aptmethod.h +++ b/methods/aptmethod.h @@ -3,9 +3,17 @@ #include <apt-pkg/acquire-method.h> #include <apt-pkg/configuration.h> +#include <apt-pkg/error.h> #include <string> +#include <sys/time.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +#include <apti18n.h> + class aptMethod : public pkgAcqMethod { char const * const Binary; @@ -42,6 +50,29 @@ 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) {} diff --git a/methods/copy.cc b/methods/copy.cc index e515b2def..49b1bae5e 100644 --- a/methods/copy.cc +++ b/methods/copy.cc @@ -79,13 +79,8 @@ bool CopyMethod::Fetch(FetchItem *Itm) From.Close(); To.Close(); - // Transfer the modification times - struct timeval times[2]; - times[0].tv_sec = Buf.st_atime; - times[1].tv_sec = Buf.st_mtime; - times[0].tv_usec = times[1].tv_usec = 0; - if (utimes(Res.Filename.c_str(), times) != 0) - return _error->Errno("utimes",_("Failed to set modification time")); + if (TransferModificationTimes(File.c_str(), Res.Filename.c_str(), Res.LastModified) == false) + return false; CalculateHashes(Itm, Res); URIDone(Res); diff --git a/methods/store.cc b/methods/store.cc index 2ad0f0177..515c63387 100644 --- a/methods/store.cc +++ b/methods/store.cc @@ -127,20 +127,8 @@ bool StoreMethod::Fetch(FetchItem *Itm) /*{{{*/ if (Failed == true) return false; - // Transfer the modification times - if (Itm->DestFile != "/dev/null") - { - struct stat Buf; - if (stat(Path.c_str(),&Buf) != 0) - return _error->Errno("stat",_("Failed to stat")); - - struct timeval times[2]; - times[0].tv_sec = Buf.st_atime; - Res.LastModified = times[1].tv_sec = Buf.st_mtime; - times[0].tv_usec = times[1].tv_usec = 0; - if (utimes(Itm->DestFile.c_str(), times) != 0) - return _error->Errno("utimes",_("Failed to set modification time")); - } + if (TransferModificationTimes(Path.c_str(), Itm->DestFile.c_str(), Res.LastModified) == false) + return false; // Return a Done response Res.TakeHashes(Hash); |