X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/ba1045b4159d4e8dcadd3a137b1d3eea47416df8..cebe0287c36408e44196266de45737386eaa28fc:/apt-pkg/sourcelist.cc diff --git a/apt-pkg/sourcelist.cc b/apt-pkg/sourcelist.cc index 12db63079..fea645078 100644 --- a/apt-pkg/sourcelist.cc +++ b/apt-pkg/sourcelist.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: sourcelist.cc,v 1.24 2002/07/08 04:18:07 jgg Exp $ +// $Id: sourcelist.cc,v 1.3 2002/08/15 20:51:37 niemeyer Exp $ /* ###################################################################### List of Sources @@ -8,19 +8,22 @@ ##################################################################### */ /*}}}*/ // Include Files /*{{{*/ -#ifdef __GNUG__ -#pragma implementation "apt-pkg/sourcelist.h" -#endif - #include #include #include -#include #include +#include #include #include + +// CNC:2003-03-03 - This is needed for ReadDir stuff. +#include +#include +#include +#include +#include /*}}}*/ using namespace std; @@ -74,8 +77,7 @@ bool pkgSourceList::Type::FixupURI(string &URI) const // --------------------------------------------------------------------- /* This is a generic one that is the 'usual' format for sources.list Weird types may override this. */ -bool pkgSourceList::Type::ParseLine(vector &List, - Vendor const *Vendor, +bool pkgSourceList::Type::ParseLine(vector &List, const char *Buffer, unsigned long CurLine, string File) const @@ -96,9 +98,9 @@ bool pkgSourceList::Type::ParseLine(vector &List, if (Dist.empty() == false && Dist[Dist.size() - 1] == '/') { if (ParseQuoteWord(Buffer,Section) == true) - return _error->Error(_("Malformed line %lu in source list %s (Absolute dist)"),CurLine,File.c_str()); + return _error->Error(_("Malformed line %lu in source list %s (absolute dist)"),CurLine,File.c_str()); Dist = SubstVar(Dist,"$(ARCH)",_config->Find("APT::Architecture")); - return CreateItem(List,URI,Dist,Section,Vendor); + return CreateItem(List,URI,Dist,Section); } // Grab the rest of the dists @@ -107,7 +109,7 @@ bool pkgSourceList::Type::ParseLine(vector &List, do { - if (CreateItem(List,URI,Dist,Section,Vendor) == false) + if (CreateItem(List,URI,Dist,Section) == false) return false; } while (ParseQuoteWord(Buffer,Section) == true); @@ -135,109 +137,74 @@ pkgSourceList::~pkgSourceList() { for (const_iterator I = SrcList.begin(); I != SrcList.end(); I++) delete *I; - for (vector::const_iterator I = VendorList.begin(); - I != VendorList.end(); I++) - delete *I; } /*}}}*/ -// SourceList::ReadVendors - Read list of known package vendors /*{{{*/ + /*}}}*/ +// SourceList::ReadMainList - Read the main source list from etc /*{{{*/ // --------------------------------------------------------------------- -/* This also scans a directory of vendor files similar to apt.conf.d - which can contain the usual suspects of distribution provided data. - The APT config mechanism allows the user to override these in their - configuration file. */ -bool pkgSourceList::ReadVendors() +/* */ +bool pkgSourceList::ReadMainList() { - Configuration Cnf; - - string CnfFile = _config->FindDir("Dir::Etc::vendorparts"); - if (FileExists(CnfFile) == true) - if (ReadConfigDir(Cnf,CnfFile,true) == false) - return false; - CnfFile = _config->FindFile("Dir::Etc::vendorlist"); - if (FileExists(CnfFile) == true) - if (ReadConfigFile(Cnf,CnfFile,true) == false) - return false; - - for (vector::const_iterator I = VendorList.begin(); - I != VendorList.end(); I++) - delete *I; - VendorList.erase(VendorList.begin(),VendorList.end()); - - // Process 'simple-key' type sections - const Configuration::Item *Top = Cnf.Tree("simple-key"); - for (Top = (Top == 0?0:Top->Child); Top != 0; Top = Top->Next) - { - Configuration Block(Top); - Vendor *Vendor; - - Vendor = new pkgSourceList::Vendor; - - Vendor->VendorID = Top->Tag; - Vendor->FingerPrint = Block.Find("Fingerprint"); - Vendor->Description = Block.Find("Name"); - - if (Vendor->FingerPrint.empty() == true || - Vendor->Description.empty() == true) - { - _error->Error(_("Vendor block %s is invalid"), Vendor->VendorID.c_str()); - delete Vendor; - continue; - } - - VendorList.push_back(Vendor); - } + // CNC:2003-03-03 - Multiple sources list support. + bool Res = true; +#if 0 + Res = ReadVendors(); + if (Res == false) + return false; +#endif - /* XXX Process 'group-key' type sections - This is currently faked out so that the vendors file format is - parsed but nothing is done with it except check for validity */ - Top = Cnf.Tree("group-key"); - for (Top = (Top == 0?0:Top->Child); Top != 0; Top = Top->Next) - { - Configuration Block(Top); - Vendor *Vendor; - - Vendor = new pkgSourceList::Vendor; - - Vendor->VendorID = Top->Tag; - Vendor->Description = Block.Find("Name"); + Reset(); + // CNC:2003-11-28 - Entries in sources.list have priority over + // entries in sources.list.d. + string Main = _config->FindFile("Dir::Etc::sourcelist"); + if (FileExists(Main) == true) + Res &= ReadAppend(Main); - if (Vendor->Description.empty() == true) - { - _error->Error(_("Vendor block %s is invalid"), - Vendor->VendorID.c_str()); - delete Vendor; - continue; - } - - VendorList.push_back(Vendor); - } + string Parts = _config->FindDir("Dir::Etc::sourceparts"); + if (FileExists(Parts) == true) + Res &= ReadSourceDir(Parts); - return !_error->PendingError(); + return Res; } /*}}}*/ -// SourceList::ReadMainList - Read the main source list from etc /*{{{*/ +// CNC:2003-03-03 - Needed to preserve backwards compatibility. +// SourceList::Reset - Clear the sourcelist contents /*{{{*/ // --------------------------------------------------------------------- /* */ -bool pkgSourceList::ReadMainList() +void pkgSourceList::Reset() { - return ReadVendors() && Read(_config->FindFile("Dir::Etc::sourcelist")); + for (const_iterator I = SrcList.begin(); I != SrcList.end(); I++) + delete *I; + SrcList.erase(SrcList.begin(),SrcList.end()); } /*}}}*/ +// CNC:2003-03-03 - Function moved to ReadAppend() and Reset(). // SourceList::Read - Parse the sourcelist file /*{{{*/ // --------------------------------------------------------------------- /* */ bool pkgSourceList::Read(string File) +{ + Reset(); + return ReadAppend(File); +} + /*}}}*/ +// SourceList::ReadAppend - Parse a sourcelist file /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool pkgSourceList::ReadAppend(string File) { // Open the stream for reading ifstream F(File.c_str(),ios::in /*| ios::nocreate*/); if (!F != 0) return _error->Errno("ifstream::ifstream",_("Opening %s"),File.c_str()); +#if 0 // Now Reset() does this. for (const_iterator I = SrcList.begin(); I != SrcList.end(); I++) delete *I; SrcList.erase(SrcList.begin(),SrcList.end()); - char Buffer[300]; +#endif + // CNC:2003-12-10 - 300 is too short. + char Buffer[1024]; int CurLine = 0; while (F.eof() == false) @@ -251,7 +218,10 @@ bool pkgSourceList::Read(string File) char *I; - for (I = Buffer; *I != 0 && *I != '#'; I++); + // CNC:2003-02-20 - Do not break if '#' is inside []. + for (I = Buffer; *I != 0 && *I != '#'; I++) + if (*I == '[') + for (I++; *I != 0 && *I != ']'; I++); *I = 0; const char *C = _strstrip(Buffer); @@ -267,10 +237,9 @@ bool pkgSourceList::Read(string File) Type *Parse = Type::GetType(LineType.c_str()); if (Parse == 0) - return _error->Error(_("Type '%s' is not known in on line %u in source list %s"),LineType.c_str(),CurLine,File.c_str()); + return _error->Error(_("Type '%s' is not known on line %u in source list %s"),LineType.c_str(),CurLine,File.c_str()); - // Authenticated repository - Vendor const *Vndr = 0; + // Vendor name specified if (C[0] == '[') { string VendorID; @@ -282,22 +251,24 @@ bool pkgSourceList::Read(string File) return _error->Error(_("Malformed line %u in source list %s (vendor id)"),CurLine,File.c_str()); VendorID = string(VendorID,1,VendorID.size()-2); - for (vector::const_iterator iter = VendorList.begin(); - iter != VendorList.end(); iter++) - { - if ((*iter)->VendorID == VendorID) - { - Vndr = *iter; - break; - } - } +// for (vector::const_iterator iter = VendorList.begin(); +// iter != VendorList.end(); iter++) +// { +// if ((*iter)->GetVendorID() == VendorID) +// { +// if (_config->FindB("Debug::sourceList", false)) +// std::cerr << "Comparing VendorID \"" << VendorID << "\" with \"" << (*iter)->GetVendorID() << '"' << std::endl; +// Verifier = *iter; +// break; +// } +// } - if (Vndr == 0) - return _error->Error(_("Unknown vendor ID '%s' in line %u of source list %s"), - VendorID.c_str(),CurLine,File.c_str()); +// if (Verifier == 0) +// return _error->Error(_("Unknown vendor ID '%s' in line %u of source list %s"), +// VendorID.c_str(),CurLine,File.c_str()); } - - if (Parse->ParseLine(SrcList,Vndr,C,CurLine,File) == false) + + if (Parse->ParseLine(SrcList,C,CurLine,File) == false) return false; } return true; @@ -311,24 +282,81 @@ bool pkgSourceList::FindIndex(pkgCache::PkgFileIterator File, { for (const_iterator I = SrcList.begin(); I != SrcList.end(); I++) { - if ((*I)->FindInCache(*File.Cache()) == File) + vector *Indexes = (*I)->GetIndexFiles(); + for (vector::const_iterator J = Indexes->begin(); + J != Indexes->end(); J++) { - Found = *I; - return true; + if ((*J)->FindInCache(*File.Cache()) == File) + { + Found = (*J); + return true; + } } } - + return false; } /*}}}*/ // SourceList::GetIndexes - Load the index files into the downloader /*{{{*/ // --------------------------------------------------------------------- /* */ -bool pkgSourceList::GetIndexes(pkgAcquire *Owner) const +bool pkgSourceList::GetIndexes(pkgAcquire *Owner, bool GetAll) const { for (const_iterator I = SrcList.begin(); I != SrcList.end(); I++) - if ((*I)->GetIndexes(Owner) == false) + if ((*I)->GetIndexes(Owner,GetAll) == false) + return false; + return true; +} + /*}}}*/ +// CNC:2003-03-03 - By Anton V. Denisov . +// SourceList::ReadSourceDir - Read a directory with sources files +// Based on ReadConfigDir() /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool pkgSourceList::ReadSourceDir(string Dir) +{ + DIR *D = opendir(Dir.c_str()); + if (D == 0) + return _error->Errno("opendir",_("Unable to read %s"),Dir.c_str()); + + vector List; + + for (struct dirent *Ent = readdir(D); Ent != 0; Ent = readdir(D)) + { + if (Ent->d_name[0] == '.') + continue; + + // CNC:2003-12-02 Only accept .list files as valid sourceparts + if (flExtension(Ent->d_name) != "list") + continue; + + // Skip bad file names ala run-parts + const char *C = Ent->d_name; + for (; *C != 0; C++) + if (isalpha(*C) == 0 && isdigit(*C) == 0 + && *C != '_' && *C != '-' && *C != '.') + break; + if (*C != 0) + continue; + + // Make sure it is a file and not something else + string File = flCombine(Dir,Ent->d_name); + struct stat St; + if (stat(File.c_str(),&St) != 0 || S_ISREG(St.st_mode) == 0) + continue; + + List.push_back(File); + } + closedir(D); + + sort(List.begin(),List.end()); + + // Read the files + for (vector::const_iterator I = List.begin(); I != List.end(); I++) + if (ReadAppend(*I) == false) return false; return true; + } /*}}}*/ +