]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/cdrom.cc
try xz instead of bz2 first for compressed files
[apt.git] / apt-pkg / cdrom.cc
index 2635ede760c80ea408b86bb403b835bd7104deef..dea4a88c3f6b5465e6d6d1d5854095a6222783c1 100644 (file)
 #include <iostream>
 #include <string>
 #include <vector>
-#include <sstream>
-#include <fstream>
 #include <sys/stat.h>
 #include <dirent.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <algorithm>
 #include <dlfcn.h>
+#include <iostream>
+#include <sstream>
+#include <fstream>
 
 #include<apti18n.h>
 
@@ -466,7 +467,7 @@ bool pkgCdrom::WriteSourceList(string Name,vector<string> &List,bool Source)
    // Open the stream for reading
    ifstream F((FileExists(File)?File.c_str():"/dev/null"),
              ios::in );
-   if (!F != 0)
+   if (F.fail() == true)
       return _error->Errno("ifstream::ifstream","Opening %s",File.c_str());
 
    string NewFile = File + ".new";
@@ -477,7 +478,7 @@ bool pkgCdrom::WriteSourceList(string Name,vector<string> &List,bool Source)
                           "Failed to open %s.new",File.c_str());
 
    // Create a short uri without the path
-   string ShortURI = "cdrom:[" + Name + "]/";   
+   string ShortURI = "cdrom:[" + Name + "]/";
    string ShortURI2 = "cdrom:" + Name + "/";     // For Compatibility
 
    string Type;
@@ -485,12 +486,12 @@ bool pkgCdrom::WriteSourceList(string Name,vector<string> &List,bool Source)
       Type = "deb-src";
    else
       Type = "deb";
-   
+
    char Buffer[300];
    int CurLine = 0;
    bool First = true;
    while (F.eof() == false)
-   {      
+   {
       F.getline(Buffer,sizeof(Buffer));
       CurLine++;
       if (F.fail() && !F.eof())
@@ -563,6 +564,15 @@ bool pkgCdrom::WriteSourceList(string Name,vector<string> &List,bool Source)
    return true;
 }
                                                                        /*}}}*/
+bool pkgCdrom::UnmountCDROM(std::string const &CDROM, pkgCdromStatus * const log)/*{{{*/
+{
+   if (_config->FindB("APT::CDROM::NoMount",false) == true)
+      return true;
+   if (log != NULL)
+      log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
+   return UnmountCdrom(CDROM);
+}
+                                                                       /*}}}*/
 bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, std::string &ident, pkgCdromStatus * const log, bool const interactive)/*{{{*/
 {
    // Startup
@@ -583,9 +593,7 @@ bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, s
    {
       if (interactive == true)
       {
-        if(log != NULL)
-           log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
-        UnmountCdrom(CDROM);
+        UnmountCDROM(CDROM, log);
 
         if(log != NULL)
         {
@@ -605,6 +613,9 @@ bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, s
         return _error->Error("Failed to mount the cdrom.");
    }
 
+   if (IsMounted(CDROM) == false)
+      return _error->Error("Failed to mount the cdrom.");
+
    // Hash the CD to get an ID
    if (log != NULL)
       log->Update(_("Identifying... "), STEP_IDENT);
@@ -614,6 +625,7 @@ bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, s
       ident = "";
       if (log != NULL)
         log->Update("\n");
+      UnmountCDROM(CDROM, NULL);
       return false;
    }
 
@@ -629,8 +641,11 @@ bool pkgCdrom::MountAndIdentCDROM(Configuration &Database, std::string &CDROM, s
    if (FileExists(DFile) == true)
    {
       if (ReadConfigFile(Database,DFile) == false)
+      {
+        UnmountCDROM(CDROM, NULL);
         return _error->Error("Unable to read the cdrom database %s",
                              DFile.c_str());
+      }
    }
    return true;
 }
@@ -651,13 +666,7 @@ bool pkgCdrom::Ident(string &ident, pkgCdromStatus *log)           /*{{{*/
    }
 
    // Unmount and finish
-   if (_config->FindB("APT::CDROM::NoMount",false) == false)
-   {
-      if (log != NULL)
-        log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
-      UnmountCdrom(CDROM);
-   }
-
+   UnmountCDROM(CDROM, log);
    return true;
 }
                                                                        /*}}}*/
