]>
git.saurik.com Git - apt.git/blob - apt-pkg/sourcelist.cc
   1 // -*- mode: cpp; mode: fold -*- 
   3 // $Id: sourcelist.cc,v 1.3 2002/08/15 20:51:37 niemeyer Exp $ 
   4 /* ###################################################################### 
   8    ##################################################################### */ 
  10 // Include Files                                                        /*{{{*/ 
  11 #include <apt-pkg/sourcelist.h> 
  12 #include <apt-pkg/error.h> 
  13 #include <apt-pkg/fileutl.h> 
  14 #include <apt-pkg/strutl.h> 
  15 #include <apt-pkg/configuration.h> 
  21 // CNC:2003-03-03 - This is needed for ReadDir stuff. 
  31 // Global list of Items supported 
  32 static  pkgSourceList::Type 
*ItmList
[10]; 
  33 pkgSourceList::Type 
**pkgSourceList::Type::GlobalList 
= ItmList
; 
  34 unsigned long pkgSourceList::Type::GlobalListLen 
= 0; 
  36 // Type::Type - Constructor                                             /*{{{*/ 
  37 // --------------------------------------------------------------------- 
  38 /* Link this to the global list of items*/ 
  39 pkgSourceList::Type::Type() 
  41    ItmList
[GlobalListLen
] = this; 
  45 // Type::GetType - Get a specific meta for a given type                 /*{{{*/ 
  46 // --------------------------------------------------------------------- 
  48 pkgSourceList::Type 
*pkgSourceList::Type::GetType(const char *Type
) 
  50    for (unsigned I 
= 0; I 
!= GlobalListLen
; I
++) 
  51       if (strcmp(GlobalList
[I
]->Name
,Type
) == 0) 
  56 // Type::FixupURI - Normalize the URI and check it..                    /*{{{*/ 
  57 // --------------------------------------------------------------------- 
  59 bool pkgSourceList::Type::FixupURI(string 
&URI
) const 
  61    if (URI
.empty() == true) 
  64    if (URI
.find(':') == string::npos
) 
  67    URI 
