]>
git.saurik.com Git - apt.git/blob - apt-pkg/sourcelist.cc
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: sourcelist.cc,v 1.22 2002/03/26 07:38:58 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 /* XXX Process 'group-key' type sections
175 This is currently faked out so that the vendors file format is
176 parsed but nothing is done with it except check for validity */
177 Top
= Cnf
.Tree("group-key");
178 for (Top
= (Top
== 0?0:Top
->Child
); Top
!= 0; Top
= Top
->Next
)
180 Configuration
Block(Top
);
183 Vendor
= new pkgSourceList::Vendor
;
185 Vendor
->VendorID
= Top
->Tag
;
186 Vendor
->Description
= Block
.Find("Name");
188 if (Vendor
->Description
.empty() == true)
190 _error
->Error(_("Vendor block %s is invalid"),
191 Vendor
->VendorID
.c_str());
196 VendorList
.push_back(Vendor
);
199 return !_error
->PendingError();
202 // SourceList::ReadMainList - Read the main source list from etc /*{{{*/
203 // ---------------------------------------------------------------------
205 bool pkgSourceList::ReadMainList()
207 return ReadVendors() && Read(_config
->FindFile("Dir::Etc::sourcelist"));
210 // SourceList::Read - Parse the sourcelist file /*{{{*/
211 // ---------------------------------------------------------------------
213 bool pkgSourceList::Read(string File
)
215 // Open the stream for reading
216 ifstream
F(File
.c_str(),ios::in
/*| ios::nocreate*/);
218 return _error
->Errno("ifstream::ifstream",_("Opening %s"),File
.c_str());
220 SrcList
.erase(SrcList
.begin(),SrcList
.end());
224 while (F
.eof() == false)
226 F
.getline(Buffer
,sizeof(Buffer
));
228 _strtabexpand(Buffer
,sizeof(Buffer
));
232 for (I
= Buffer
; *I
!= 0 && *I
!= '#'; I
++);
235 const char *C
= _strstrip(Buffer
);
238 if (C
[0] == '#' || C
[0] == 0)
243 if (ParseQuoteWord(C
,LineType
) == false)
244 return _error
->Error(_("Malformed line %u in source list %s (type)"),CurLine
,File
.c_str());
246 Type
*Parse
= Type::GetType(LineType
.c_str());
248 return _error
->Error(_("Type '%s' is not known in on line %u in source list %s"),LineType
.c_str(),CurLine
,File
.c_str());
250 // Authenticated repository
251 Vendor
const *Vndr
= 0;
256 if (ParseQuoteWord(C
,VendorID
) == false)
257 return _error
->Error(_("Malformed line %u in source list %s (vendor id)"),CurLine
,File
.c_str());
259 if (VendorID
.length() < 2 || VendorID
.end()[-1] != ']')
260 return _error
->Error(_("Malformed line %u in source list %s (vendor id)"),CurLine
,File
.c_str());
261 VendorID
= string(VendorID
,1,VendorID
.size()-2);
263 for (vector
<Vendor
const *>::const_iterator iter
= VendorList
.begin();
264 iter
!= VendorList
.end(); iter
++)
266 if ((*iter
)->VendorID
== VendorID
)
274 return _error
->Error(_("Unknown vendor ID '%s' in line %u of source list %s"),
275 VendorID
.c_str(),CurLine
,File
.c_str());
278 if (Parse
->ParseLine(SrcList
,Vndr
,C
,CurLine
,File
) == false)
284 // SourceList::FindIndex - Get the index associated with a file /*{{{*/
285 // ---------------------------------------------------------------------
287 bool pkgSourceList::FindIndex(pkgCache::PkgFileIterator File
,
288 pkgIndexFile
*&Found
) const
290 for (const_iterator I
= SrcList
.begin(); I
!= SrcList
.end(); I
++)
292 if ((*I
)->FindInCache(*File
.Cache()) == File
)
302 // SourceList::GetIndexes - Load the index files into the downloader /*{{{*/
303 // ---------------------------------------------------------------------
305 bool pkgSourceList::GetIndexes(pkgAcquire
*Owner
) const
307 for (const_iterator I
= SrcList
.begin(); I
!= SrcList
.end(); I
++)
308 if ((*I
)->GetIndexes(Owner
) == false)