@@ -682,11 +691,15 @@ bool pkgCdrom::Add(pkgCdromStatus *log)                                   /*{{{*/
    {
       if (log != NULL)
         log->Update("\n");
+      UnmountCDROM(CDROM, NULL);
       return false;
    }
 
    if (chdir(StartDir.c_str()) != 0)
+   {
+      UnmountCDROM(CDROM, NULL);
       return _error->Errno("chdir","Unable to change to %s", StartDir.c_str());
+   }
 
    if (_config->FindB("Debug::aptcdrom",false) == true)
    {
@@ -728,8 +741,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log)                                     /*{{{*/
 
    if (List.empty() == true && SourceList.empty() == true) 
    {
-      if (_config->FindB("APT::CDROM::NoMount",false) == false) 
-        UnmountCdrom(CDROM);
+      UnmountCDROM(CDROM, NULL);
       return _error->Error(_("Unable to locate any package files, perhaps this is not a Debian Disc or the wrong architecture?"));
    }
 
@@ -743,7 +755,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log)                                     /*{{{*/
          FileExists(InfoDir + "/info") == true)
       {
         ifstream F((InfoDir + "/info").c_str());
-        if (!F == 0)
+        if (F.good() == true)
            getline(F,Name);
 
         if (Name.empty() == false)
@@ -769,14 +781,14 @@ bool pkgCdrom::Add(pkgCdromStatus *log)                                   /*{{{*/
       {
         if(log == NULL) 
          {
-           if (_config->FindB("APT::CDROM::NoMount",false) == false) 
-              UnmountCdrom(CDROM);
+           UnmountCDROM(CDROM, NULL);
            return _error->Error("No disc name found and no way to ask for it");
         }
 
         while(true) {
            if(!log->AskCdromName(Name)) {
               // user canceld
+              UnmountCDROM(CDROM, NULL);
               return false; 
            }
            cout << "Name: '" << Name << "'" << endl;
@@ -811,9 +823,15 @@ bool pkgCdrom::Add(pkgCdromStatus *log)                                    /*{{{*/
    // check for existence and possibly create state directory for copying
    string const listDir = _config->FindDir("Dir::State::lists");
    string const partialListDir = listDir + "partial/";
-   if (CreateAPTDirectoryIfNeeded(_config->FindDir("Dir::State"), partialListDir) == false &&
-       CreateAPTDirectoryIfNeeded(listDir, partialListDir) == false)
+   mode_t const mode = umask(S_IWGRP | S_IWOTH);
+   bool const creation_fail = (CreateAPTDirectoryIfNeeded(_config->FindDir("Dir::State"), partialListDir) == false &&
+        CreateAPTDirectoryIfNeeded(listDir, partialListDir) == false);
+   umask(mode);
+   if (creation_fail == true)
+   {
+      UnmountCDROM(CDROM, NULL);
       return _error->Errno("cdrom", _("List directory %spartial is missing."), listDir.c_str());
+   }
 
    // take care of the signatures and copy them if they are ok
    // (we do this before PackageCopy as it modifies "List" and "SourceList")
@@ -827,7 +845,10 @@ bool pkgCdrom::Add(pkgCdromStatus *log)                                    /*{{{*/
    if (Copy.CopyPackages(CDROM,Name,List, log) == false ||
        SrcCopy.CopyPackages(CDROM,Name,SourceList, log) == false ||
        TransCopy.CopyTranslations(CDROM,Name,TransList, log) == false)
+   {
+      UnmountCDROM(CDROM, NULL);
       return false;
+   }
 
    // reduce the List so that it takes less space in sources.list
    ReduceSourcelist(CDROM,List);
@@ -837,13 +858,19 @@ bool pkgCdrom::Add(pkgCdromStatus *log)                                   /*{{{*/
    if (_config->FindB("APT::cdrom::NoAct",false) == false)
    {
       if (WriteDatabase(Database) == false)
+      {
+        UnmountCDROM(CDROM, NULL);
         return false;
-      
+      }
+
       if(log != NULL)
         log->Update(_("Writing new source list\n"), STEP_WRITE);
       if (WriteSourceList(Name,List,false) == false ||
          WriteSourceList(Name,SourceList,true) == false)
+      {
+        UnmountCDROM(CDROM, NULL);
         return false;
+      }
    }
 
    // Print the sourcelist entries
@@ -855,8 +882,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log)                                     /*{{{*/
       string::size_type Space = (*I).find(' ');
       if (Space == string::npos)
       {
-        if (_config->FindB("APT::CDROM::NoMount",false) == false) 
-           UnmountCdrom(CDROM);
+        UnmountCDROM(CDROM, NULL);
         return _error->Error("Internal error");
       }
 
@@ -874,8 +900,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log)                                     /*{{{*/
       string::size_type Space = (*I).find(' ');
       if (Space == string::npos)
       {
-        if (_config->FindB("APT::CDROM::NoMount",false) == false) 
-           UnmountCdrom(CDROM);
+        UnmountCDROM(CDROM, NULL);
         return _error->Error("Internal error");
       }
 
@@ -888,24 +913,22 @@ bool pkgCdrom::Add(pkgCdromStatus *log)                                   /*{{{*/
    }
 
    // Unmount and finish
-   if (_config->FindB("APT::CDROM::NoMount",false) == false) {
-      if (log != NULL)
-        log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
-      UnmountCdrom(CDROM);
-   }
-
+   UnmountCDROM(CDROM, log);
    return true;
 }
                                                                        /*}}}*/
-pkgUdevCdromDevices::pkgUdevCdromDevices()                                     /*{{{*/
-   : libudev_handle(NULL)
+pkgUdevCdromDevices::pkgUdevCdromDevices()                             /*{{{*/
+: d(NULL), libudev_handle(NULL), udev_new(NULL), udev_enumerate_add_match_property(NULL),
+   udev_enumerate_scan_devices(NULL), udev_enumerate_get_list_entry(NULL),
+   udev_device_new_from_syspath(NULL), udev_enumerate_get_udev(NULL),
+   udev_list_entry_get_name(NULL), udev_device_get_devnode(NULL),
+   udev_enumerate_new(NULL), udev_list_entry_get_next(NULL),
+   udev_device_get_property_value(NULL), udev_enumerate_add_match_sysattr(NULL)
 {
-
 }
                                                                        /*}}}*/
 
-bool
-pkgUdevCdromDevices::Dlopen()                                          /*{{{*/
+bool pkgUdevCdromDevices::Dlopen()                                     /*{{{*/
 {
    // alread open
    if(libudev_handle != NULL)
@@ -934,18 +957,14 @@ pkgUdevCdromDevices::Dlopen()                                             /*{{{*/
    return true;
 }
                                                                        /*}}}*/
-                                                                        /*{{{*/
-// convenience interface, this will just call ScanForRemovable
-vector<CdromDevice>
-pkgUdevCdromDevices::Scan()
+// convenience interface, this will just call ScanForRemovable         /*{{{*/
+vector<CdromDevice> pkgUdevCdromDevices::Scan()
 {
    bool CdromOnly = _config->FindB("APT::cdrom::CdromOnly", true);
    return ScanForRemovable(CdromOnly);
 }
                                                                        /*}}}*/
-                                                                        /*{{{*/
-vector<CdromDevice>
-pkgUdevCdromDevices::ScanForRemovable(bool CdromOnly)
+vector<CdromDevice> pkgUdevCdromDevices::ScanForRemovable(bool CdromOnly)/*{{{*/
 {
    vector<CdromDevice> cdrom_devices;
    struct udev_enumerate *enumerate;
@@ -1004,3 +1023,9 @@ pkgUdevCdromDevices::~pkgUdevCdromDevices()                             /*{{{*/
       dlclose(libudev_handle);
 }
                                                                        /*}}}*/
+
+pkgCdromStatus::pkgCdromStatus() : d(NULL), totalSteps(0) {}
+pkgCdromStatus::~pkgCdromStatus() {}
+
+pkgCdrom::pkgCdrom() : d(NULL) {}
+pkgCdrom::~pkgCdrom() {}