]>
git.saurik.com Git - apt.git/blob - apt-pkg/sourcelist.cc
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: sourcelist.cc,v 1.20 2001/05/15 05:46:11 jgg Exp $
4 /* ######################################################################
8 ##################################################################### */
10 // Include Files /*{{{*/
12 #pragma implementation "apt-pkg/sourcelist.h"
15 #include <apt-pkg/sourcelist.h>
16 #include <apt-pkg/error.h>
17 #include <apt-pkg/fileutl.h>
18 #include <apt-pkg/configuration.h>
19 #include <apt-pkg/strutl.h>
28 // Global list of Items supported
29 static pkgSourceList::Type
*ItmList
[10];
30 pkgSourceList::Type
**pkgSourceList::Type::GlobalList
= ItmList
;
31 unsigned long pkgSourceList::Type::GlobalListLen
= 0;
33 // Type::Type - Constructor /*{{{*/
34 // ---------------------------------------------------------------------
35 /* Link this to the global list of items*/
36 pkgSourceList::Type::Type()
38 ItmList
[GlobalListLen
] = this;
42 // Type::GetType - Get a specific meta for a given type /*{{{*/
43 // ---------------------------------------------------------------------
45 pkgSourceList::Type
*pkgSourceList::Type::GetType(const char *Type
)
47 for (unsigned I
= 0; I
!= GlobalListLen
; I
++)
48 if (strcmp(GlobalList
[I
]->Name
,Type
) == 0)
53 // Type::FixupURI - Normalize the URI and check it.. /*{{{*/
54 // ---------------------------------------------------------------------
56 bool pkgSourceList::Type::FixupURI(string
&URI
) const
58 if (URI
.empty() == true)
61 if (URI
.find(':') == string::npos
)
64 URI
= SubstVar(URI
,"$(ARCH)",_config
->Find("APT::Architecture"));
66 // Make sure that the URI is / postfixed
67 if (URI
[URI
.size() - 1] != '/')
73 // Type::ParseLine - Parse a single line /*{{{*/
74 // ---------------------------------------------------------------------
75 /* This is a generic one that is the 'usual' format for sources.list
76 Weird types may override this. */
77 bool pkgSourceList::Type::ParseLine(vector
<pkgIndexFile
*> &List
,
80 unsigned long CurLine
,
87 if (ParseQuoteWord(Buffer
,URI
) == false)
88 return _error
->Error(_("Malformed line %lu in source list %s (URI)"),CurLine
,File
.c_str());
89 if (ParseQuoteWord(Buffer
,Dist
) == false)
90 return _error
->Error(_("Malformed line %lu in source list %s (dist)"),CurLine
,File
.c_str());
92 if (FixupURI(URI
) == false)
93 return _error
->Error(_("Malformed line %lu in source list %s (URI parse)"),CurLine
,File
.c_str());
95 // Check for an absolute dists specification.
96 if (Dist
.empty() == false && Dist
[Dist
.size() - 1] == '/')
98 if (ParseQuoteWord(Buffer
,Section
) == true)
99 return _error
->Error(_("Malformed line %lu in source list %s (Absolute dist)"),CurLine
,File
.c_str());
100 Dist
= SubstVar(Dist
,"$(ARCH)",_config
->Find("APT::Architecture"));
101 return CreateItem(List
,URI
,Dist
,Section
,Vendor
);
104 // Grab the rest of the dists
105 if (ParseQuoteWord(Buffer
,Section
) == false)
106 return _error
->Error(_("Malformed line %lu in source list %s (dist parse)"),CurLine
,File
.c_str());
110 if (CreateItem(List
,URI
,Dist
,Section
,Vendor
) == false)
113 while (ParseQuoteWord(Buffer
,Section
) == true);
119 // SourceList::pkgSourceList - Constructors /*{{{*/
120 // ---------------------------------------------------------------------
122 pkgSourceList::pkgSourceList()
126 pkgSourceList::pkgSourceList(string File
)
131 // SourceList::ReadVendors - Read list of known package vendors /*{{{*/
132 // ---------------------------------------------------------------------
133 /* This also scans a directory of vendor files similar to apt.conf.d
134 which can contain the usual suspects of distribution provided data.
135 The APT config mechanism allows the user to override these in their
136 configuration file. */
137 bool pkgSourceList::ReadVendors()
141 string CnfFile
= _config
->FindDir("Dir::Etc::vendorparts");
142 if (FileExists(CnfFile
) == true)
143 if (ReadConfigDir(Cnf
,CnfFile
,true) == false)
145 CnfFile
= _config
->FindFile("Dir::Etc::vendorlist");
146 if (FileExists(CnfFile
) == true)
147 if (ReadConfigFile(Cnf
,CnfFile
,true) == false)
150 // Process 'simple-key' type sections
151 const Configuration::Item
*Top
= Cnf
.Tree("simple-key");
152 for (Top
= (Top
== 0?0:Top
->Child
); Top
!= 0; Top
= Top
->Next
)
154 Configuration
Block(Top
);
157 Vendor
= new pkgSourceList::Vendor
;
159 Vendor
->VendorID
= Top
->Tag
;
160 Vendor
->FingerPrint
= Block
.Find("Fingerprint");
161 Vendor
->Description
= Block
.Find("Name");
163 if (Vendor
->FingerPrint
.empty() == true ||
164 Vendor
->Description
.empty() == true)
166 _error
->Error(_("Vendor block %s is invalid"), Vendor
->VendorID
.c_str());
171 VendorList
.push_back(Vendor
);
174 return !_error
->PendingError();
177 // SourceList::ReadMainList - Read the main source list from etc /*{{{*/
178 // ---------------------------------------------------------------------
180 bool pkgSourceList::ReadMainList()
182 return ReadVendors() && Read(_config
->FindFile("Dir::Etc::sourcelist"));
185 // SourceList::Read - Parse the sourcelist file /*{{{*/
186 // ---------------------------------------------------------------------
188 bool pkgSourceList::Read(string File
)
190 // Open the stream for reading
191 ifstream
F(File
.c_str(),ios::in
/*| ios::nocreate*/);
193 return _error
->Errno("ifstream::ifstream",_("Opening %s"),File
.c_str());
195 SrcList
.erase(SrcList
.begin(),SrcList
.end());
199 while (F
.eof() == false)
201 F
.getline(Buffer
,sizeof(Buffer
));
203 _strtabexpand(Buffer
,sizeof(Buffer
));
207 for (I
= Buffer
; *I
!= 0 && *I
!= '#'; I
++);
210 const char *C
= _strstrip(Buffer
);
213 if (C
[0] == '#' || C
[0] == 0)
218 if (ParseQuoteWord(C
,LineType
) == false)
219 return _error
->Error(_("Malformed line %u in source list %s (type)"),CurLine
,File
.c_str());
221 Type
*Parse
= Type::GetType(LineType
.c_str());
223 return _error
->Error(_("Type '%s' is not known in on line %u in source list %s"),LineType
.c_str(),CurLine
,File
.c_str());
225 // Authenticated repository
226 Vendor
const *Vndr
= 0;
231 if (ParseQuoteWord(C
,VendorID
) == false)
232 return _error
->Error(_("Malformed line %u in source list %s (vendor id)"),CurLine
,File
.c_str());
234 if (VendorID
.length() < 2 || VendorID
.end()[-1] != ']')
235 return _error
->Error(_("Malformed line %u in source list %s (vendor id)"),CurLine
,File
.c_str());
236 VendorID
= string(VendorID
,1,VendorID
.size()-2);
238 for (vector
<Vendor
const *>::const_iterator iter
= VendorList
.begin();
239 iter
!= VendorList
.end(); iter
++)
241 if ((*iter
)->VendorID
== VendorID
)
249 return _error
->Error(_("Unknown vendor ID '%s' in line %u of source list %s"),
250 VendorID
.c_str(),CurLine
,File
.c_str());
253 if (Parse
->ParseLine(SrcList
,Vndr
,C
,CurLine
,File
) == false)
259 // SourceList::FindIndex - Get the index associated with a file /*{{{*/
260 // ---------------------------------------------------------------------
262 bool pkgSourceList::FindIndex(pkgCache::PkgFileIterator File
,
263 pkgIndexFile
*&Found
) const
265 for (const_iterator I
= SrcList
.begin(); I
!= SrcList
.end(); I
++)
267 if ((*I
)->FindInCache(*File
.Cache()) == File
)
277 // SourceList::GetIndexes - Load the index files into the downloader /*{{{*/
278 // ---------------------------------------------------------------------
280 bool pkgSourceList::GetIndexes(pkgAcquire
*Owner
) const
282 for (const_iterator I
= SrcList
.begin(); I
!= SrcList
.end(); I
++)
283 if ((*I
)->GetIndexes(Owner
) == false)