]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/cdrom.cc
* doc/examples/configure-index:
[apt.git] / apt-pkg / cdrom.cc
index a91fc7181f0da038799b7716dcf994ac206c7ef1..ce1beb39b8c3b24084fadc155cf2efa2573671e0 100644 (file)
@@ -169,6 +169,23 @@ int pkgCdrom::Score(string Path)
       Res += 10;
    if (Path.find("/debian/") != string::npos)
       Res -= 10;
       Res += 10;
    if (Path.find("/debian/") != string::npos)
       Res -= 10;
+
+   // check for symlinks in the patch leading to the actual file
+   // a symlink gets a big penalty
+   struct stat Buf;
+   string statPath = flNotFile(Path);
+   string cdromPath = _config->FindDir("Acquire::cdrom::mount","/cdrom/");
+   while(statPath != cdromPath && statPath != "./") {
+      statPath.resize(statPath.size()-1);  // remove the trailing '/'
+      if (lstat(statPath.c_str(),&Buf) == 0) {
+        if(S_ISLNK(Buf.st_mode)) {
+           Res -= 60;
+           break;
+        }
+      }
+      statPath = flNotFile(statPath); // descent
+   }
+
    return Res;
 }
 
    return Res;
 }
 
@@ -405,6 +422,9 @@ bool pkgCdrom::WriteSourceList(string Name,vector<string> &List,bool Source)
    {      
       F.getline(Buffer,sizeof(Buffer));
       CurLine++;
    {      
       F.getline(Buffer,sizeof(Buffer));
       CurLine++;
+      if (F.fail() && !F.eof())
+        return _error->Error(_("Line %u too long in source list %s."),
+                             CurLine,File.c_str());
       _strtabexpand(Buffer,sizeof(Buffer));
       _strstrip(Buffer);
             
       _strtabexpand(Buffer,sizeof(Buffer));
       _strstrip(Buffer);
             
@@ -518,7 +538,7 @@ bool pkgCdrom::Ident(string &ident, pkgCdromStatus *log)
    }
    if(log) {
       msg.str("");
    }
    if(log) {
       msg.str("");
-      ioprintf(msg, _("Stored Label: %s \n"),
+      ioprintf(msg, _("Stored label: %s \n"),
               Database.Find("CD::"+ident).c_str());
       log->Update(msg.str());
    }
               Database.Find("CD::"+ident).c_str());
       log->Update(msg.str());
    }
@@ -547,7 +567,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log)
    string DFile = _config->FindFile("Dir::State::cdroms");
    if (FileExists(DFile) == true)
    {
    string DFile = _config->FindFile("Dir::State::cdroms");
    if (FileExists(DFile) == true)
    {
-      if (ReadConfigFile(Database,DFile) == false)
+      if (ReadConfigFile(Database,DFile) == false) 
         return _error->Error("Unable to read the cdrom database %s",
                              DFile.c_str());
    }
         return _error->Error("Unable to read the cdrom database %s",
                              DFile.c_str());
    }
@@ -586,7 +606,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log)
       log->Update("["+ID+"]\n");
 
    if(log) 
       log->Update("["+ID+"]\n");
 
    if(log) 
-      log->Update(_("Scanning Disc for index files..\n"),STEP_SCAN);
+      log->Update(_("Scanning disc for index files..\n"),STEP_SCAN);
    
    // Get the CD structure
    vector<string> List;
    
    // Get the CD structure
    vector<string> List;
@@ -630,8 +650,11 @@ bool pkgCdrom::Add(pkgCdromStatus *log)
       log->Update(msg.str(), STEP_SCAN);
    }
 
       log->Update(msg.str(), STEP_SCAN);
    }
 
-   if (List.size() == 0 && SourceList.size() == 0)
+   if (List.size() == 0 && SourceList.size() == 0) 
+   {
+      UnmountCdrom(CDROM);
       return _error->Error("Unable to locate any package files, perhaps this is not a Debian Disc");
       return _error->Error("Unable to locate any package files, perhaps this is not a Debian Disc");
+   }
 
    // Check if the CD is in the database
    string Name;
 
    // Check if the CD is in the database
    string Name;
@@ -667,7 +690,10 @@ bool pkgCdrom::Add(pkgCdromStatus *log)
          Name.empty() == true)
       {
         if(!log) 
          Name.empty() == true)
       {
         if(!log) 
+         {
+           UnmountCdrom(CDROM);
            return _error->Error("No disc name found and no way to ask for it");
            return _error->Error("No disc name found and no way to ask for it");
+        }
 
         while(true) {
            if(!log->AskCdromName(Name)) {
 
         while(true) {
            if(!log->AskCdromName(Name)) {
@@ -697,7 +723,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log)
    Database.Set("CD::" + ID,Name);
    if(log) {
       msg.str("");
    Database.Set("CD::" + ID,Name);
    if(log) {
       msg.str("");
-      ioprintf(msg, _("This Disc is called: \n'%s'\n"), Name.c_str());
+      ioprintf(msg, _("This disc is called: \n'%s'\n"), Name.c_str());
       log->Update(msg.str());
    }
 
       log->Update(msg.str());
    }
 
@@ -734,13 +760,16 @@ bool pkgCdrom::Add(pkgCdromStatus *log)
 
    // Print the sourcelist entries
    if(log) 
 
    // Print the sourcelist entries
    if(log) 
-      log->Update(_("Source List entries for this Disc are:\n"));
+      log->Update(_("Source list entries for this disc are:\n"));
 
    for (vector<string>::iterator I = List.begin(); I != List.end(); I++)
    {
       string::size_type Space = (*I).find(' ');
       if (Space == string::npos)
 
    for (vector<string>::iterator I = List.begin(); I != List.end(); I++)
    {
       string::size_type Space = (*I).find(' ');
       if (Space == string::npos)
+      {
+        UnmountCdrom(CDROM);
         return _error->Error("Internal error");
         return _error->Error("Internal error");
+      }
 
       if(log) {
         msg.str("");
 
       if(log) {
         msg.str("");
@@ -754,7 +783,10 @@ bool pkgCdrom::Add(pkgCdromStatus *log)
    {
       string::size_type Space = (*I).find(' ');
       if (Space == string::npos)
    {
       string::size_type Space = (*I).find(' ');
       if (Space == string::npos)
+      {
+        UnmountCdrom(CDROM);
         return _error->Error("Internal error");
         return _error->Error("Internal error");
+      }
 
       if(log) {
         msg.str("");
 
       if(log) {
         msg.str("");