check the state of the FileFd before renaming as otherwise the rename
authorDavid Kalnischkies <kalnischkies@gmail.com>
Fri, 9 Jul 2010 19:46:42 +0000 (21:46 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Fri, 9 Jul 2010 19:46:42 +0000 (21:46 +0200)
will be tried twice e.g. in an "apt-get update" run and every other piece
of code closing the FileFd manual before the destructor will do it again.

apt-pkg/contrib/fileutl.cc

index 62d42e4..8f7791a 100644 (file)
@@ -843,19 +843,21 @@ bool FileFd::Close()
    bool Res = true;
    if ((Flags & AutoClose) == AutoClose)
       if (iFd >= 0 && close(iFd) != 0)
-        Res &= _error->Errno("close",_("Problem closing the file"));
-   iFd = -1;
+        Res &= _error->Errno("close",_("Problem closing the file %s"), FileName.c_str());
 
-   if ((Flags & Replace) == Replace) {
+   if ((Flags & Replace) == Replace && iFd >= 0) {
       if (rename(TemporaryFileName.c_str(), FileName.c_str()) != 0)
-        Res &= _error->Errno("rename",_("Problem renaming the file"));
+        Res &= _error->Errno("rename",_("Problem renaming the file %s to %s"), TemporaryFileName.c_str(), FileName.c_str());
+
       FileName = TemporaryFileName; // for the unlink() below.
    }
-           
+
+   iFd = -1;
+
    if ((Flags & Fail) == Fail && (Flags & DelOnFail) == DelOnFail &&
        FileName.empty() == false)
       if (unlink(FileName.c_str()) != 0)
-        Res &= _error->WarningE("unlnk",_("Problem unlinking the file"));
+        Res &= _error->WarningE("unlnk",_("Problem unlinking the file %s"), FileName.c_str());
 
 
    return Res;