]> git.saurik.com Git - apt.git/blobdiff - apt-inst/extract.cc
merged from debian-sid
[apt.git] / apt-inst / extract.cc
index a3c06c088e712b7013514c86c34467ae8da70ed8..cd8edb27aaab462b52b6061529ab23edcb5584d0 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: extract.cc,v 1.2 2001/02/20 07:03:16 jgg Exp $
+// $Id: extract.cc,v 1.6.2.1 2004/01/16 18:58:50 mdz Exp $
 /* ######################################################################
 
    Archive Extraction Directory Stream
 /* ######################################################################
 
    Archive Extraction Directory Stream
@@ -44,9 +44,6 @@
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
-#ifdef __GNUG__
-#pragma implementation "apt-pkg/extract.h"
-#endif
 #include <apt-pkg/extract.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/debversion.h>
 #include <apt-pkg/extract.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/debversion.h>
 #include <unistd.h>
 #include <errno.h>
 #include <dirent.h>
 #include <unistd.h>
 #include <errno.h>
 #include <dirent.h>
+#include <iostream>
+#include <apti18n.h>
                                                                        /*}}}*/
                                                                        /*}}}*/
+using namespace std;
 
 static const char *TempExt = "dpkg-tmp";
 //static const char *NewExt = "dpkg-new";
 
 static const char *TempExt = "dpkg-tmp";
 //static const char *NewExt = "dpkg-new";
@@ -90,7 +90,7 @@ bool pkgExtract::DoItem(Item &Itm,int &Fd)
    for (; *I != 0 && End < FileName + sizeof(FileName); I++, End++)
       *End = *I;
    if (End + 20 >= FileName + sizeof(FileName))
    for (; *I != 0 && End < FileName + sizeof(FileName); I++, End++)
       *End = *I;
    if (End + 20 >= FileName + sizeof(FileName))
-      return _error->Error("The path %s is too long",Itm.Name);   
+      return _error->Error(_("The path %s is too long"),Itm.Name);   
    for (; End > FileName && End[-1] == '/'; End--);
    *End = 0;
    Itm.Name = FileName;
    for (; End > FileName && End[-1] == '/'; End--);
    *End = 0;
    Itm.Name = FileName;
@@ -121,7 +121,7 @@ bool pkgExtract::DoItem(Item &Itm,int &Fd)
       which case this needs to be modified anyhow.. */
    if ((RealNde->Flags & pkgFLCache::Node::Unpacked) ==
        pkgFLCache::Node::Unpacked)
       which case this needs to be modified anyhow.. */
    if ((RealNde->Flags & pkgFLCache::Node::Unpacked) ==
        pkgFLCache::Node::Unpacked)
-      return _error->Error("Unpacking %s more than once",Itm.Name);
+      return _error->Error(_("Unpacking %s more than once"),Itm.Name);
    
    if (Nde.end() == true)
       Nde = RealNde;
    
    if (Nde.end() == true)
       Nde = RealNde;
