X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/7834cb579fe88a11bd3850363bbd4c77797581bb..70d73d7e0c05939443131ed815fabcd0b087483d:/cmdline/apt-cdrom.cc diff --git a/cmdline/apt-cdrom.cc b/cmdline/apt-cdrom.cc index 35a024a10..0c948098b 100644 --- a/cmdline/apt-cdrom.cc +++ b/cmdline/apt-cdrom.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: apt-cdrom.cc,v 1.33 2000/01/16 05:36:17 jgg Exp $ +// $Id: apt-cdrom.cc,v 1.37 2001/03/13 05:23:42 jgg Exp $ /* ###################################################################### APT CDROM - Tool for handling APT's CDROM database. @@ -19,7 +19,8 @@ #include #include #include - +#include + #include "indexcopy.h" #include @@ -119,7 +120,7 @@ bool FindPackages(string CD,vector &List,vector &SList, break; if (chdir(CD.c_str()) != 0) - return _error->Errno("chdir","Unable to change to ",CD.c_str()); + return _error->Errno("chdir","Unable to change to %s",CD.c_str()); }; closedir(D); @@ -133,7 +134,8 @@ bool FindPackages(string CD,vector &List,vector &SList, bool DropBinaryArch(vector &List) { char S[300]; - sprintf(S,"/binary-%s/",_config->Find("Apt::Architecture").c_str()); + snprintf(S,sizeof(S),"/binary-%s/", + _config->Find("Apt::Architecture").c_str()); for (unsigned int I = 0; I < List.size(); I++) { @@ -172,25 +174,27 @@ int Score(string Path) { int Res = 0; if (Path.find("stable/") != string::npos) - Res += 2; + Res += 29; if (Path.find("/binary-") != string::npos) - Res += 2; + Res += 20; if (Path.find("frozen/") != string::npos) - Res += 2; + Res += 28; + if (Path.find("unstable/") != string::npos) + Res += 27; if (Path.find("/dists/") != string::npos) - Res += 4; + Res += 40; if (Path.find("/main/") != string::npos) - Res += 2; + Res += 20; if (Path.find("/contrib/") != string::npos) - Res += 2; + Res += 20; if (Path.find("/non-free/") != string::npos) - Res += 2; + Res += 20; if (Path.find("/non-US/") != string::npos) - Res += 2; + Res += 20; if (Path.find("/source/") != string::npos) - Res += 1; + Res += 10; if (Path.find("/debian/") != string::npos) - Res -= 1; + Res -= 10; return Res; } /*}}}*/ @@ -253,7 +257,7 @@ bool DropRepeats(vector &List,const char *Name) // --------------------------------------------------------------------- /* This takes the list of source list expressed entires and collects similar ones to form a single entry for each dist */ -bool ReduceSourcelist(string CD,vector &List) +void ReduceSourcelist(string CD,vector &List) { sort(List.begin(),List.end()); @@ -267,8 +271,9 @@ bool ReduceSourcelist(string CD,vector &List) string::size_type SSpace = (*I).find(' ',Space + 1); if (SSpace == string::npos) continue; - + string Word1 = string(*I,Space,SSpace-Space); + string Prefix = string(*I,0,Space); for (vector::iterator J = List.begin(); J != I; J++) { // Find a space.. @@ -279,6 +284,8 @@ bool ReduceSourcelist(string CD,vector &List) if (SSpace2 == string::npos) continue; + if (string(*J,0,Space2) != Prefix) + continue; if (string(*J,Space2,SSpace2-Space2) != Word1) continue; @@ -356,7 +363,8 @@ bool WriteSourceList(string Name,vector &List,bool Source) string File = _config->FindFile("Dir::Etc::sourcelist"); // Open the stream for reading - ifstream F(File.c_str(),ios::in | ios::nocreate); + ifstream F((FileExists(File)?File.c_str():"/dev/null"), + ios::in | ios::nocreate); if (!F != 0) return _error->Errno("ifstream::ifstream","Opening %s",File.c_str()); @@ -557,7 +565,7 @@ bool DoAdd(CommandLine &) cout << "Found " << List.size() << " package indexes and " << sList.size() << " source indexes." << endl; - if (List.size() == 0) + if (List.size() == 0 && sList.size() == 0) return _error->Error("Unable to locate any package files, perhaps this is not a Debian Disc"); // Check if the CD is in the database @@ -575,6 +583,12 @@ bool DoAdd(CommandLine &) if (Name.empty() == false) { + // Escape special characters + string::iterator J = Name.begin(); + for (; J != Name.end(); J++) + if (*J == '"' || *J == ']' || *J == '[') + *J = '_'; + cout << "Found label '" << Name << "'" << endl; Database.Set("CD::" + ID + "::Label",Name); } @@ -589,8 +603,8 @@ bool DoAdd(CommandLine &) Name = PromptLine(""); if (Name.empty() == false && Name.find('"') == string::npos && - Name.find(':') == string::npos && - Name.find('/') == string::npos) + Name.find('[') == string::npos && + Name.find(']') == string::npos) break; cout << "That is not a valid name, try again " << endl; } @@ -598,7 +612,8 @@ bool DoAdd(CommandLine &) } else Name = Database.Find("CD::" + ID); - + + // Escape special characters string::iterator J = Name.begin(); for (; J != Name.end(); J++) if (*J == '"' || *J == ']' || *J == '[') @@ -660,37 +675,78 @@ bool DoAdd(CommandLine &) return true; } /*}}}*/ +// DoIdent - Ident a CDROM /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool DoIdent(CommandLine &) +{ + // Startup + string CDROM = _config->FindDir("Acquire::cdrom::mount","/cdrom/"); + if (CDROM[0] == '.') + CDROM= SafeGetCWD() + '/' + CDROM; + + cout << "Using CD-ROM mount point " << CDROM << endl; + cout << "Mounting CD-ROM" << endl; + if (MountCdrom(CDROM) == false) + return _error->Error("Failed to mount the cdrom."); + + // Hash the CD to get an ID + cout << "Identifying.. " << flush; + string ID; + if (IdentCdrom(CDROM,ID) == false) + { + cout << endl; + return false; + } + + cout << '[' << ID << ']' << endl; + + // Read the database + Configuration Database; + string DFile = _config->FindFile("Dir::State::cdroms"); + if (FileExists(DFile) == true) + { + if (ReadConfigFile(Database,DFile) == false) + return _error->Error("Unable to read the cdrom database %s", + DFile.c_str()); + } + cout << "Stored Label: '" << Database.Find("CD::" + ID) << "'" << endl; + return true; +} + /*}}}*/ // ShowHelp - Show the help screen /*{{{*/ // --------------------------------------------------------------------- /* */ int ShowHelp() { - cout << PACKAGE << ' ' << VERSION << " for " << ARCHITECTURE << - " compiled on " << __DATE__ << " " << __TIME__ << endl; + ioprintf(cout,_("%s %s for %s %s compiled on %s %s\n"),PACKAGE,VERSION, + COMMON_OS,COMMON_CPU,__DATE__,__TIME__); if (_config->FindB("version") == true) - return 100; - - cout << "Usage: apt-cdrom [options] command" << endl; - cout << endl; - cout << "apt-cdrom is a tool to add CDROM's to APT's source list. The " << endl; - cout << "CDROM mount point and device information is taken from apt.conf" << endl; - cout << "and /etc/fstab." << endl; - cout << endl; - cout << "Commands:" << endl; - cout << " add - Add a CDROM" << endl; - cout << endl; - cout << "Options:" << endl; - cout << " -h This help text" << endl; - 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 << " -a Thorough scan mode" << endl; - cout << " -c=? Read this configuration file" << endl; - cout << " -o=? Set an arbitary configuration option, eg -o dir::cache=/tmp" << endl; - cout << "See fstab(5)" << endl; - return 100; + return 0; + + cout << + "Usage: apt-cdrom [options] command\n" + "\n" + "apt-cdrom is a tool to add CDROM's to APT's source list. The\n" + "CDROM mount point and device information is taken from apt.conf\n" + "and /etc/fstab.\n" + "\n" + "Commands:\n" + " add - Add a CDROM\n" + " ident - Report the identity of a CDROM\n" + "\n" + "Options:\n" + " -h This help text\n" + " -d CD-ROM mount point\n" + " -r Rename a recognized CD-ROM\n" + " -m No mounting\n" + " -f Fast mode, don't check package files\n" + " -a Thorough scan mode\n" + " -c=? Read this configuration file\n" + " -o=? Set an arbitary configuration option, eg -o dir::cache=/tmp\n" + "See fstab(5)\n"; + return 0; } /*}}}*/ @@ -712,19 +768,21 @@ int main(int argc,const char *argv[]) {0,0,0,0}}; CommandLine::Dispatch Cmds[] = { {"add",&DoAdd}, + {"ident",&DoIdent}, {0,0}}; // Parse the command line and initialize the package library CommandLine CmdL(Args,_config); - if (pkgInitialize(*_config) == false || - CmdL.Parse(argc,argv) == false) + if (pkgInitConfig(*_config) == false || + CmdL.Parse(argc,argv) == false || + pkgInitSystem(*_config,_system) == false) { _error->DumpErrors(); return 100; } // See if the help should be shown - if (_config->FindB("help") == true || + if (_config->FindB("help") == true || _config->FindB("version") == true || CmdL.FileSize() == 0) return ShowHelp();