]>
git.saurik.com Git - apt.git/blob - apt-pkg/indexrecords.cc
   1 // -*- mode: cpp; mode: fold -*- 
   3 // $Id: indexrecords.cc,v 1.1.2.4 2003/12/30 02:11:43 mdz Exp $ 
   5 // Include Files                                                        /*{{{*/ 
   6 #include <apt-pkg/indexrecords.h> 
   7 #include <apt-pkg/tagfile.h> 
   8 #include <apt-pkg/error.h> 
   9 #include <apt-pkg/strutl.h> 
  10 #include <apt-pkg/configuration.h> 
  16 string 
indexRecords::GetDist() const 
  21 bool indexRecords::CheckDist(const string MaybeDist
) const 
  23    return (this->Dist 
== MaybeDist
 
  24            || this->Suite 
== MaybeDist
); 
  27 string 
indexRecords::GetExpectedDist() const 
  29    return this->ExpectedDist
; 
  32 time_t indexRecords::GetValidUntil() const 
  34    return this->ValidUntil
; 
  37 const indexRecords::checkSum 
*indexRecords::Lookup(const string MetaKey
) 
  39    return Entries
[MetaKey
]; 
  42 bool indexRecords::Exists(string 
const &MetaKey
) const 
  44    return Entries
.count(MetaKey
) == 1; 
  47 bool indexRecords::Load(const string Filename
)                          /*{{{*/ 
  49    FileFd 
Fd(Filename
, FileFd::ReadOnly
); 
  50    pkgTagFile 
TagFile(&Fd
, Fd
.Size() + 256); // XXX 
  51    if (_error
->PendingError() == true) 
  53       strprintf(ErrorText
, _("Unable to parse Release file %s"),Filename
.c_str()); 
  57    pkgTagSection Section
; 
  58    const char *Start
, *End
; 
  59    // Skip over sections beginning with ----- as this is an idicator for clearsigns 
  61       if (TagFile
.Step(Section
) == false) 
  63          strprintf(ErrorText
, _("No sections in Release file %s"), Filename
.c_str()); 
  67       Section
.Get (Start
, End
, 0); 
  68    } while (End 
- Start 
> 5 && strncmp(Start
, "-----", 5) == 0); 
  70    Suite 
= Section
.FindS("Suite"); 
  71    Dist 
= Section
.FindS("Codename"); 
  74    for (i
=0;HashString::SupportedHashes()[i
] != NULL
; i
++) 
  76       if (!Section
.Find(HashString::SupportedHashes()[i
], Start
, End
)) 
  84          if (!parseSumData(Start
, End
, Name
, Hash
, Size
)) 
  86          indexRecords::checkSum 
*Sum 
= new indexRecords::checkSum
; 
  87          Sum
->MetaKeyFilename 
= Name
; 
  88          Sum
->Hash 
= HashString(HashString::SupportedHashes()[i
],Hash
); 
  95    if(HashString::SupportedHashes()[i
] == NULL
) 
  97       strprintf(ErrorText
, _("No Hash entry in Release file %s"), Filename
.c_str()); 
 101    string Label 
= Section
.FindS("Label"); 
 102    string StrDate 
= Section
.FindS("Date"); 
 103    string StrValidUntil 
= Section
.FindS("Valid-Until"); 
 105    // if we have a Valid-Until header in the Release file, use it as default 
 106    if (StrValidUntil
.empty() == false) 
 108       if(RFC1123StrToTime(StrValidUntil
.c_str(), ValidUntil
) == false) 
 110          strprintf(ErrorText
, _("Invalid 'Valid-Until' entry in Release file %s"), Filename
.c_str()); 
 114    // get the user settings for this archive and use what expires earlier 
 115    int MaxAge 
= _config
->FindI("Acquire::Max-ValidTime", 0); 
 116    if (Label
.empty() == true) 
 117       MaxAge 
= _config
->FindI(string("Acquire::Max-ValidTime::" + Label
).c_str(), MaxAge
); 
 119    if(MaxAge 
== 0) // No user settings, use the one from the Release file 
 123    if (RFC1123StrToTime(StrDate
.c_str(), date
) == false) 
 125       strprintf(ErrorText
, _("Invalid 'Date' entry in Release file %s"), Filename
.c_str()); 
 128    date 
+= 24*60*60*MaxAge
; 
 130    if (ValidUntil 
== 0 || ValidUntil 
> date
) 
 136 vector
<string
> indexRecords::MetaKeys()                                 /*{{{*/ 
 138    std::vector
<std::string
> keys
; 
 139    std::map
<string
,checkSum 
*>::iterator I 
= Entries
.begin(); 
 140    while(I 
!= Entries
.end()) { 
 141       keys
.push_back((*I
).first
); 
 147 bool indexRecords::parseSumData(const char *&Start
, const char *End
,    /*{{{*/ 
 148                                    string 
&Name
, string 
&Hash
, size_t &Size
) 
 153    /* Skip over the first blank */ 
 154    while ((*Start 
== '\t' || *Start 
== ' ' || *Start 
== '\n') 
 160    /* Move EntryEnd to the end of the first entry (the hash) */ 
 161    const char *EntryEnd 
= Start
; 
 162    while ((*EntryEnd 
!= '\t' && *EntryEnd 
!= ' ') 
 168    Hash
.append(Start
, EntryEnd
-Start
); 
 170    /* Skip over intermediate blanks */ 
 172    while (*Start 
== '\t' || *Start 
== ' ') 
 178    /* Find the end of the second entry (the size) */ 
 179    while ((*EntryEnd 
!= '\t' && *EntryEnd 
!= ' ' ) 
 185    Size 
= strtol (Start
, NULL
, 10); 
 187    /* Skip over intermediate blanks */ 
 189    while (*Start 
== '\t' || *Start 
== ' ') 
 195    /* Find the end of the third entry (the filename) */ 
 196    while ((*EntryEnd 
!= '\t' && *EntryEnd 
!= ' ' && *EntryEnd 
!= '\n') 
 200    Name
.append(Start
, EntryEnd
-Start
); 
 201    Start 
= EntryEnd
; //prepare for the next round 
 205 indexRecords::indexRecords() 
 209 indexRecords::indexRecords(const string ExpectedDist
) : 
 210    ExpectedDist(ExpectedDist
), ValidUntil(0)