reorder includes: add <config.h> if needed and include it at first
[ntk/apt.git] / cmdline / apt-cdrom.cc
index 379a433..8608b12 100644 (file)
@@ -11,6 +11,8 @@
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
+#include<config.h>
+
 #include <apt-pkg/cmndline.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/init.h>
 #include <apt-pkg/acquire.h>
 #include <apt-pkg/acquire-item.h>
 #include <apt-pkg/cdrom.h>
-#include <config.h>
-#include <apti18n.h>
-    
-//#include "indexcopy.h"
 
 #include <locale.h>
 #include <iostream>
 #include <dirent.h>
 #include <unistd.h>
 #include <stdio.h>
+
+#include <apti18n.h>
                                                                        /*}}}*/
 
 using namespace std;
 
-                                                                        /*{{{*/
-class pkgCdromTextStatus : public pkgCdromStatus
+class pkgCdromTextStatus : public pkgCdromStatus                       /*{{{*/
 {
 protected:
    OpTextProgress Progress;
@@ -75,7 +74,7 @@ string pkgCdromTextStatus::PromptLine(const char *Text)
 
 bool pkgCdromTextStatus::AskCdromName(string &name) 
 {
-   cout << _("Please provide a name for this Disc, such as 'Debian 2.1r1 Disk 1'") << flush;
+   cout << _("Please provide a name for this Disc, such as 'Debian 5.0.3 Disk 1'") << flush;
    name = PromptLine("");
         
    return true;
@@ -98,7 +97,41 @@ OpProgress* pkgCdromTextStatus::GetOpProgress()
 { 
    return &Progress; 
 };
+                                                                       /*}}}*/
+// SetupAutoDetect                                                     /*{{{*/
+bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i)
+{
+   bool Debug =  _config->FindB("Debug::Acquire::cdrom", false);
+
+   vector<struct CdromDevice> v = UdevCdroms.Scan();
+   if (i >= v.size())
+      return false;
+
+   if (Debug)
+      clog << "Looking at devce " << i
+          << " DeviveName: " << v[i].DeviceName 
+          << " IsMounted: '" << v[i].Mounted << "'"
+          << " MountPoint: '" << v[i].MountPath << "'"
+          << endl;
 
+   if (v[i].Mounted)
+   {
+      // set the right options
+      _config->Set("Acquire::cdrom::mount", v[i].MountPath);
+      _config->Set("APT::CDROM::NoMount", true);
+   } else {
+      string AptMountPoint = _config->FindDir("Dir::Media::MountPath");
+      if (!FileExists(AptMountPoint))
+        mkdir(AptMountPoint.c_str(), 0750);
+      if(MountCdrom(AptMountPoint, v[i].DeviceName) == false)
+        _error->Warning(_("Failed to mount '%s' to '%s'"), v[i].DeviceName.c_str(), AptMountPoint.c_str());
+      _config->Set("Acquire::cdrom::mount", AptMountPoint);
+      _config->Set("APT::CDROM::NoMount", true);
+   }
+   i++;
+
+   return true;
+}
                                                                        /*}}}*/
 
 // DoAdd - Add a new CDROM                                             /*{{{*/
@@ -109,12 +142,25 @@ OpProgress* pkgCdromTextStatus::GetOpProgress()
    verify them. Then rewrite the database files */
 bool DoAdd(CommandLine &)
 {
-   bool res = false;
+   pkgUdevCdromDevices UdevCdroms;
    pkgCdromTextStatus log;
    pkgCdrom cdrom;
-   res = cdrom.Add(&log);
+   bool res = true;
+
+   bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect", true);
+   unsigned int count = 0;
+   
+   if (AutoDetect && UdevCdroms.Dlopen())
+   {
+      while (AutoDetectCdrom(UdevCdroms, count))
+        res &= cdrom.Add(&log);
+   } else {
+      res = cdrom.Add(&log);
+   }
+
    if(res)
       cout << _("Repeat this process for the rest of the CDs in your set.") << endl;
+
    return res;
 }
                                                                        /*}}}*/
@@ -123,13 +169,26 @@ bool DoAdd(CommandLine &)
 /* */
 bool DoIdent(CommandLine &)
 {
+   pkgUdevCdromDevices UdevCdroms;
    string ident;
    pkgCdromTextStatus log;
    pkgCdrom cdrom;
-   return cdrom.Ident(ident, &log);
+   bool res = true;
+
+   bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect");
+   unsigned int count = 0;
+   
+   if (AutoDetect && UdevCdroms.Dlopen())
+   {
+      while (AutoDetectCdrom(UdevCdroms, count))
+        res &= cdrom.Ident(ident, &log);
+   } else {
+      return cdrom.Ident(ident, &log);
+   }
+   return res;
 }
                                                                        /*}}}*/
-
 // ShowHelp - Show the help screen                                     /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -158,17 +217,18 @@ int ShowHelp()
       "  -m   No mounting\n"
       "  -f   Fast mode, don't check package files\n"
       "  -a   Thorough scan mode\n"
+      "  --auto-detect Auto detect drive and mount point\n"
       "  -c=? Read this configuration file\n"
       "  -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
       "See fstab(5)\n";
    return 0;
 }
                                                                        /*}}}*/
-
-int main(int argc,const char *argv[])
+int main(int argc,const char *argv[])                                  /*{{{*/
 {
    CommandLine::Args Args[] = {
       {'h',"help","help",0},
+      {  0,"auto-detect","Acquire::cdrom::AutoDetect",0},
       {'v',"version","version",0},
       {'d',"cdrom","Acquire::cdrom::mount",CommandLine::HasArg},
       {'r',"rename","APT::CDROM::Rename",0},
@@ -206,19 +266,18 @@ int main(int argc,const char *argv[])
       return ShowHelp();
 
    // Deal with stdout not being a tty
-   if (isatty(STDOUT_FILENO) && _config->FindI("quiet",0) < 1)
+   if (isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
       _config->Set("quiet","1");
    
    // Match the operation
    CmdL.DispatchArg(Cmds);
 
    // Print any errors or warnings found during parsing
-   if (_error->empty() == false)
-   {
-      bool Errors = _error->PendingError();
+   bool const Errors = _error->PendingError();
+   if (_config->FindI("quiet",0) > 0)
       _error->DumpErrors();
-      return Errors == true?100:0;
-   }
-   
-   return 0;
+   else
+      _error->DumpErrors(GlobalError::DEBUG);
+   return Errors == true ? 100 : 0;
 }
+                                                                       /*}}}*/