New changes
authorArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:51:43 +0000 (16:51 +0000)
committerArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:51:43 +0000 (16:51 +0000)
Author: jgg
Date: 1998-11-27 04:49:42 GMT
New changes

cmdline/apt-cdrom.cc

index 1839fda..fe7d4d5 100644 (file)
@@ -1,8 +1,12 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: apt-cdrom.cc,v 1.1 1998/11/27 01:52:56 jgg Exp $
+// $Id: apt-cdrom.cc,v 1.2 1998/11/27 04:49:42 jgg Exp $
 /* ######################################################################
    
+   APT CDROM - Tool for handling APT's CDROM database.
+   
+   Currently the only option is 'add' which will take the current CD
+   in the drive and add it into the database.
    
    ##################################################################### */
                                                                        /*}}}*/
@@ -18,6 +22,7 @@
 #include <config.h>
 
 #include <iostream>
+#include <fstream>
 #include <vector>
 #include <algorithm>
 #include <sys/wait.h>
@@ -43,11 +48,11 @@ bool UnmountCdrom(string Path)
    if (Child == 0)
    {
       // Make all the fds /dev/null
-      for (int I = 0; I != 10;)
+      for (int I = 0; I != 10; I++)
         close(I);
-      for (int I = 0; I != 3;)
+      for (int I = 0; I != 3; I++)
         dup2(open("/dev/null",O_RDWR),I);
-      
+
       const char *Args[10];
       Args[0] = "umount";
       Args[1] = Path.c_str();
@@ -84,9 +89,9 @@ bool MountCdrom(string Path)
    if (Child == 0)
    {
       // Make all the fds /dev/null
-      for (int I = 0; I != 10;)
+      for (int I = 0; I != 10; I++)
         close(I);      
-      for (int I = 0; I != 3;)
+      for (int I = 0; I != 3; I++)
         dup2(open("/dev/null",O_RDWR),I);
       
       const char *Args[10];
@@ -261,7 +266,10 @@ bool CopyPackages(string CDROM,string Name,vector<string> &List)
       char S[400];
       sprintf(S,"cdrom:%s/%sPackages",Name.c_str(),(*I).c_str() + CDROM.length());
       string TargetF = _config->FindDir("Dir::State::lists") + "partial/";
-      FileFd Target(TargetF + URItoFileName(S),FileFd::WriteEmpty);      
+      TargetF += URItoFileName(S);
+      if (_config->FindB("APT::CDROM::NoAct",false) == true)
+        TargetF = "/dev/null";
+      FileFd Target(TargetF,FileFd::WriteEmpty);      
       if (_error->PendingError() == true)
         return false;
       
@@ -522,6 +530,56 @@ bool ConvertToSourcelist(string CD,vector<string> &List)
    }
 }
                                                                        /*}}}*/
+// WriteDatabase - Write the CDROM Database file                       /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool WriteDatabase(Configuration &Cnf)
+{
+   string DFile = _config->FindFile("Dir::State::cdroms");
+
+   ofstream Out(string(DFile + ".new").c_str());
+   if (!Out)
+      return _error->Error("Failed to open %s.new",DFile.c_str());
+   
+   /* Write out all of the configuration directives by walking the
+      configuration tree */
+   const Configuration::Item *Top = Cnf.Tree(0);
+   for (; Top != 0;)
+   {
+      // Print the config entry
+      if (Top->Value.empty() == false)
+        Out <<  Top->FullTag() + " \"" << Top->Value << "\";" << endl;
+      
+      if (Top->Child != 0)
+      {
+        Top = Top->Child;
+        continue;
+      }
+      
+      while (Top != 0 && Top->Next == 0)
+        Top = Top->Parent;
+      if (Top != 0)
+        Top = Top->Next;
+   }   
+
+   Out.close();
+   
+   rename(DFile.c_str(),string(DFile + '~').c_str());
+   if (rename(string(DFile + ".new").c_str(),DFile.c_str()) != 0)
+      return _error->Errno("rename","Failed to rename %s.new to %s",
+                          DFile.c_str(),DFile.c_str());
+
+   return true;
+}
+                                                                       /*}}}*/
+// WriteSourceList - Write an updated sourcelist                       /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool WriteSourceList(string Name,vector<string> &List)
+{
+   return true;
+}
+                                                                       /*}}}*/
 
 // Prompt - Simple prompt                                              /*{{{*/
 // ---------------------------------------------------------------------
@@ -572,9 +630,9 @@ bool DoAdd(CommandLine &)
    {
       cout << "Unmounting CD-ROM" << endl;
       UnmountCdrom(CDROM);
-   
+
       // Mount the new CDROM
-      Prompt("Please insert a CD-ROM and press any key");
+      Prompt("Please insert a Disc in the drive and press any key");
       cout << "Mounting CD-ROM" << endl;
       if (MountCdrom(CDROM) == false)
       {
@@ -584,7 +642,7 @@ bool DoAdd(CommandLine &)
    }
    
    // Hash the CD to get an ID
-   cout << "Indentifying.. " << flush;
+   cout << "Identifying.. " << flush;
    string ID;
    if (IdentCdrom(CDROM,ID) == false)
       return false;
@@ -616,6 +674,7 @@ bool DoAdd(CommandLine &)
    }
    else
       Name = Database.Find("CD::" + ID);
+   Database.Set("CD::" + ID,Name);
    cout << "This Disc is called '" << Name << "'" << endl;
    
    // Copy the package files to the state directory
@@ -628,6 +687,13 @@ bool DoAdd(CommandLine &)
    cout << "Source List entires for this Disc are:" << endl;
    for (vector<string>::iterator I = List.begin(); I != List.end(); I++)
       cout << "deb \"cdrom:" << Name << "/\" " << *I << endl;
+
+   // Write the database and sourcelist
+   if (_config->FindB("APT::cdrom::NoAct",false) == false)
+   {
+      if (WriteDatabase(Database) == false)
+        return false;
+   }
    
    return true;
 }
@@ -655,6 +721,7 @@ int ShowHelp()
    cout << "  -d   CD-ROM mount point" << endl;
    cout << "  -r   Rename a recognized CD-ROM" << endl;
    cout << "  -m   No mounting" << endl;
+   cout << "  -f   Fast mode, don't check package files" << endl;
    cout << "  -c=? Read this configuration file" << endl;
    cout << "  -o=? Set an arbitary configuration option, ie -o dir::cache=/tmp" << endl;
    cout << "See fstab(5)" << endl;
@@ -670,6 +737,9 @@ int main(int argc,const char *argv[])
       {'r',"rename","APT::CDROM::Rename",0},
       {'m',"no-mount","APT::CDROM::NoMount",0},
       {'f',"fast","APT::CDROM::Fast",0},
+      {'n',"just-print","APT::CDROM::NoAct",0},      
+      {'n',"recon","APT::CDROM::NoAct",0},      
+      {'n',"no-act","APT::CDROM::NoAct",0},      
       {'c',"config-file",0,CommandLine::ConfigFile},
       {'o',"option",0,CommandLine::ArbItem},
       {0,0,0,0}};