X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/54676e1a82f400e37879bc931b6db0c13b8ebb3f..48d13628fd257b5bc1dec5c73b2829772a730e16:/apt-pkg/acquire-worker.cc diff --git a/apt-pkg/acquire-worker.cc b/apt-pkg/acquire-worker.cc index 2ec8f1bd8..4805b5ebc 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.21 1999/04/20 05:02:09 jgg Exp $ +// $Id: acquire-worker.cc,v 1.32 2001/02/20 07:03:17 jgg Exp $ /* ###################################################################### Acquire Worker @@ -22,11 +22,12 @@ #include #include +#include + #include #include #include #include -#include #include #include /*}}}*/ @@ -41,7 +42,9 @@ pkgAcquire::Worker::Worker(Queue *Q,MethodConfig *Cnf, Config = Cnf; Access = Cnf->Access; CurrentItem = 0; - + TotalSize = 0; + CurrentSize = 0; + Construct(); } /*}}}*/ @@ -54,6 +57,8 @@ pkgAcquire::Worker::Worker(MethodConfig *Cnf) Config = Cnf; Access = Cnf->Access; CurrentItem = 0; + TotalSize = 0; + CurrentSize = 0; Construct(); } @@ -83,9 +88,11 @@ pkgAcquire::Worker::~Worker() if (Process > 0) { - kill(Process,SIGINT); - if (waitpid(Process,0,0) != Process) - _error->Warning("I waited but nothing was there!"); + /* Closing of stdin is the signal to exit and die when the process + indicates it needs cleanup */ + if (Config->NeedsCleanup == false) + kill(Process,SIGINT); + ExecWait(Process,Access.c_str(),true); } } /*}}}*/ @@ -97,7 +104,7 @@ bool pkgAcquire::Worker::Start() // Get the method path string Method = _config->FindDir("Dir::Bin::Methods") + Access; if (FileExists(Method) == false) - return _error->Error("The method driver %s could not be found.",Method.c_str()); + return _error->Error(_("The method driver %s could not be found."),Method.c_str()); if (Debug == true) clog << "Starting method '" << Method << '\'' << endl; @@ -112,7 +119,7 @@ bool pkgAcquire::Worker::Start() return false; } for (int I = 0; I != 4; I++) - SetCloseExec(Pipes[0],true); + SetCloseExec(Pipes[I],true); // Fork off the process Process = ExecFork(); @@ -149,7 +156,7 @@ bool pkgAcquire::Worker::Start() // Read the configuration data if (WaitFd(InFd) == false || ReadMessages() == false) - return _error->Error("Method %s did not start correctly",Method.c_str()); + return _error->Error(_("Method %s did not start correctly"),Method.c_str()); RunMessages(); if (OwnerQ != 0) @@ -225,7 +232,12 @@ 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())); + + // Display update before completion + if (Log != 0 && Log->MorePulses == true) + Log->Pulse(Itm->Owner->GetOwner()); if (Log != 0) Log->Fetch(*Itm); @@ -241,12 +253,22 @@ bool pkgAcquire::Worker::RunMessages() _error->Error("Method gave invalid 201 URI Done message"); break; } - + pkgAcquire::Item *Owner = Itm->Owner; pkgAcquire::ItemDesc Desc = *Itm; + + // Display update before completion + if (Log != 0 && Log->MorePulses == true) + Log->Pulse(Owner->GetOwner()); + OwnerQ->ItemDone(Itm); + if (TotalSize != 0 && + (unsigned)atoi(LookupTag(Message,"Size","0").c_str()) != TotalSize) + _error->Warning("Bizarre Error - File size is not what the server reported %s %lu", + 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"),Config); ItemDone(); // Log that we are done @@ -262,7 +284,7 @@ bool pkgAcquire::Worker::RunMessages() } else Log->Done(Desc); - } + } break; } @@ -275,6 +297,10 @@ bool pkgAcquire::Worker::RunMessages() break; } + // Display update before completion + if (Log != 0 && Log->MorePulses == true) + Log->Pulse(Itm->Owner->GetOwner()); + pkgAcquire::Item *Owner = Itm->Owner; pkgAcquire::ItemDesc Desc = *Itm; OwnerQ->ItemDone(Itm); @@ -289,7 +315,7 @@ bool pkgAcquire::Worker::RunMessages() // 401 General Failure case 401: - _error->Error("Method %s General failure: %s",LookupTag(Message,"Message").c_str()); + _error->Error("Method %s General failure: %s",Access.c_str(),LookupTag(Message,"Message").c_str()); break; // 403 Media Change @@ -315,15 +341,20 @@ bool pkgAcquire::Worker::Capabilities(string Message) Config->Pipeline = StringToBool(LookupTag(Message,"Pipeline"),false); Config->SendConfig = StringToBool(LookupTag(Message,"Send-Config"),false); Config->LocalOnly = StringToBool(LookupTag(Message,"Local-Only"),false); + Config->NeedsCleanup = StringToBool(LookupTag(Message,"Needs-Cleanup"),false); + Config->Removable = StringToBool(LookupTag(Message,"Removable"),false); // Some debug text if (Debug == true) { clog << "Configured access method " << Config->Access << endl; - clog << "Version:" << Config->Version << " SingleInstance:" << - Config->SingleInstance << - " Pipeline:" << Config->Pipeline << " SendConfig:" << - Config->SendConfig << endl; + clog << "Version:" << Config->Version << + " SingleInstance:" << Config->SingleInstance << + " Pipeline:" << Config->Pipeline << + " SendConfig:" << Config->SendConfig << + " LocalOnly: " << Config->LocalOnly << + " NeedsCleanup: " << Config->NeedsCleanup << + " Removable: " << Config->Removable << endl; } return true; @@ -376,7 +407,7 @@ bool pkgAcquire::Worker::SendConfiguration() { if (Top->Value.empty() == false) { - string Line = "Config-Item: " + Top->FullTag() + "="; + string Line = "Config-Item: " + QuoteString(Top->FullTag(),"=\"\n") + "="; Line += QuoteString(Top->Value,"\n") + '\n'; Message += Line; } @@ -470,8 +501,7 @@ bool pkgAcquire::Worker::MethodFailure() { _error->Error("Method %s has died unexpectedly!",Access.c_str()); - if (waitpid(Process,0,0) != Process) - _error->Warning("I waited but nothing was there!"); + ExecWait(Process,Access.c_str(),true); Process = -1; close(InFd); close(OutFd); @@ -497,6 +527,10 @@ void pkgAcquire::Worker::Pulse() 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 /*{{{*/