X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/3b7525a6014be89a1edc90bfc8e801d51bd408a7..1bc849af8f694ab80887bd0e9b94280f78771dbc:/cmdline/apt-cdrom.cc diff --git a/cmdline/apt-cdrom.cc b/cmdline/apt-cdrom.cc index fc9eb5000..85d2fa3e8 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.5 1998/11/28 08:39:46 jgg Exp $ +// $Id: apt-cdrom.cc,v 1.17 1999/01/30 02:12:53 jgg Exp $ /* ###################################################################### APT CDROM - Tool for handling APT's CDROM database. @@ -14,20 +14,17 @@ #include #include #include -#include #include #include #include -#include +#include +#include #include #include #include #include #include -#include -#include -#include #include #include #include @@ -35,142 +32,15 @@ #include /*}}}*/ -// UnmountCdrom - Unmount a cdrom /*{{{*/ -// --------------------------------------------------------------------- -/* */ -bool UnmountCdrom(string Path) -{ - int Child = fork(); - if (Child < -1) - return _error->Errno("fork","Failed to fork"); - - // The child - if (Child == 0) - { - // Make all the fds /dev/null - for (int I = 0; I != 10; I++) - close(I); - 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(); - Args[2] = 0; - execvp(Args[0],(char **)Args); - exit(100); - } - - // Wait for mount - int Status = 0; - while (waitpid(Child,&Status,0) != Child) - { - if (errno == EINTR) - continue; - return _error->Errno("waitpid","Couldn't wait for subprocess"); - } - - // Check for an error code. - if (WIFEXITED(Status) == 0 || WEXITSTATUS(Status) != 0) - return false; - return true; -} - /*}}}*/ -// MountCdrom - Mount a cdrom /*{{{*/ -// --------------------------------------------------------------------- -/* We fork mount.. */ -bool MountCdrom(string Path) -{ - int Child = fork(); - if (Child < -1) - return _error->Errno("fork","Failed to fork"); - - // The child - if (Child == 0) - { - // Make all the fds /dev/null - for (int I = 0; I != 10; I++) - close(I); - for (int I = 0; I != 3; I++) - dup2(open("/dev/null",O_RDWR),I); - - const char *Args[10]; - Args[0] = "mount"; - Args[1] = Path.c_str(); - Args[2] = 0; - execvp(Args[0],(char **)Args); - exit(100); - } - - // Wait for mount - int Status = 0; - while (waitpid(Child,&Status,0) != Child) - { - if (errno == EINTR) - continue; - return _error->Errno("waitpid","Couldn't wait for subprocess"); - } - - // Check for an error code. - if (WIFEXITED(Status) == 0 || WEXITSTATUS(Status) != 0) - return false; - return true; -} - /*}}}*/ -// IdentCdrom - Generate a unique string for this CD /*{{{*/ -// --------------------------------------------------------------------- -/* We convert everything we hash into a string, this prevents byte size/order - from effecting the outcome. */ -bool IdentCdrom(string CD,string &Res) -{ - MD5Summation Hash; - - string StartDir = SafeGetCWD(); - if (chdir(CD.c_str()) != 0) - return _error->Errno("chdir","Unable to change to %s",CD.c_str()); - - DIR *D = opendir("."); - if (D == 0) - return _error->Errno("opendir","Unable to read %s",CD.c_str()); - - // Run over the directory - char S[300]; - for (struct dirent *Dir = readdir(D); Dir != 0; Dir = readdir(D)) - { - // Skip some files.. - if (strcmp(Dir->d_name,".") == 0 || - strcmp(Dir->d_name,"..") == 0) - continue; - - sprintf(S,"%lu",Dir->d_ino); - Hash.Add(S); - Hash.Add(Dir->d_name); - }; - - chdir(StartDir.c_str()); - closedir(D); - - // Some stats from the fsys - struct statfs Buf; - if (statfs(CD.c_str(),&Buf) != 0) - return _error->Errno("statfs","Failed to stat the cdrom"); - - sprintf(S,"%u %u",Buf.f_blocks,Buf.f_bfree); - Hash.Add(S); - - Res = Hash.Result().Value(); - return true; -} - /*}}}*/ - // FindPackages - Find the package files on the CDROM /*{{{*/ // --------------------------------------------------------------------- /* We look over the cdrom for package files. This is a recursive search that short circuits when it his a package file in the dir. This speeds it up greatly as the majority of the size is in the binary-* sub dirs. */ -bool FindPackages(string CD,vector &List, int Depth = 0) +bool FindPackages(string CD,vector &List, unsigned int Depth = 0) { + static ino_t Inodes[9]; if (Depth >= 7) return true; @@ -184,11 +54,13 @@ bool FindPackages(string CD,vector &List, int Depth = 0) this dir is controlled by those package files so we don't look down anymore */ struct stat Buf; - if (stat("Packages",&Buf) == 0 || - stat("Packages.gz",&Buf) == 0) + if (stat("Packages",&Buf) == 0) { List.push_back(CD); - return true; + + // Continue down if thorough is given + if (_config->FindB("APT::CDROM::Thorough",false) == false) + return true; } DIR *D = opendir("."); @@ -214,6 +86,16 @@ bool FindPackages(string CD,vector &List, int Depth = 0) if (S_ISDIR(Buf.st_mode) == 0) continue; + unsigned int I; + for (I = 0; I != Depth; I++) + if (Inodes[I] == Buf.st_ino) + break; + if (I != Depth) + continue; + + // Store the inodes weve seen + Inodes[Depth] = Buf.st_ino; + // Descend if (FindPackages(CD + Dir->d_name,List,Depth+1) == false) break; @@ -273,6 +155,8 @@ int Score(string Path) int Res = 0; if (Path.find("stable/") != string::npos) Res += 2; + if (Path.find("/binary-") != string::npos) + Res += 2; if (Path.find("frozen/") != string::npos) Res += 2; if (Path.find("/dists/") != string::npos) @@ -298,11 +182,14 @@ bool DropRepeats(vector &List) for (unsigned int I = 0; I != List.size(); I++) { struct stat Buf; - if (stat(List[I].c_str(),&Buf) != 0) - _error->Errno("stat","Failed to stat %s",List[I].c_str()); + if (stat((List[I] + "Packages").c_str(),&Buf) != 0) + _error->Errno("stat","Failed to stat %sPackages",List[I].c_str()); Inodes[I] = Buf.st_ino; } + if (_error->PendingError() == true) + return false; + // Look for dups for (unsigned int I = 0; I != List.size(); I++) { @@ -689,6 +576,8 @@ bool CopyPackages(string CDROM,string Name,vector &List) if (NotFound + WrongSize > 10) cout << "Alot of package entires were discarded, perhaps this CD is funny?" << endl; + + return true; } /*}}}*/ @@ -920,8 +809,11 @@ bool DoAdd(CommandLine &) { // Startup string CDROM = _config->FindDir("Acquire::cdrom::mount","/cdrom/"); - cout << "Using CD-ROM mount point " << CDROM << endl; + if (CDROM[0] == '.') + CDROM= SafeGetCWD() + '/' + CDROM; + cout << "Using CD-ROM mount point " << CDROM << endl; + // Read the database Configuration Database; string DFile = _config->FindFile("Dir::State::cdroms"); @@ -952,7 +844,11 @@ bool DoAdd(CommandLine &) cout << "Identifying.. " << flush; string ID; if (IdentCdrom(CDROM,ID) == false) + { + cout << endl; return false; + } + cout << '[' << ID << ']' << endl; cout << "Scanning Disc for index files.. " << flush; @@ -960,7 +856,11 @@ bool DoAdd(CommandLine &) vector List; string StartDir = SafeGetCWD(); if (FindPackages(CDROM,List) == false) + { + cout << endl; return false; + } + chdir(StartDir.c_str()); if (_config->FindB("Debug::aptcdrom",false) == true) @@ -1007,15 +907,22 @@ bool DoAdd(CommandLine &) { Name = PromptLine(""); if (Name.empty() == false && + Name.find('"') == string::npos && + Name.find(':') == string::npos && Name.find('/') == string::npos) break; cout << "That is not a valid name, try again " << endl; - } - + } } } else Name = Database.Find("CD::" + ID); + + string::iterator J = Name.begin(); + for (; J != Name.end(); J++) + if (*J == '/' || *J == '"' || *J == ':') + *J = '_'; + Database.Set("CD::" + ID,Name); cout << "This Disc is called '" << Name << "'" << endl; @@ -1037,7 +944,7 @@ bool DoAdd(CommandLine &) } // Print the sourcelist entries - cout << "Source List entires for this Disc are:" << endl; + cout << "Source List entries for this Disc are:" << endl; for (vector::iterator I = List.begin(); I != List.end(); I++) { string::size_type Space = (*I).find(' '); @@ -1059,6 +966,8 @@ int ShowHelp() { cout << PACKAGE << ' ' << VERSION << " for " << ARCHITECTURE << " compiled on " << __DATE__ << " " << __TIME__ << endl; + if (_config->FindB("version") == true) + return 100; cout << "Usage: apt-cdrom [options] command" << endl; cout << endl; @@ -1075,6 +984,7 @@ int ShowHelp() 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, ie -o dir::cache=/tmp" << endl; cout << "See fstab(5)" << endl; @@ -1086,13 +996,15 @@ int main(int argc,const char *argv[]) { CommandLine::Args Args[] = { {'h',"help","help",0}, + {'v',"version","version",0}, {'d',"cdrom","Acquire::cdrom::mount",CommandLine::HasArg}, {'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',"just-print","APT::CDROM::NoAct",0}, {'n',"recon","APT::CDROM::NoAct",0}, - {'n',"no-act","APT::CDROM::NoAct",0}, + {'n',"no-act","APT::CDROM::NoAct",0}, + {'a',"thorough","APT::CDROM::Thorough",0}, {'c',"config-file",0,CommandLine::ConfigFile}, {'o',"option",0,CommandLine::ArbItem}, {0,0,0,0}};