@@ -131,7 +131,7 @@ bool pkgExtract::DoItem(Item &Itm,int &Fd)
    if ((Nde->Flags & pkgFLCache::Node::Diversion) != 0)
    {
       if (Itm.Type == Item::Directory)
    if ((Nde->Flags & pkgFLCache::Node::Diversion) != 0)
    {
       if (Itm.Type == Item::Directory)
-        return _error->Error("The directory %s is diverted",Itm.Name);
+        return _error->Error(_("The directory %s is diverted"),Itm.Name);
 
       /* A package overwriting a diversion target is just the same as 
          overwriting a normally owned file and is checked for below in
 
       /* A package overwriting a diversion target is just the same as 
          overwriting a normally owned file and is checked for below in
@@ -141,8 +141,8 @@ bool pkgExtract::DoItem(Item &Itm,int &Fd)
          that is never, ever permitted */
       pkgFLCache::DiverIterator Div = Nde.Diversion();
       if (Div.DivertTo() == Nde)
          that is never, ever permitted */
       pkgFLCache::DiverIterator Div = Nde.Diversion();
       if (Div.DivertTo() == Nde)
-        return _error->Error("The package is trying to write to the "
-                             "diversion target %s/%s",Nde.DirN(),Nde.File());
+        return _error->Error(_("The package is trying to write to the "
+                             "diversion target %s/%s"),Nde.DirN(),Nde.File());
       
       // See if it is us and we are following it in the right direction
       if (Div->OwnerPkg != FLPkg.Offset() && Div.DivertFrom() == Nde)
       
       // See if it is us and we are following it in the right direction
       if (Div->OwnerPkg != FLPkg.Offset() && Div.DivertFrom() == Nde)
@@ -151,7 +151,7 @@ bool pkgExtract::DoItem(Item &Itm,int &Fd)
         End = FileName + snprintf(FileName,sizeof(FileName)-20,"%s/%s",
                                   Nde.DirN(),Nde.File());
         if (End <= FileName)
         End = FileName + snprintf(FileName,sizeof(FileName)-20,"%s/%s",
                                   Nde.DirN(),Nde.File());
         if (End <= FileName)
-           return _error->Error("The diversion path is too long");
+           return _error->Error(_("The diversion path is too long"));
       }      
    }
    
       }      
    }
    
@@ -161,7 +161,7 @@ bool pkgExtract::DoItem(Item &Itm,int &Fd)
    {
       string Res = flNoLink(Itm.Name);
       if (Res.length() > sizeof(FileName))
    {
       string Res = flNoLink(Itm.Name);
       if (Res.length() > sizeof(FileName))
-        return _error->Error("The path %s is too long",Res.c_str());
+        return _error->Error(_("The path %s is too long"),Res.c_str());
       if (Debug == true)
         clog << "Followed conf file from " << FileName << " to " << Res << endl;
       Itm.Name = strcpy(FileName,Res.c_str());      
       if (Debug == true)
         clog << "Followed conf file from " << FileName << " to " << Res << endl;
       Itm.Name = strcpy(FileName,Res.c_str());      
@@ -175,19 +175,19 @@ bool pkgExtract::DoItem(Item &Itm,int &Fd)
    {
       // This is bad news.
       if (errno != ENOENT)
    {
       // This is bad news.
       if (errno != ENOENT)
-        return _error->Errno("stat","Failed to stat %s",Itm.Name);
+        return _error->Errno("stat",_("Failed to stat %s"),Itm.Name);
       
       // See if we can recover the backup file
       if (Nde.end() == false)
       {
         snprintf(Temp,sizeof(Temp),"%s.%s",Itm.Name,TempExt);
         if (rename(Temp,Itm.Name) != 0 && errno != ENOENT)
       
       // See if we can recover the backup file
       if (Nde.end() == false)
       {
         snprintf(Temp,sizeof(Temp),"%s.%s",Itm.Name,TempExt);
         if (rename(Temp,Itm.Name) != 0 && errno != ENOENT)
-           return _error->Errno("rename","Failed to rename %s to %s",
+           return _error->Errno("rename",_("Failed to rename %s to %s"),
                                 Temp,Itm.Name);
         if (stat(Itm.Name,&LExisting) != 0)
         {
            if (errno != ENOENT)
                                 Temp,Itm.Name);
         if (stat(Itm.Name,&LExisting) != 0)
         {
            if (errno != ENOENT)
-              return _error->Errno("stat","Failed to stat %s",Itm.Name);
+              return _error->Errno("stat",_("Failed to stat %s"),Itm.Name);
         }       
         else
            EValid = true;
         }       
         else
            EValid = true;
@@ -204,7 +204,7 @@ bool pkgExtract::DoItem(Item &Itm,int &Fd)
       if (stat(Itm.Name,&Existing) != 0)
       {
         if (errno != ENOENT)
       if (stat(Itm.Name,&Existing) != 0)
       {
         if (errno != ENOENT)
-           return _error->Errno("stat","Failed to stat %s",Itm.Name);
+           return _error->Errno("stat",_("Failed to stat %s"),Itm.Name);
         Existing = LExisting;
       }      
    }
         Existing = LExisting;
       }      
    }
@@ -237,13 +237,13 @@ bool pkgExtract::DoItem(Item &Itm,int &Fd)
    if (S_ISDIR(Existing.st_mode) != 0)
    {
       if (CheckDirReplace(Itm.Name) == false)
    if (S_ISDIR(Existing.st_mode) != 0)
    {
       if (CheckDirReplace(Itm.Name) == false)
-        return _error->Error("The directory %s is being replaced by a non-directory",Itm.Name);
+        return _error->Error(_("The directory %s is being replaced by a non-directory"),Itm.Name);
    }
    
    if (Debug == true)
       clog << "Extract " << string(Itm.Name,End) << endl;
 /*   if (Count != 0)
    }
    
    if (Debug == true)
       clog << "Extract " << string(Itm.Name,End) << endl;
 /*   if (Count != 0)
-      return _error->Error("Done");*/
+      return _error->Error(_("Done"));*/
    
    return true;
 }
    
    return true;
 }
@@ -277,11 +277,11 @@ bool pkgExtract::Aborted()
       pkgFLCache::NodeIterator Nde(FLCache,FLCache.HashNode(Files));
       for (; Nde.end() == false && Files->File != Nde->File; Nde++);
       if (Nde.end() == true)
       pkgFLCache::NodeIterator Nde(FLCache,FLCache.HashNode(Files));
       for (; Nde.end() == false && Files->File != Nde->File; Nde++);
       if (Nde.end() == true)
-        return _error->Error("Failed to locate node in its hash bucket");
+        return _error->Error(_("Failed to locate node in its hash bucket"));
       
       if (snprintf(FileName,sizeof(FileName)-20,"%s/%s",
                   Nde.DirN(),Nde.File()) <= 0)
       
       if (snprintf(FileName,sizeof(FileName)-20,"%s/%s",
                   Nde.DirN(),Nde.File()) <= 0)
-        return _error->Error("The path is too long");
+        return _error->Error(_("The path is too long"));
       
       // Deal with diversions
       if ((Nde->Flags & pkgFLCache::Node::Diversion) != 0)
       
       // Deal with diversions
       if ((Nde->Flags & pkgFLCache::Node::Diversion) != 0)
@@ -294,7 +294,7 @@ bool pkgExtract::Aborted()
            Nde = Div.DivertTo();
            if (snprintf(FileName,sizeof(FileName)-20,"%s/%s",
                         Nde.DirN(),Nde.File()) <= 0)
            Nde = Div.DivertTo();
            if (snprintf(FileName,sizeof(FileName)-20,"%s/%s",
                         Nde.DirN(),Nde.File()) <= 0)
-              return _error->Error("The diversion path is too long");
+              return _error->Error(_("The diversion path is too long"));
         }
       }      
       
         }
       }      
       
@@ -372,7 +372,6 @@ bool pkgExtract::HandleOverwrites(pkgFLCache::NodeIterator Nde,
    pkgFLCache::NodeIterator TmpNde = Nde;
    unsigned long DiverOwner = 0;
    unsigned long FileGroup = Nde->File;
    pkgFLCache::NodeIterator TmpNde = Nde;
    unsigned long DiverOwner = 0;
    unsigned long FileGroup = Nde->File;
-   const char *FirstOwner = 0;
    for (; Nde.end() == false && FileGroup == Nde->File; Nde++)
    {
       if ((Nde->Flags & pkgFLCache::Node::Diversion) != 0)
    for (; Nde.end() == false && FileGroup == Nde->File; Nde++)
    {
       if ((Nde->Flags & pkgFLCache::Node::Diversion) != 0)
@@ -392,8 +391,7 @@ bool pkgExtract::HandleOverwrites(pkgFLCache::NodeIterator Nde,
          if something has already been diverted by this diversion */
       if (FPkg.Offset() == DiverOwner)
         continue;
          if something has already been diverted by this diversion */
       if (FPkg.Offset() == DiverOwner)
         continue;
-      FirstOwner = FPkg.Name();
-      
+
       // Now see if this package matches one in a replace depends
       pkgCache::DepIterator Dep = Ver.DependsList();
       bool Ok = false;
       // Now see if this package matches one in a replace depends
       pkgCache::DepIterator Dep = Ver.DependsList();
       bool Ok = false;
@@ -411,7 +409,7 @@ bool pkgExtract::HandleOverwrites(pkgFLCache::NodeIterator Nde,
         pkgCache::PkgIterator Pkg = Dep.TargetPkg();
         if (Pkg->CurrentVer == 0)
         {
         pkgCache::PkgIterator Pkg = Dep.TargetPkg();
         if (Pkg->CurrentVer == 0)
         {
-           _error->Warning("Overwrite package match with no version for %s",Pkg.Name());
+           _error->Warning(_("Overwrite package match with no version for %s"),Pkg.Name());
            continue;
         }
 
            continue;
         }
 
@@ -428,7 +426,7 @@ bool pkgExtract::HandleOverwrites(pkgFLCache::NodeIterator Nde,
       
       // Negative Hit
       if (Ok == false)
       
       // Negative Hit
       if (Ok == false)
-        return _error->Error("File %s/%s overwrites the one in the package %s",
+        return _error->Error(_("File %s/%s overwrites the one in the package %s"),
                              Nde.DirN(),Nde.File(),FPkg.Name());
    }
    
                              Nde.DirN(),Nde.File(),FPkg.Name());
    }
    
@@ -461,7 +459,7 @@ bool pkgExtract::CheckDirReplace(string Dir,unsigned int Depth)
    
    DIR *D = opendir(Dir.c_str());
    if (D == 0)
    
    DIR *D = opendir(Dir.c_str());
    if (D == 0)
-      return _error->Errno("opendir","Unable to read %s",Dir.c_str());
+      return _error->Errno("opendir",_("Unable to read %s"),Dir.c_str());
 
    string File;
    for (struct dirent *Dent = readdir(D); Dent != 0; Dent = readdir(D))
 
    string File;
    for (struct dirent *Dent = readdir(D); Dent != 0; Dent = readdir(D))
@@ -473,8 +471,8 @@ bool pkgExtract::CheckDirReplace(string Dir,unsigned int Depth)
       
       // Look up the node
       File = Dir + Dent->d_name;
       
       // Look up the node
       File = Dir + Dent->d_name;
-      pkgFLCache::NodeIterator Nde = FLCache.GetNode(File.begin(),
-                                                    File.end(),0,false,false);
+      pkgFLCache::NodeIterator Nde = FLCache.GetNode(File.c_str(),
+                                                    File.c_str() + File.length(),0,false,false);
 
       // The file is not owned by this package
       if (Nde.end() != false || Nde.RealPackage() != FLPkg)
 
       // The file is not owned by this package
       if (Nde.end() != false || Nde.RealPackage() != FLPkg)
@@ -488,7 +486,7 @@ bool pkgExtract::CheckDirReplace(string Dir,unsigned int Depth)
       if (lstat(File.c_str(),&St) != 0)
       {
         closedir(D);
       if (lstat(File.c_str(),&St) != 0)
       {
         closedir(D);
-        return _error->Errno("lstat","Unable to stat %s",File.c_str());
+        return _error->Errno("lstat",_("Unable to stat %s"),File.c_str());
       }
       
       // Recurse down directories
       }
       
       // Recurse down directories