X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/a72ace2091afd833e9359514644676c6bca55d96..bdae53f1bf6710404235bbbd071c55f4ec1a9330:/apt-pkg/acquire-worker.cc?ds=sidebyside diff --git a/apt-pkg/acquire-worker.cc b/apt-pkg/acquire-worker.cc index 3e76b3d9d..d5b4541a3 100644 --- a/apt-pkg/acquire-worker.cc +++ b/apt-pkg/acquire-worker.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: acquire-worker.cc,v 1.13 1998/11/29 01:24:18 jgg Exp $ +// $Id: acquire-worker.cc,v 1.26 1999/08/03 05:19:41 jgg Exp $ /* ###################################################################### Acquire Worker @@ -20,12 +20,14 @@ #include #include #include -#include +#include #include #include +#include #include -#include +#include +#include /*}}}*/ // Worker::Worker - Constructor for Queue startup /*{{{*/ @@ -38,7 +40,9 @@ pkgAcquire::Worker::Worker(Queue *Q,MethodConfig *Cnf, Config = Cnf; Access = Cnf->Access; CurrentItem = 0; - + TotalSize = 0; + CurrentSize = 0; + Construct(); } /*}}}*/ @@ -51,6 +55,8 @@ pkgAcquire::Worker::Worker(MethodConfig *Cnf) Config = Cnf; Access = Cnf->Access; CurrentItem = 0; + TotalSize = 0; + CurrentSize = 0; Construct(); } @@ -81,8 +87,7 @@ pkgAcquire::Worker::~Worker() if (Process > 0) { kill(Process,SIGINT); - if (waitpid(Process,0,0) != Process) - _error->Warning("I waited but nothing was there!"); + ExecWait(Process,Access.c_str(),true); } } /*}}}*/ @@ -112,12 +117,7 @@ bool pkgAcquire::Worker::Start() SetCloseExec(Pipes[0],true); // Fork off the process - Process = fork(); - if (Process < 0) - { - cerr << "FATAL -> Failed to fork." << endl; - exit(100); - } + Process = ExecFork(); // Spawn the subprocess if (Process == 0) @@ -135,7 +135,7 @@ bool pkgAcquire::Worker::Start() Args[1] = 0; execv(Args[0],(char **)Args); cerr << "Failed to exec method " << Args[0] << endl; - exit(100); + _exit(100); } // Fix up our FDs @@ -227,8 +227,9 @@ bool pkgAcquire::Worker::RunMessages() CurrentItem = Itm; CurrentSize = 0; TotalSize = atoi(LookupTag(Message,"Size","0").c_str()); + ResumePoint = atoi(LookupTag(Message,"Resume-Point","0").c_str()); Itm->Owner->Start(Message,atoi(LookupTag(Message,"Size","0").c_str())); - + if (Log != 0) Log->Fetch(*Itm); @@ -247,8 +248,13 @@ bool pkgAcquire::Worker::RunMessages() pkgAcquire::Item *Owner = Itm->Owner; pkgAcquire::ItemDesc Desc = *Itm; OwnerQ->ItemDone(Itm); + if (TotalSize != 0 && + atoi(LookupTag(Message,"Size","0").c_str()) != TotalSize) + _error->Warning("Bizzar Error - File size is not what the server reported %s %u", + LookupTag(Message,"Size","0").c_str(),TotalSize); + Owner->Done(Message,atoi(LookupTag(Message,"Size","0").c_str()), - LookupTag(Message,"MD5-Hash")); + LookupTag(Message,"MD5-Hash")); ItemDone(); // Log that we are done @@ -256,10 +262,15 @@ bool pkgAcquire::Worker::RunMessages() { if (StringToBool(LookupTag(Message,"IMS-Hit"),false) == true || StringToBool(LookupTag(Message,"Alt-IMS-Hit"),false) == true) - Log->IMSHit(Desc); + { + /* Hide 'hits' for local only sources - we also manage to + hide gets */ + if (Config->LocalOnly == false) + Log->IMSHit(Desc); + } else Log->Done(Desc); - } + } break; } @@ -275,12 +286,12 @@ bool pkgAcquire::Worker::RunMessages() pkgAcquire::Item *Owner = Itm->Owner; pkgAcquire::ItemDesc Desc = *Itm; OwnerQ->ItemDone(Itm); - Owner->Failed(Message); + Owner->Failed(Message,Config); ItemDone(); - + if (Log != 0) Log->Fail(Desc); - + break; } @@ -288,6 +299,11 @@ bool pkgAcquire::Worker::RunMessages() case 401: _error->Error("Method %s General failure: %s",LookupTag(Message,"Message").c_str()); break; + + // 403 Media Change + case 403: + MediaChange(Message); + break; } } return true; @@ -318,6 +334,32 @@ bool pkgAcquire::Worker::Capabilities(string Message) Config->SendConfig << endl; } + return true; +} + /*}}}*/ +// Worker::MediaChange - Request a media change /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool pkgAcquire::Worker::MediaChange(string Message) +{ + if (Log == 0 || Log->MediaChange(LookupTag(Message,"Media"), + LookupTag(Message,"Drive")) == false) + { + char S[300]; + sprintf(S,"603 Media Changed\nFailed: true\n\n"); + if (Debug == true) + clog << " -> " << Access << ':' << QuoteString(S,"\n") << endl; + OutQueue += S; + OutReady = true; + return true; + } + + char S[300]; + sprintf(S,"603 Media Changed\n\n"); + if (Debug == true) + clog << " -> " << Access << ':' << QuoteString(S,"\n") << endl; + OutQueue += S; + OutReady = true; return true; } /*}}}*/ @@ -396,7 +438,13 @@ bool pkgAcquire::Worker::QueueItem(pkgAcquire::Queue::QItem *Item) /* */ bool pkgAcquire::Worker::OutFdReady() { - int Res = write(OutFd,OutQueue.begin(),OutQueue.length()); + int Res; + do + { + Res = write(OutFd,OutQueue.begin(),OutQueue.length()); + } + while (Res < 0 && errno == EINTR); + if (Res <= 0) return MethodFailure(); @@ -428,9 +476,9 @@ bool pkgAcquire::Worker::InFdReady() read returned -1. */ bool pkgAcquire::Worker::MethodFailure() { - cerr << "Method " << Access << " has died unexpectedly!" << endl; - if (waitpid(Process,0,0) != Process) - _error->Warning("I waited but nothing was there!"); + _error->Error("Method %s has died unexpectedly!",Access.c_str()); + + ExecWait(Process,Access.c_str(),true); Process = -1; close(InFd); close(OutFd); @@ -451,12 +499,15 @@ void pkgAcquire::Worker::Pulse() { if (CurrentItem == 0) return; - - + struct stat Buf; if (stat(CurrentItem->Owner->DestFile.c_str(),&Buf) != 0) return; CurrentSize = Buf.st_size; + + // Hmm? Should not happen... + if (CurrentSize > TotalSize && TotalSize != 0) + TotalSize = CurrentSize; } /*}}}*/ // Worker::ItemDone - Called when the current item is finished /*{{{*/