From 246bbb611d4cd5e2a13ecffb6cbe0e76390eae6f Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Mon, 10 Feb 2014 21:52:38 +0100 Subject: [PATCH] use utimes instead of utimensat/futimens cppcheck complains about the obsolete utime as it was removed in POSIX1.2008 and recommends usage of utimensat/futimens instead as those are in POSIX and so commit 9ce3cfc9 switched to them. It is just that they aren't as portable as the standard suggests: At least our kFreeBSD and Hurd ports stumble over it at runtime. So to make both, the ports and cppcheck happy, we use utimes instead. Closes: 738567 --- apt-inst/dirstream.cc | 9 +++++---- ftparchive/multicompress.cc | 3 ++- methods/copy.cc | 14 ++++++-------- methods/ftp.cc | 18 +++++++++--------- methods/gzip.cc | 22 ++++++++-------------- methods/https.cc | 6 +++--- methods/rred.cc | 9 +++++---- methods/rsh.cc | 18 +++++++++--------- methods/server.cc | 12 ++++++------ 9 files changed, 53 insertions(+), 58 deletions(-) diff --git a/apt-inst/dirstream.cc b/apt-inst/dirstream.cc index b62bdcae1..e06c30a57 100644 --- a/apt-inst/dirstream.cc +++ b/apt-inst/dirstream.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -95,11 +96,11 @@ bool pkgDirStream::FinishedFile(Item &Itm,int Fd) /* Set the modification times. The only way it can fail is if someone has futzed with our file, which is intolerable :> */ - struct timespec times[2]; + struct timeval times[2]; times[0].tv_sec = times[1].tv_sec = Itm.MTime; - times[0].tv_nsec = times[1].tv_nsec = 0; - if (futimens(Fd, times) != 0) - _error->Errno("futimens", "Failed to set modification time for %s",Itm.Name); + times[0].tv_usec = times[1].tv_usec = 0; + if (utimes(Itm.Name, times) != 0) + _error->Errno("utimes", "Failed to set modification time for %s",Itm.Name); if (close(Fd) != 0) return _error->Errno("close",_("Failed to close file %s"),Itm.Name); diff --git a/ftparchive/multicompress.cc b/ftparchive/multicompress.cc index c1bd6037a..1555d2f2d 100644 --- a/ftparchive/multicompress.cc +++ b/ftparchive/multicompress.cc @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -237,7 +238,7 @@ bool MultiCompress::Finalize(unsigned long long &OutSize) if (UpdateMTime > 0 && (Now - St.st_mtime > (signed)UpdateMTime || St.st_mtime > Now)) { - utimensat(AT_FDCWD, I->Output.c_str(), NULL, AT_SYMLINK_NOFOLLOW); + utimes(I->Output.c_str(), NULL); Changed = true; } } diff --git a/methods/copy.cc b/methods/copy.cc index 744cc2b51..f2a8f9ed8 100644 --- a/methods/copy.cc +++ b/methods/copy.cc @@ -18,6 +18,7 @@ #include #include +#include #include #include /*}}}*/ @@ -70,18 +71,15 @@ bool CopyMethod::Fetch(FetchItem *Itm) } From.Close(); + To.Close(); // Transfer the modification times - struct timespec times[2]; + struct timeval times[2]; times[0].tv_sec = Buf.st_atime; times[1].tv_sec = Buf.st_mtime; - times[0].tv_nsec = times[1].tv_nsec = 0; - if (futimens(To.Fd(), times) != 0) - { - To.OpFail(); - return _error->Errno("futimens",_("Failed to set modification time")); - } - To.Close(); + 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")); Hashes Hash; FileFd Fd(Res.Filename, FileFd::ReadOnly); diff --git a/methods/ftp.cc b/methods/ftp.cc index 2d05364d5..70bf4f607 100644 --- a/methods/ftp.cc +++ b/methods/ftp.cc @@ -954,11 +954,11 @@ void FtpMethod::SigTerm(int) _exit(100); // Timestamp - struct timespec times[2]; + struct timeval times[2]; times[0].tv_sec = FailTime; times[1].tv_sec = FailTime; - times[0].tv_nsec = times[1].tv_nsec = 0; - futimens(FailFd, times); + times[0].tv_usec = times[1].tv_usec = 0; + utimes(FailFile.c_str(), times); close(FailFd); @@ -1062,11 +1062,11 @@ bool FtpMethod::Fetch(FetchItem *Itm) Fd.Close(); // Timestamp - struct timespec times[2]; + struct timeval times[2]; times[0].tv_sec = FailTime; times[1].tv_sec = FailTime; - times[0].tv_nsec = times[1].tv_nsec = 0; - futimens(FailFd, times); + times[0].tv_usec = times[1].tv_usec = 0; + utimes(FailFile.c_str(), times); // If the file is missing we hard fail and delete the destfile // otherwise transient fail @@ -1081,11 +1081,11 @@ bool FtpMethod::Fetch(FetchItem *Itm) Res.Size = Fd.Size(); // Timestamp - struct timespec times[2]; + struct timeval times[2]; times[0].tv_sec = FailTime; times[1].tv_sec = FailTime; - times[0].tv_nsec = times[1].tv_nsec = 0; - futimens(Fd.Fd(), times); + times[0].tv_usec = times[1].tv_usec = 0; + utimes(Fd.Name().c_str(), times); FailFd = -1; } diff --git a/methods/gzip.cc b/methods/gzip.cc index f1edb353b..a2844e969 100644 --- a/methods/gzip.cc +++ b/methods/gzip.cc @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -93,6 +94,8 @@ bool GzipMethod::Fetch(FetchItem *Itm) } From.Close(); + Res.Size = To.FileSize(); + To.Close(); if (Failed == true) return false; @@ -102,23 +105,14 @@ bool GzipMethod::Fetch(FetchItem *Itm) if (stat(Path.c_str(),&Buf) != 0) return _error->Errno("stat",_("Failed to stat")); - struct timespec times[2]; + struct timeval times[2]; times[0].tv_sec = Buf.st_atime; - times[1].tv_sec = Buf.st_mtime; - times[0].tv_nsec = times[1].tv_nsec = 0; - if (futimens(To.Fd(), times) != 0) - { - To.OpFail(); - return _error->Errno("futimens",_("Failed to set modification time")); - } - Res.Size = To.FileSize(); - To.Close(); - - if (stat(Itm->DestFile.c_str(),&Buf) != 0) - return _error->Errno("stat",_("Failed to stat")); + 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")); // Return a Done response - Res.LastModified = Buf.st_mtime; Res.TakeHashes(Hash); URIDone(Res); diff --git a/methods/https.cc b/methods/https.cc index e16e36339..146b2bfb8 100644 --- a/methods/https.cc +++ b/methods/https.cc @@ -404,11 +404,11 @@ bool HttpsMethod::Fetch(FetchItem *Itm) curl_easy_getinfo(curl, CURLINFO_FILETIME, &Res.LastModified); if (Res.LastModified != -1) { - struct timespec times[2]; + struct timeval times[2]; times[0].tv_sec = Res.LastModified; times[1].tv_sec = Res.LastModified; - times[0].tv_nsec = times[1].tv_nsec = 0; - futimens(File->Fd(), times); + times[0].tv_usec = times[1].tv_usec = 0; + utimes(File->Name().c_str(), times); } else Res.LastModified = resultStat.st_mtime; diff --git a/methods/rred.cc b/methods/rred.cc index f7dac3c19..fe7ef7322 100644 --- a/methods/rred.cc +++ b/methods/rred.cc @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -597,12 +598,12 @@ class RredMethod : public pkgAcqMethod { stat(patch_name.c_str(), &bufpatch) != 0) return _error->Errno("stat", _("Failed to stat")); - struct timespec times[2]; + struct timeval times[2]; times[0].tv_sec = bufbase.st_atime; times[1].tv_sec = bufpatch.st_mtime; - times[0].tv_nsec = times[1].tv_nsec = 0; - if (utimensat(AT_FDCWD, Itm->DestFile.c_str(), times, 0) != 0) - return _error->Errno("utimensat",_("Failed to set modification time")); + 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 (stat(Itm->DestFile.c_str(), &bufbase) != 0) return _error->Errno("stat", _("Failed to stat")); diff --git a/methods/rsh.cc b/methods/rsh.cc index a441220bf..4e1aaea26 100644 --- a/methods/rsh.cc +++ b/methods/rsh.cc @@ -396,11 +396,11 @@ void RSHMethod::SigTerm(int sig) _exit(100); // Transfer the modification times - struct timespec times[2]; + struct timeval times[2]; times[0].tv_sec = FailTime; times[1].tv_sec = FailTime; - times[0].tv_nsec = times[1].tv_nsec = 0; - futimens(FailFd, times); + times[0].tv_usec = times[1].tv_usec = 0; + utimes(FailFile.c_str(), times); close(FailFd); _exit(100); @@ -488,11 +488,11 @@ bool RSHMethod::Fetch(FetchItem *Itm) Fd.Close(); // Timestamp - struct timespec times[2]; + struct timeval times[2]; times[0].tv_sec = FailTime; times[1].tv_sec = FailTime; - times[0].tv_nsec = times[1].tv_nsec = 0; - futimens(FailFd, times); + times[0].tv_usec = times[1].tv_usec = 0; + utimes(FailFile.c_str(), times); // If the file is missing we hard fail otherwise transient fail if (Missing == true) @@ -502,11 +502,11 @@ bool RSHMethod::Fetch(FetchItem *Itm) } Res.Size = Fd.Size(); - struct timespec times[2]; + struct timeval times[2]; times[0].tv_sec = FailTime; times[1].tv_sec = FailTime; - times[0].tv_nsec = times[1].tv_nsec = 0; - futimens(Fd.Fd(), times); + times[0].tv_usec = times[1].tv_usec = 0; + utimes(Fd.Name().c_str(), times); FailFd = -1; } diff --git a/methods/server.cc b/methods/server.cc index e12c23c07..76faa7e7f 100644 --- a/methods/server.cc +++ b/methods/server.cc @@ -369,11 +369,11 @@ void ServerMethod::SigTerm(int) if (FailFd == -1) _exit(100); - struct timespec times[2]; + struct timeval times[2]; times[0].tv_sec = FailTime; times[1].tv_sec = FailTime; - times[0].tv_nsec = times[1].tv_nsec = 0; - futimens(FailFd, times); + times[0].tv_usec = times[1].tv_usec = 0; + utimes(FailFile.c_str(), times); close(FailFd); _exit(100); @@ -539,10 +539,10 @@ int ServerMethod::Loop() File = 0; // Timestamp - struct timespec times[2]; + struct timeval times[2]; times[0].tv_sec = times[1].tv_sec = Server->Date; - times[0].tv_nsec = times[1].tv_nsec = 0; - utimensat(AT_FDCWD, Queue->DestFile.c_str(), times, AT_SYMLINK_NOFOLLOW); + times[0].tv_usec = times[1].tv_usec = 0; + utimes(Queue->DestFile.c_str(), times); // Send status to APT if (Result == true) -- 2.45.2