= SubstVar(URI
,"$(ARCH)",_config
->Find("APT::Architecture")); 
  69    // Make sure that the URI is / postfixed 
  70    if (URI
[URI
.size() - 1] != '/') 
  76 // Type::ParseLine - Parse a single line                                /*{{{*/ 
  77 // --------------------------------------------------------------------- 
  78 /* This is a generic one that is the 'usual' format for sources.list 
  79    Weird types may override this. */ 
  80 bool pkgSourceList::Type::ParseLine(vector
<metaIndex 
*> &List
, 
  82                                     unsigned long CurLine
, 
  89    if (ParseQuoteWord(Buffer
,URI
) == false) 
  90       return _error
->Error(_("Malformed line %lu in source list %s (URI)"),CurLine
,File
.c_str()); 
  91    if (ParseQuoteWord(Buffer
,Dist
) == false) 
  92       return _error
->Error(_("Malformed line %lu in source list %s (dist)"),CurLine
,File
.c_str()); 
  94    if (FixupURI(URI
) == false) 
  95       return _error
->Error(_("Malformed line %lu in source list %s (URI parse)"),CurLine
,File
.c_str()); 
  97    // Check for an absolute dists specification. 
  98    if (Dist
.empty() == false && Dist
[Dist
.size() - 1] == '/') 
 100       if (ParseQuoteWord(Buffer
,Section
) == true) 
 101          return _error
->Error(_("Malformed line %lu in source list %s (absolute dist)"),CurLine
,File
.c_str()); 
 102       Dist 
= SubstVar(Dist
,"$(ARCH)",_config
->Find("APT::Architecture")); 
 103       return CreateItem(List
,URI
,Dist
,Section
); 
 106    // Grab the rest of the dists 
 107    if (ParseQuoteWord(Buffer
,Section
) == false) 
 108       return _error
->Error(_("Malformed line %lu in source list %s (dist parse)"),CurLine
,File
.c_str()); 
 112       if (CreateItem(List
,URI
,Dist
,Section
) == false) 
 115    while (ParseQuoteWord(Buffer
,Section
) == true); 
 121 // SourceList::pkgSourceList - Constructors                             /*{{{*/ 
 122 // --------------------------------------------------------------------- 
 124 pkgSourceList::pkgSourceList() 
 128 pkgSourceList::pkgSourceList(string File
) 
 133 // SourceList::~pkgSourceList - Destructor                              /*{{{*/ 
 134 // --------------------------------------------------------------------- 
 136 pkgSourceList::~pkgSourceList() 
 138    for (const_iterator I 
= SrcList
.begin(); I 
!= SrcList
.end(); I
++) 
 143 // SourceList::ReadMainList - Read the main source list from etc        /*{{{*/ 
 144 // --------------------------------------------------------------------- 
 146 bool pkgSourceList::ReadMainList() 
 148    // CNC:2003-03-03 - Multiple sources list support. 
 157    // CNC:2003-11-28 - Entries in sources.list have priority over 
 158    //                  entries in sources.list.d. 
 159    string Main 
= _config
->FindFile("Dir::Etc::sourcelist"); 
 160    if (FileExists(Main
) == true) 
 161       Res 
&= ReadAppend(Main
);    
 163    string Parts 
= _config
->FindDir("Dir::Etc::sourceparts"); 
 164    if (FileExists(Parts
) == true) 
 165       Res 
&= ReadSourceDir(Parts
); 
 170 // CNC:2003-03-03 - Needed to preserve backwards compatibility. 
 171 // SourceList::Reset - Clear the sourcelist contents                    /*{{{*/ 
 172 // --------------------------------------------------------------------- 
 174 void pkgSourceList::Reset() 
 176    for (const_iterator I 
= SrcList
.begin(); I 
!= SrcList
.end(); I
++) 
 178    SrcList
.erase(SrcList
.begin(),SrcList
.end()); 
 181 // CNC:2003-03-03 - Function moved to ReadAppend() and Reset(). 
 182 // SourceList::Read - Parse the sourcelist file                         /*{{{*/ 
 183 // --------------------------------------------------------------------- 
 185 bool pkgSourceList::Read(string File
) 
 188    return ReadAppend(File
); 
 191 // SourceList::ReadAppend - Parse a sourcelist file                     /*{{{*/ 
 192 // --------------------------------------------------------------------- 
 194 bool pkgSourceList::ReadAppend(string File
) 
 196    // Open the stream for reading 
 197    ifstream 
F(File
.c_str(),ios::in 
/*| ios::nocreate*/); 
 199       return _error
->Errno("ifstream::ifstream",_("Opening %s"),File
.c_str()); 
 201 #if 0 // Now Reset() does this. 
 202    for (const_iterator I 
= SrcList
.begin(); I 
!= SrcList
.end(); I
++) 
 204    SrcList
.erase(SrcList
.begin(),SrcList
.end()); 
 206    // CNC:2003-12-10 - 300 is too short. 
 210    while (F
.eof() == false) 
 212       F
.getline(Buffer
,sizeof(Buffer
)); 
 214       _strtabexpand(Buffer
,sizeof(Buffer
)); 
 215       if (F
.fail() && !F
.eof()) 
 216          return _error
->Error(_("Line %u too long in source list %s."), 
 217                               CurLine
,File
.c_str()); 
 221       // CNC:2003-02-20 - Do not break if '#' is inside []. 
 222       for (I 
= Buffer
; *I 
!= 0 && *I 
!= '#'; I
++) 
 224             for (I
++; *I 
!= 0 && *I 
!= ']'; I
++); 
 227       const char *C 
= _strstrip(Buffer
); 
 230       if (C
[0] == '#' || C
[0] == 0) 
 235       if (ParseQuoteWord(C
,LineType
) == false) 
 236          return _error
->Error(_("Malformed line %u in source list %s (type)"),CurLine
,File
.c_str()); 
 238       Type 
*Parse 
= Type::GetType(LineType
.c_str()); 
 240          return _error
->Error(_("Type '%s' is not known on line %u in source list %s"),LineType
.c_str(),CurLine
,File
.c_str()); 
 242       // Vendor name specified 
 247          if (ParseQuoteWord(C
,VendorID
) == false) 
 248              return _error
->Error(_("Malformed line %u in source list %s (vendor id)"),CurLine
,File
.c_str()); 
 250          if (VendorID
.length() < 2 || VendorID
.end()[-1] != ']') 
 251              return _error
->Error(_("Malformed line %u in source list %s (vendor id)"),CurLine
,File
.c_str()); 
 252          VendorID 
= string(VendorID
,1,VendorID
.size()-2); 
 254 //       for (vector<const Vendor *>::const_iterator iter = VendorList.begin(); 
 255 //            iter != VendorList.end(); iter++)  
 257 //          if ((*iter)->GetVendorID() == VendorID) 
 259 //            if (_config->FindB("Debug::sourceList", false))  
 260 //              std::cerr << "Comparing VendorID \"" << VendorID << "\" with \"" << (*iter)->GetVendorID() << '"' << std::endl; 
 266 //       if (Verifier == 0) 
 267 //          return _error->Error(_("Unknown vendor ID '%s' in line %u of source list %s"), 
 268 //                               VendorID.c_str(),CurLine,File.c_str()); 
 271       if (Parse
->ParseLine(SrcList
,C
,CurLine
,File
) == false) 
 277 // SourceList::FindIndex - Get the index associated with a file         /*{{{*/ 
 278 // --------------------------------------------------------------------- 
 280 bool pkgSourceList::FindIndex(pkgCache::PkgFileIterator File
, 
 281                               pkgIndexFile 
*&Found
) const 
 283    for (const_iterator I 
= SrcList
.begin(); I 
!= SrcList
.end(); I
++) 
 285       vector
<pkgIndexFile 
*> *Indexes 
= (*I
)->GetIndexFiles(); 
 286       for (vector
<pkgIndexFile 
*>::const_iterator J 
= Indexes
->begin(); 
 287            J 
!= Indexes
->end(); J
++) 
 289          if ((*J
)->FindInCache(*File
.Cache()) == File
) 
 300 // SourceList::GetIndexes - Load the index files into the downloader    /*{{{*/ 
 301 // --------------------------------------------------------------------- 
 303 bool pkgSourceList::GetIndexes(pkgAcquire 
*Owner
, bool GetAll
) const 
 305    for (const_iterator I 
= SrcList
.begin(); I 
!= SrcList
.end(); I
++) 
 306       if ((*I
)->GetIndexes(Owner
,GetAll
) == false) 
 311 // CNC:2003-03-03 - By Anton V. Denisov <avd@altlinux.org>. 
 312 // SourceList::ReadSourceDir - Read a directory with sources files 
 313 // Based on ReadConfigDir()                                             /*{{{*/ 
 314 // --------------------------------------------------------------------- 
 316 bool pkgSourceList::ReadSourceDir(string Dir
) 
 318    DIR *D 
= opendir(Dir
.c_str()); 
 320       return _error
->Errno("opendir",_("Unable to read %s"),Dir
.c_str()); 
 324    for (struct dirent 
*Ent 
= readdir(D
); Ent 
!= 0; Ent 
= readdir(D
)) 
 326       if (Ent
->d_name
[0] == '.') 
 329       // CNC:2003-12-02 Only accept .list files as valid sourceparts 
 330       if (flExtension(Ent
->d_name
) != "list") 
 333       // Skip bad file names ala run-parts 
 334       const char *C 
= Ent
->d_name
; 
 336          if (isalpha(*C
) == 0 && isdigit(*C
) == 0 
 337              && *C 
!= '_' && *C 
!= '-' && *C 
!= '.') 
 342       // Make sure it is a file and not something else 
 343       string File 
= flCombine(Dir
,Ent
->d_name
); 
 345       if (stat(File
.c_str(),&St
) != 0 || S_ISREG(St
.st_mode
) == 0) 
 348       List
.push_back(File
);       
 352    sort(List
.begin(),List
.end()); 
 355    for (vector
<string
>::const_iterator I 
= List
.begin(); I 
!= List
.end(); I
++) 
 356       if (ReadAppend(*I
) == false)