X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/cbf217843cc8eaaebd6d798854d92aab961efd9d..27c69dd0b36e3da7b6061e597d755f5a60a0d31b:/apt-pkg/acquire-method.cc diff --git a/apt-pkg/acquire-method.cc b/apt-pkg/acquire-method.cc index 26f992bcf..fb45d9ee7 100644 --- a/apt-pkg/acquire-method.cc +++ b/apt-pkg/acquire-method.cc @@ -149,6 +149,8 @@ void pkgAcqMethod::URIStart(FetchResult &Res) if (Res.ResumePoint != 0) End += snprintf(End,sizeof(S)-4 - (End - S),"Resume-Point: %lu\n", Res.ResumePoint); + if (UsedMirror.empty() == false) + End += snprintf(End,sizeof(S)-4 - (End - S),"UsedMirror: %s\n",UsedMirror.c_str()); strcat(End,"\n"); if (write(STDOUT_FILENO,S,strlen(S)) != (signed)strlen(S)) @@ -378,9 +380,10 @@ int pkgAcqMethod::Run(bool Single) Tmp->Uri = LookupTag(Message,"URI"); Tmp->DestFile = LookupTag(Message,"FileName"); - if (StrToTime(LookupTag(Message,"Last-Modified"),Tmp->LastModified) == false) + if (RFC1123StrToTime(LookupTag(Message,"Last-Modified").c_str(),Tmp->LastModified) == false) Tmp->LastModified = 0; Tmp->IndexFile = StringToBool(LookupTag(Message,"Index-File"),false); + Tmp->FailIgnore = StringToBool(LookupTag(Message,"Fail-Ignore"),false); Tmp->Next = 0; // Append it to the list @@ -417,9 +420,11 @@ void pkgAcqMethod::Log(const char *Format,...) // sprintf the description char S[1024]; - unsigned int Len = snprintf(S,sizeof(S)-4,"101 Log\nURI: %s\n" - "Message: ",CurrentURI.c_str()); - + unsigned int Len = snprintf(S,sizeof(S)-4,"101 Log\n" + "URI: %s\n" + "UsedMirror: %s\n" + "Message: ", UsedMirror.c_str(), + CurrentURI.c_str()); vsnprintf(S+Len,sizeof(S)-4-Len,Format,args); strcat(S,"\n\n"); @@ -441,8 +446,11 @@ void pkgAcqMethod::Status(const char *Format,...) // sprintf the description char S[1024]; - unsigned int Len = snprintf(S,sizeof(S)-4,"102 Status\nURI: %s\n" - "Message: ",CurrentURI.c_str()); + unsigned int Len = snprintf(S,sizeof(S)-4,"102 Status\n" + "URI: %s\n" + "UsedMirror: %s\n" + "Message: ",UsedMirror.c_str(), + CurrentURI.c_str()); vsnprintf(S+Len,sizeof(S)-4-Len,Format,args); strcat(S,"\n\n"); @@ -451,7 +459,37 @@ void pkgAcqMethod::Status(const char *Format,...) exit(100); } /*}}}*/ +// AcqMethod::Redirect - Send a redirect message /*{{{*/ +// --------------------------------------------------------------------- +/* This method sends the redirect message and also manipulates the queue + to keep the pipeline synchronized. */ +void pkgAcqMethod::Redirect(const string &NewURI) +{ + string CurrentURI = ""; + if (Queue != 0) + CurrentURI = Queue->Uri; + + char S[1024]; + snprintf(S, sizeof(S)-50, "103 Redirect\nURI: %s\nNew-URI: %s\n\n", + CurrentURI.c_str(), NewURI.c_str()); + + if (write(STDOUT_FILENO,S,strlen(S)) != (ssize_t)strlen(S)) + exit(100); + // Change the URI for the request. + Queue->Uri = NewURI; + + /* To keep the pipeline synchronized, move the current request to + the end of the queue, past the end of the current pipeline. */ + FetchItem *I; + for (I = Queue; I->Next != 0; I = I->Next) ; + I->Next = Queue; + Queue = Queue->Next; + I->Next->Next = 0; + if (QueueBack == 0) + QueueBack = I->Next; +} + /*}}}*/ // AcqMethod::FetchResult::FetchResult - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */