diff options
author | Arch Librarian <arch@canonical.com> | 2004-09-20 16:51:15 +0000 |
---|---|---|
committer | Arch Librarian <arch@canonical.com> | 2004-09-20 16:51:15 +0000 |
commit | 93bf083d699c60f1ac40297bfa6783fb0cb800d8 (patch) | |
tree | 456e6c73d98b317d85cbea60728cf9e93546bbd8 /apt-pkg | |
parent | 779e5b002e216565108cdb4ad9598e1af650f004 (diff) |
Sync
Author: jgg
Date: 1998-10-30 07:53:30 GMT
Sync
Diffstat (limited to 'apt-pkg')
-rw-r--r-- | apt-pkg/acquire-item.cc | 12 | ||||
-rw-r--r-- | apt-pkg/acquire-method.cc | 245 | ||||
-rw-r--r-- | apt-pkg/acquire-method.h | 65 | ||||
-rw-r--r-- | apt-pkg/acquire-worker.cc | 40 | ||||
-rw-r--r-- | apt-pkg/acquire-worker.h | 5 | ||||
-rw-r--r-- | apt-pkg/acquire.cc | 125 | ||||
-rw-r--r-- | apt-pkg/acquire.h | 6 | ||||
-rw-r--r-- | apt-pkg/contrib/configuration.cc | 27 | ||||
-rw-r--r-- | apt-pkg/contrib/configuration.h | 4 | ||||
-rw-r--r-- | apt-pkg/contrib/strutl.cc | 114 | ||||
-rw-r--r-- | apt-pkg/contrib/strutl.h | 19 | ||||
-rw-r--r-- | apt-pkg/init.cc | 20 | ||||
-rw-r--r-- | apt-pkg/makefile | 4 | ||||
-rw-r--r-- | apt-pkg/tagfile.cc | 8 |
14 files changed, 582 insertions, 112 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index 4435e2553..f8cc7a0de 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: acquire-item.cc,v 1.5 1998/10/26 07:11:43 jgg Exp $ +// $Id: acquire-item.cc,v 1.6 1998/10/30 07:53:34 jgg Exp $ /* ###################################################################### Acquire Item - Item to acquire @@ -46,13 +46,17 @@ pkgAcquire::Item::~Item() /*}}}*/ // Acquire::Item::Failed - Item failed to download /*{{{*/ // --------------------------------------------------------------------- -/* */ +/* We return to an idle state if there are still other queues that could + fetch this object */ void pkgAcquire::Item::Failed(string Message) { - Status = StatError; - ErrorText = LookupTag(Message,"Message"); + Status = StatIdle; if (QueueCounter <= 1) + { + ErrorText = LookupTag(Message,"Message"); + Status = StatError; Owner->Dequeue(this); + } } /*}}}*/ // Acquire::Item::Done - Item downloaded OK /*{{{*/ diff --git a/apt-pkg/acquire-method.cc b/apt-pkg/acquire-method.cc new file mode 100644 index 000000000..bd7dd6779 --- /dev/null +++ b/apt-pkg/acquire-method.cc @@ -0,0 +1,245 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +// $Id: acquire-method.cc,v 1.1 1998/10/30 07:53:35 jgg Exp $ +/* ###################################################################### + + Acquire Method + + ##################################################################### */ + /*}}}*/ +// Include Files /*{{{*/ +#ifdef __GNUG__ +#pragma implementation "apt-pkg/acquire-method.h" +#endif +#include <apt-pkg/acquire-method.h> +#include <apt-pkg/error.h> +#include <apt-pkg/configuration.h> +#include <strutl.h> +#include <apt-pkg/fileutl.h> + +#include <stdio.h> + /*}}}*/ + +// AcqMethod::pkgAcqMethod - Constructor /*{{{*/ +// --------------------------------------------------------------------- +/* This constructs the initialization text */ +pkgAcqMethod::pkgAcqMethod(const char *Ver,unsigned long Flags) +{ + char S[300] = ""; + char *End = S; + strcat(End,"100 Capabilities\n"); + sprintf(End+strlen(End),"Version: %s\n",Ver); + + if ((Flags & SingleInstance) == SingleInstance) + strcat(End,"Single-Instance: true\n"); + + if ((Flags & PreScan) == PreScan) + strcat(End,"Pre-Scan: true\n"); + + if ((Flags & Pipeline) == Pipeline) + strcat(End,"Pipeline: true\n"); + + if ((Flags & SendConfig) == SendConfig) + strcat(End,"Send-Config: true\n"); + strcat(End,"\n"); + + if (write(STDOUT_FILENO,S,strlen(S)) != (signed)strlen(S)) + exit(100); +} + /*}}}*/ +// AcqMethod::Fail - A fetch has failed /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void pkgAcqMethod::Fail() +{ + string Err = "Undetermined Error"; + if (_error->empty() == false) + _error->PopMessage(Err); + _error->Discard(); + Fail(Err); +} + /*}}}*/ +// AcqMethod::Fail - A fetch has failed /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void pkgAcqMethod::Fail(string Err) +{ + char S[1024]; + snprintf(S,sizeof(S),"400 URI Failure\nURI: %s\n" + "Message %s\n\n",CurrentURI.c_str(),Err.c_str()); + + if (write(STDOUT_FILENO,S,strlen(S)) != (signed)strlen(S)) + exit(100); +} + /*}}}*/ +// AcqMethod::URIStart - Indicate a download is starting /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void pkgAcqMethod::URIStart(FetchResult &Res,unsigned long Resume = 0) +{ + char S[1024] = ""; + char *End = S; + + End += snprintf(S,sizeof(S),"200 URI Start\nURI: %s\n",CurrentURI.c_str()); + if (Res.Size != 0) + End += snprintf(End,sizeof(S) - (End - S),"Size: %u\n",Res.Size); + + if (Res.LastModified != 0) + End += snprintf(End,sizeof(S) - (End - S),"Last-Modified: %s\n", + TimeRFC1123(Res.LastModified).c_str()); + + if (Resume != 0) + End += snprintf(End,sizeof(S) - (End - S),"Resume-Point: %u\n", + Resume); + + strcat(End,"\n"); + if (write(STDOUT_FILENO,S,strlen(S)) != (signed)strlen(S)) + exit(100); +} + /*}}}*/ +// AcqMethod::URIDone - A URI is finished /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt) +{ + char S[1024] = ""; + char *End = S; + + End += snprintf(S,sizeof(S),"201 URI Done\nURI: %s\n",CurrentURI.c_str()); + + if (Res.Filename.empty() == false) + End += snprintf(End,sizeof(S) - (End - S),"Filename: %s\n",Res.Filename.c_str()); + + if (Res.Size != 0) + End += snprintf(End,sizeof(S) - (End - S),"Size: %u\n",Res.Size); + + if (Res.LastModified != 0) + End += snprintf(End,sizeof(S) - (End - S),"Last-Modified: %s\n", + TimeRFC1123(Res.LastModified).c_str()); + + if (Res.MD5Sum.empty() == false) + End += snprintf(End,sizeof(S) - (End - S),"MD5Sum: %s\n",Res.MD5Sum.c_str()); + + if (Res.IMSHit == true) + strcat(End,"IMS-Hit: true\n"); + End = S + strlen(S); + + if (Alt != 0) + { + if (Alt->Filename.empty() == false) + End += snprintf(End,sizeof(S) - (End - S),"Alt-Filename: %s\n",Alt->Filename.c_str()); + + if (Alt->Size != 0) + End += snprintf(End,sizeof(S) - (End - S),"Alt-Size: %u\n",Alt->Size); + + if (Alt->LastModified != 0) + End += snprintf(End,sizeof(S) - (End - S),"Alt-Last-Modified: %s\n", + TimeRFC1123(Alt->LastModified).c_str()); + + if (Alt->MD5Sum.empty() == false) + End += snprintf(End,sizeof(S) - (End - S),"Alt-MD5Sum: %s\n", + Alt->MD5Sum.c_str()); + + if (Alt->IMSHit == true) + strcat(End,"Alt-IMS-Hit: true\n"); + } + + strcat(End,"\n"); + if (write(STDOUT_FILENO,S,strlen(S)) != (signed)strlen(S)) + exit(100); +} + /*}}}*/ +// AcqMethod::Configuration - Handle the configuration message /*{{{*/ +// --------------------------------------------------------------------- +/* This parses each configuration entry and puts it into the _config + Configuration class. */ +bool pkgAcqMethod::Configuration(string Message) +{ + ::Configuration &Cnf = *_config; + + const char *I = Message.begin(); + + unsigned int Length = strlen("Config-Item"); + for (; I + Length < Message.end(); I++) + { + // Not a config item + if (I[Length] != ':' || stringcasecmp(I,I+Length,"Config-Item") != 0) + continue; + + I += Length + 1; + + for (; I < Message.end() && *I == ' '; I++); + const char *Equals = I; + for (; Equals < Message.end() && *Equals != '='; Equals++); + const char *End = Equals; + for (; End < Message.end() && *End != '\n'; End++); + if (End == Equals) + return false; + + Cnf.Set(string(I,Equals-I),string(Equals+1,End-Equals-1)); + I = End; + } + + return true; +} + /*}}}*/ +// AcqMethod::Run - Run the message engine /*{{{*/ +// --------------------------------------------------------------------- +/* */ +int pkgAcqMethod::Run() +{ + SetNonBlock(STDIN_FILENO,true); + + while (1) + { + if (Messages.empty() == true) + if (WaitFd(STDIN_FILENO) == false) + return 0; + + if (ReadMessages(STDIN_FILENO,Messages) == false) + return 0; + + string Message = Messages.front(); + Messages.erase(Messages.begin()); + + // Fetch the message number + char *End; + int Number = strtol(Message.c_str(),&End,10); + if (End == Message.c_str()) + { + cerr << "Malformed message!" << endl; + return 100; + } + + switch (Number) + { + case 601: + if (Configuration(Message) == false) + return 100; + break; + + case 600: + { + CurrentURI = LookupTag(Message,"URI"); + DestFile = LookupTag(Message,"FileName"); + StrToTime(LookupTag(Message,"Last-Modified"),LastModified); + + if (Fetch(Message,CurrentURI) == false) + Fail(); + break; + } + } + } + + return 0; +} + /*}}}*/ +// AcqMethod::FetchResult::FetchResult - Constructor /*{{{*/ +// --------------------------------------------------------------------- +/* */ +pkgAcqMethod::FetchResult::FetchResult() : LastModified(0), + IMSHit(false), Size(0) +{ +} + /*}}}*/ + diff --git a/apt-pkg/acquire-method.h b/apt-pkg/acquire-method.h new file mode 100644 index 000000000..74489913f --- /dev/null +++ b/apt-pkg/acquire-method.h @@ -0,0 +1,65 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +// $Id: acquire-method.h,v 1.1 1998/10/30 07:53:35 jgg Exp $ +/* ###################################################################### + + Acquire Method - Method helper class + functions + + These functions are designed to be used within the method task to + ease communication with APT. + + ##################################################################### */ + /*}}}*/ +#ifndef PKGLIB_ACQUIRE_METHOD_H +#define PKGLIB_ACQUIRE_METHOD_H + +#include <apt-pkg/configuration.h> +#include <strutl.h> + +#ifdef __GNUG__ +#pragma interface "apt-pkg/acquire-method.h" +#endif + +class pkgAcqMethod +{ + protected: + + string CurrentURI; + string DestFile; + time_t LastModified; + + vector<string> Messages; + + struct FetchResult + { + string MD5Sum; + time_t LastModified; + bool IMSHit; + string Filename; + unsigned long Size; + FetchResult(); + }; + + // Handlers for messages + virtual bool Configuration(string Message); + virtual bool Fetch(string Message,URI Get) {return true;}; + + // Outgoing messages + void Fail(); + void Fail(string Why); +// void Log(const char *Format,...); + void URIStart(FetchResult &Res,unsigned long Resume = 0); + void URIDone(FetchResult &Res,FetchResult *Alt = 0); + + public: + + enum CnfFlags {SingleInstance = (1<<0), PreScan = (1<<1), + Pipeline = (1<<2), SendConfig = (1<<3)}; + + int Run(); + + pkgAcqMethod(const char *Ver,unsigned long Flags = 0); + virtual ~pkgAcqMethod() {}; +}; + +#endif diff --git a/apt-pkg/acquire-worker.cc b/apt-pkg/acquire-worker.cc index 392c8ca47..5195b5b8d 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.7 1998/10/26 07:11:45 jgg Exp $ +// $Id: acquire-worker.cc,v 1.8 1998/10/30 07:53:35 jgg Exp $ /* ###################################################################### Acquire Worker @@ -218,7 +218,7 @@ bool pkgAcquire::Worker::RunMessages() { if (Itm == 0) { - _error->Warning("Method gave invalid 200 URI Start message"); + _error->Error("Method gave invalid 200 URI Start message"); break; } CurrentItem = Itm; @@ -233,7 +233,7 @@ bool pkgAcquire::Worker::RunMessages() { if (Itm == 0) { - _error->Warning("Method gave invalid 400 URI Failure message"); + _error->Error("Method gave invalid 201 URI Done message"); break; } @@ -248,7 +248,7 @@ bool pkgAcquire::Worker::RunMessages() { if (Itm == 0) { - _error->Warning("Method gave invalid 400 URI Failure message"); + _error->Error("Method gave invalid 400 URI Failure message"); break; } @@ -417,35 +417,3 @@ bool pkgAcquire::Worker::MethodFailure() return false; } /*}}}*/ - -// InjectConfiguration - Configuration aid for methods /*{{{*/ -// --------------------------------------------------------------------- -/* */ -bool pkgInjectConfiguration(string &Message,Configuration &Cnf) -{ - const char *I = Message.begin(); - - unsigned int Length = strlen("Config-Item"); - for (; I + Length < Message.end(); I++) - { - // Not a config item - if (I[Length] != ':' || stringcasecmp(I,I+Length,"Config-Item") != 0) - continue; - - I += Length + 1; - - for (; I < Message.end() && *I == ' '; I++); - const char *Equals = I; - for (; Equals < Message.end() && *Equals != '='; Equals++); - const char *End = Equals; - for (; End < Message.end() && *End != '\n'; End++); - if (End == Equals) - return false; - - Cnf.Set(string(I,Equals-I),string(Equals+1,End-Equals-1)); - I = End; - } - - return true; -} - /*}}}*/ diff --git a/apt-pkg/acquire-worker.h b/apt-pkg/acquire-worker.h index b0acde3e3..ad1ea9165 100644 --- a/apt-pkg/acquire-worker.h +++ b/apt-pkg/acquire-worker.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: acquire-worker.h,v 1.5 1998/10/26 07:11:46 jgg Exp $ +// $Id: acquire-worker.h,v 1.6 1998/10/30 07:53:36 jgg Exp $ /* ###################################################################### Acquire Worker - Worker process manager @@ -13,7 +13,6 @@ #define PKGLIB_ACQUIRE_WORKER_H #include <apt-pkg/acquire.h> -#include <apt-pkg/configuration.h> #ifdef __GNUG__ #pragma interface "apt-pkg/acquire-worker.h" @@ -81,6 +80,4 @@ class pkgAcquire::Worker ~Worker(); }; -bool pkgInjectConfiguration(string &Message,Configuration &Cnf); - #endif diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc index 4ed21831d..3ed0e5d28 100644 --- a/apt-pkg/acquire.cc +++ b/apt-pkg/acquire.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: acquire.cc,v 1.5 1998/10/26 07:11:47 jgg Exp $ +// $Id: acquire.cc,v 1.6 1998/10/30 07:53:37 jgg Exp $ /* ###################################################################### Acquire - File Acquiration @@ -26,7 +26,7 @@ // Acquire::pkgAcquire - Constructor /*{{{*/ // --------------------------------------------------------------------- -/* */ +/* We grab some runtime state from the configuration space */ pkgAcquire::pkgAcquire() { Queues = 0; @@ -46,7 +46,7 @@ pkgAcquire::pkgAcquire() /*}}}*/ // Acquire::~pkgAcquire - Destructor /*{{{*/ // --------------------------------------------------------------------- -/* Free our memory */ +/* Free our memory, clean up the queues (destroy the workers) */ pkgAcquire::~pkgAcquire() { while (Items.size() != 0) @@ -69,7 +69,8 @@ pkgAcquire::~pkgAcquire() /*}}}*/ // Acquire::Add - Add a new item /*{{{*/ // --------------------------------------------------------------------- -/* */ +/* This puts an item on the acquire list. This list is mainly for tracking + item status */ void pkgAcquire::Add(Item *Itm) { Items.push_back(Itm); @@ -77,7 +78,7 @@ void pkgAcquire::Add(Item *Itm) /*}}}*/ // Acquire::Remove - Remove a item /*{{{*/ // --------------------------------------------------------------------- -/* */ +/* Remove an item from the acquire list. This is usually not used.. */ void pkgAcquire::Remove(Item *Itm) { for (vector<Item *>::iterator I = Items.begin(); I < Items.end(); I++) @@ -89,7 +90,8 @@ void pkgAcquire::Remove(Item *Itm) /*}}}*/ // Acquire::Add - Add a worker /*{{{*/ // --------------------------------------------------------------------- -/* */ +/* A list of workers is kept so that the select loop can direct their FD + usage. */ void pkgAcquire::Add(Worker *Work) { Work->NextAcquire = Workers; @@ -98,9 +100,14 @@ void pkgAcquire::Add(Worker *Work) /*}}}*/ // Acquire::Remove - Remove a worker /*{{{*/ // --------------------------------------------------------------------- -/* */ +/* A worker has died. This can not be done while the select loop is running + as it would require that RunFds could handling a changing list state and + it cant.. */ void pkgAcquire::Remove(Worker *Work) { + if (Running == true) + abort(); + Worker **I = &Workers; for (; *I != 0;) { @@ -113,7 +120,10 @@ void pkgAcquire::Remove(Worker *Work) /*}}}*/ // Acquire::Enqueue - Queue an URI for fetching /*{{{*/ // --------------------------------------------------------------------- -/* */ +/* This is the entry point for an item. An item calls this function when + it is construction which creates a queue (based on the current queue + mode) and puts the item in that queue. If the system is running then + the queue might be started. */ void pkgAcquire::Enqueue(Item *Itm,string URI,string Description) { // Determine which queue to put the item in @@ -129,15 +139,15 @@ void pkgAcquire::Enqueue(Item *Itm,string URI,string Description) I = new Queue(Name,this); I->Next = Queues; Queues = I; + + if (Running == true) + I->Startup(); } // Queue it into the named queue I->Enqueue(Itm,URI,Description); ToFetch++; - - if (Running == true) - I->Startup(); - + // Some trace stuff if (Debug == true) { @@ -149,12 +159,16 @@ void pkgAcquire::Enqueue(Item *Itm,string URI,string Description) /*}}}*/ // Acquire::Dequeue - Remove an item from all queues /*{{{*/ // --------------------------------------------------------------------- -/* */ +/* This is called when an item is finished being fetched. It removes it + from all the queues */ void pkgAcquire::Dequeue(Item *Itm) { Queue *I = Queues; for (; I != 0; I = I->Next) I->Dequeue(Itm); + + if (Debug == true) + clog << "Dequeuing " << Itm->DestFile << endl; ToFetch--; } /*}}}*/ @@ -163,24 +177,20 @@ void pkgAcquire::Dequeue(Item *Itm) /* The string returned depends on the configuration settings and the method parameters. Given something like http://foo.org/bar it can return http://foo.org or http */ -string pkgAcquire::QueueName(string URI) +string pkgAcquire::QueueName(string Uri) { - const MethodConfig *Config = GetConfig(URIAccess(URI)); + URI U(Uri); + + const MethodConfig *Config = GetConfig(U.Access); if (Config == 0) return string(); /* Single-Instance methods get exactly one queue per URI. This is also used for the Access queue method */ if (Config->SingleInstance == true || QueueMode == QueueAccess) - return URIAccess(URI); - - // Host based queue - string::iterator I = URI.begin(); - for (; I < URI.end() && *I != ':'; I++); - for (; I < URI.end() && (*I == '/' || *I == ':'); I++); - for (; I < URI.end() && *I != '/'; I++); - - return string(URI,0,I - URI.begin()); + return U.Access; + + return U.Access + ':' + U.Host; } /*}}}*/ // Acquire::GetConfig - Fetch the configuration information /*{{{*/ @@ -234,7 +244,9 @@ void pkgAcquire::SetFds(int &Fd,fd_set *RSet,fd_set *WSet) /*}}}*/ // Acquire::RunFds - Deal with active FDs /*{{{*/ // --------------------------------------------------------------------- -/* Dispatch active FDs over to the proper workers */ +/* Dispatch active FDs over to the proper workers. It is very important + that a worker never be erased while this is running! The queue class + should never erase a worker except during shutdown processing. */ void pkgAcquire::RunFds(fd_set *RSet,fd_set *WSet) { for (Worker *I = Workers; I != 0; I = I->NextAcquire) @@ -273,15 +285,26 @@ bool pkgAcquire::Run() Running = false; return _error->Errno("select","Select has failed"); } - + RunFds(&RFds,&WFds); + if (_error->PendingError() == true) + break; } for (Queue *I = Queues; I != 0; I = I->Next) I->Shutdown(); Running = false; - return true; + return _error->PendingError(); +} + /*}}}*/ +// pkgAcquire::Bump - Called when an item is dequeued /*{{{*/ +// --------------------------------------------------------------------- +/* This routine bumps idle queues in hopes that they will be able to fetch + the dequeued item */ +void pkgAcquire::Bump() +{ + } /*}}}*/ @@ -339,6 +362,9 @@ void pkgAcquire::Queue::Enqueue(Item *Owner,string URI,string Description) Items->URI = URI; Items->Description = Description; Owner->QueueCounter++; + + if (Items->Next == 0) + Cycle(); } /*}}}*/ // Queue::Dequeue - Remove an item from the queue /*{{{*/ @@ -368,7 +394,8 @@ bool pkgAcquire::Queue::Startup() { Shutdown(); - pkgAcquire::MethodConfig *Cnf = Owner->GetConfig(URIAccess(Name)); + URI U(Name); + pkgAcquire::MethodConfig *Cnf = Owner->GetConfig(U.Access); if (Cnf == 0) return false; @@ -376,11 +403,8 @@ bool pkgAcquire::Queue::Startup() Owner->Add(Workers); if (Workers->Start() == false) return false; - - Items->Worker = Workers; - Workers->QueueItem(Items); - return true; + return Cycle(); } /*}}}*/ // Queue::Shutdown - Shutdown the worker processes /*{{{*/ @@ -414,16 +438,41 @@ pkgAcquire::Queue::QItem *pkgAcquire::Queue::FindItem(string URI,pkgAcquire::Wor // Queue::ItemDone - Item has been completed /*{{{*/ // --------------------------------------------------------------------- /* The worker signals this which causes the item to be removed from the - queue. */ + queue. If this is the last queue instance then it is removed from the + main queue too.*/ bool pkgAcquire::Queue::ItemDone(QItem *Itm) { - Dequeue(Itm->Owner); + if (Itm->Owner->QueueCounter <= 1) + Owner->Dequeue(Itm->Owner); + else + { + Dequeue(Itm->Owner); + Owner->Bump(); + } - if (Items == 0) + return Cycle(); +} + /*}}}*/ +// Queue::Cycle - Queue new items into the method /*{{{*/ +// --------------------------------------------------------------------- +/* This locates a new idle item and sends it to the worker */ +bool pkgAcquire::Queue::Cycle() +{ + if (Items == 0 || Workers == 0) return true; - Items->Worker = Workers; - Items->Owner->Status = pkgAcquire::Item::StatFetching; - return Workers->QueueItem(Items); + // Look for a queable item + QItem *I = Items; + for (; I != 0; I = I->Next) + if (I->Owner->Status == pkgAcquire::Item::StatIdle) + break; + + // Nothing to do, queue is idle. + if (I == 0) + return true; + + I->Worker = Workers; + I->Owner->Status = pkgAcquire::Item::StatFetching; + return Workers->QueueItem(I); } /*}}}*/ diff --git a/apt-pkg/acquire.h b/apt-pkg/acquire.h index 2e111cccd..20ce2873f 100644 --- a/apt-pkg/acquire.h +++ b/apt-pkg/acquire.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: acquire.h,v 1.5 1998/10/26 07:11:48 jgg Exp $ +// $Id: acquire.h,v 1.6 1998/10/30 07:53:38 jgg Exp $ /* ###################################################################### Acquire - File Acquiration @@ -80,6 +80,9 @@ class pkgAcquire // FDSET managers for derived classes void SetFds(int &Fd,fd_set *RSet,fd_set *WSet); void RunFds(fd_set *RSet,fd_set *WSet); + + // A queue calls this when it dequeues an item + void Bump(); public: @@ -129,6 +132,7 @@ class pkgAcquire::Queue bool Startup(); bool Shutdown(); + bool Cycle(); Queue(string Name,pkgAcquire *Owner); ~Queue(); diff --git a/apt-pkg/contrib/configuration.cc b/apt-pkg/contrib/configuration.cc index fa07ed35a..27299ec6a 100644 --- a/apt-pkg/contrib/configuration.cc +++ b/apt-pkg/contrib/configuration.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: configuration.cc,v 1.8 1998/10/22 04:56:45 jgg Exp $ +// $Id: configuration.cc,v 1.9 1998/10/30 07:53:42 jgg Exp $ /* ###################################################################### Configuration Class @@ -212,6 +212,31 @@ bool Configuration::Exists(const char *Name) return true; } /*}}}*/ +// Configuration::Dump - Dump the config /*{{{*/ +// --------------------------------------------------------------------- +/* Dump the entire configuration space */ +void Configuration::Dump() +{ + /* Write out all of the configuration directives by walking the + configuration tree */ + const Configuration::Item *Top = _config->Tree(0); + for (; Top != 0;) + { + clog << Top->FullTag() << " \"" << Top->Value << "\";" << endl; + + if (Top->Child != 0) + { + Top = Top->Child; + continue; + } + + while (Top != 0 && Top->Next == 0) + Top = Top->Parent; + if (Top != 0) + Top = Top->Next; + } +} + /*}}}*/ // Configuration::Item::FullTag - Return the fully scoped tag /*{{{*/ // --------------------------------------------------------------------- diff --git a/apt-pkg/contrib/configuration.h b/apt-pkg/contrib/configuration.h index 14c80e4ad..cf5a90f57 100644 --- a/apt-pkg/contrib/configuration.h +++ b/apt-pkg/contrib/configuration.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: configuration.h,v 1.6 1998/10/22 04:56:46 jgg Exp $ +// $Id: configuration.h,v 1.7 1998/10/30 07:53:44 jgg Exp $ /* ###################################################################### Configuration Class @@ -65,6 +65,8 @@ class Configuration bool Exists(const char *Name); inline const Item *Tree(const char *Name) {return Lookup(Name,false);}; + + void Dump(); Configuration(); }; diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc index 68421a241..d6a7143e4 100644 --- a/apt-pkg/contrib/strutl.cc +++ b/apt-pkg/contrib/strutl.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: strutl.cc,v 1.8 1998/10/24 04:58:07 jgg Exp $ +// $Id: strutl.cc,v 1.9 1998/10/30 07:53:45 jgg Exp $ /* ###################################################################### String Util - Some usefull string functions. @@ -308,17 +308,6 @@ string URItoFileName(string URI) return URI; } /*}}}*/ -// URIAccess - Return the access method for the URI /*{{{*/ -// --------------------------------------------------------------------- -/* */ -string URIAccess(string URI) -{ - string::size_type Pos = URI.find(':'); - if (Pos == string::npos) - return URI; - return string(URI,0,Pos); -} - /*}}}*/ // Base64Encode - Base64 Encoding routine for short strings /*{{{*/ // --------------------------------------------------------------------- /* This routine performs a base64 transformation on a string. It was ripped @@ -619,3 +608,104 @@ bool StrToTime(string Val,time_t &Result) return true; } /*}}}*/ + +// URI::URI - Constructor /*{{{*/ +// --------------------------------------------------------------------- +/* This parses the URI into all of its components */ +URI::URI(string U) +{ + string::const_iterator I = U.begin(); + + // Locate the first colon, this seperates the scheme + for (; I < U.end() && *I != ':' ; I++); + string::const_iterator FirstColon = I; + + // Determine if this is a host type URI with a leading double // + string::const_iterator SingleSlash = I; + if (I + 3 < U.end() && I[1] == '/' && I[2] == '/') + { + // Locate the single / that starts the path + for (; I < U.end(); I++) + { + if (*I == '/' && I[1] == '/') + I += 2; + else + if (*I == '/') + break; + } + if (I > U.end()) + I = U.end(); + SingleSlash = I; + } + + // We can now write the access and path specifiers + Access = string(U,0,FirstColon - U.begin()); + if (SingleSlash != U.end()) + Path = string(U,SingleSlash - U.begin() + 1); + + // Now we attempt to locate a user:pass@host fragment + FirstColon += 3; + if (FirstColon >= U.end()) + return; + + if (FirstColon > SingleSlash) + FirstColon = SingleSlash; + + // Search for the @ + I = FirstColon; + for (; I < SingleSlash && *I != '@'; I++); + string::const_iterator At = I; + + // Colon in the @ section + I = FirstColon + 1; + for (; I < At && *I != ':'; I++); + string::const_iterator SecondColon = I; + + // Now write the host and user/pass + if (At == SingleSlash) + { + if (FirstColon < SingleSlash) + Host = string(U,FirstColon - U.begin(),SingleSlash - FirstColon); + } + else + { + Host = string(U,At - U.begin() + 1,SingleSlash - At - 1); + User = string(U,FirstColon - U.begin(),SecondColon - FirstColon); + if (SecondColon < At) + Password = string(U,SecondColon - U.begin() + 1,At - SecondColon - 1); + } + + // Now we parse off a pot number from the hostname + Port = 0; + string::size_type Pos = Host.rfind(':'); + if (Pos == string::npos) + return; + + Port = atoi(string(Host,Pos+1).c_str()); + Host = string(Host,0,Pos); +} + /*}}}*/ +// URI::operator string - Convert the URI to a string /*{{{*/ +// --------------------------------------------------------------------- +/* */ +URI::operator string() +{ + string Res = Access + ':'; + if (Host.empty() == false) + { + if (User.empty() == false) + { + Res += "//" + User; + if (Password.empty() == false) + Res += ":" + Password; + Res += "@"; + } + Res += Host; + } + + if (Path.empty() == false) + Res += "/" + Path; + + return Res; +} + /*}}}*/ diff --git a/apt-pkg/contrib/strutl.h b/apt-pkg/contrib/strutl.h index 1de2437b9..7e3e47344 100644 --- a/apt-pkg/contrib/strutl.h +++ b/apt-pkg/contrib/strutl.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: strutl.h,v 1.7 1998/10/23 00:50:00 jgg Exp $ +// $Id: strutl.h,v 1.8 1998/10/30 07:53:46 jgg Exp $ /* ###################################################################### String Util - These are some usefull string functions @@ -32,7 +32,6 @@ string TimeToStr(unsigned long Sec); string SubstVar(string Str,string Subst,string Contents); string Base64Encode(string Str); string URItoFileName(string URI); -string URIAccess(string URI); string TimeRFC1123(time_t Date); bool StrToTime(string Val,time_t &Result); string LookupTag(string Message,const char *Tag,const char *Default = 0); @@ -44,4 +43,20 @@ inline int stringcmp(const char *A,const char *AEnd,const char *B) {return strin int stringcasecmp(const char *A,const char *AEnd,const char *B,const char *BEnd); inline int stringcasecmp(const char *A,const char *AEnd,const char *B) {return stringcasecmp(A,AEnd,B,B+strlen(B));}; +class URI +{ + public: + + string Access; + string User; + string Password; + string Host; + string Path; + unsigned int Port; + + operator string(); + + URI(string Path); +}; + #endif diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc index 645d64d30..da11e3b40 100644 --- a/apt-pkg/init.cc +++ b/apt-pkg/init.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: init.cc,v 1.8 1998/10/20 02:39:19 jgg Exp $ +// $Id: init.cc,v 1.9 1998/10/30 07:53:39 jgg Exp $ /* ###################################################################### Init - Initialize the package library @@ -9,6 +9,7 @@ /*}}}*/ // Include files /*{{{*/ #include <apt-pkg/init.h> +#include <config.h> #include <sys/stat.h> #include <unistd.h> @@ -22,7 +23,7 @@ bool pkgInitialize(Configuration &Cnf) { // General APT things - Cnf.Set("APT::Architecture","i386"); + Cnf.Set("APT::Architecture",ARCHITECTURE); // State Cnf.Set("Dir::State","/var/state/apt/"); @@ -45,12 +46,23 @@ bool pkgInitialize(Configuration &Cnf) Cnf.Set("Dir::Etc","/etc/apt/"); Cnf.Set("Dir::Etc::sourcelist","sources.list"); Cnf.Set("Dir::Etc::main","apt.conf"); - + Cnf.Set("Dir::Bin::methods","/usr/lib/apt/metods"); + // Read the main config file string FName = Cnf.FindFile("Dir::Etc::main"); struct stat Buf; if (stat(FName.c_str(),&Buf) != 0) return true; - return ReadConfigFile(Cnf,FName); + + // Read an alternate config file + const char *Cfg = getenv("APT_CONFIG"); + + if (ReadConfigFile(Cnf,FName) != true || ReadConfigFile(Cnf,Cfg) != true) + return false; + + if (Cnf.FindB("Debug::pkgInitialize",false) == true) + Cnf.Dump(); + + return true; } /*}}}*/ diff --git a/apt-pkg/makefile b/apt-pkg/makefile index 5bf6f9a8b..733196bbe 100644 --- a/apt-pkg/makefile +++ b/apt-pkg/makefile @@ -23,7 +23,7 @@ SOURCE = contrib/mmap.cc contrib/error.cc contrib/strutl.cc \ SOURCE+= pkgcache.cc version.cc fileutl.cc pkgcachegen.cc depcache.cc \ orderlist.cc tagfile.cc sourcelist.cc packagemanager.cc \ pkgrecords.cc algorithms.cc acquire.cc acquire-item.cc \ - acquire-worker.cc init.cc templates.cc + acquire-worker.cc acquire-method.cc init.cc templates.cc # Source code for the debian specific components SOURCE+= deb/deblistparser.cc deb/debrecords.cc @@ -33,7 +33,7 @@ HEADERS = algorithms.h depcache.h mmap.h pkgcachegen.h cacheiterators.h \ error.h orderlist.h sourcelist.h configuration.h fileutl.h \ packagemanager.h tagfile.h deblistparser.h init.h pkgcache.h \ version.h progress.h pkgrecords.h debrecords.h cmndline.h \ - acquire.h acquire-worker.h acquire-item.h + acquire.h acquire-worker.h acquire-item.h acquire-method.h HEADERS := $(addprefix apt-pkg/,$(HEADERS)) diff --git a/apt-pkg/tagfile.cc b/apt-pkg/tagfile.cc index 23fc344f3..91653f602 100644 --- a/apt-pkg/tagfile.cc +++ b/apt-pkg/tagfile.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: tagfile.cc,v 1.12 1998/10/24 04:58:06 jgg Exp $ +// $Id: tagfile.cc,v 1.13 1998/10/30 07:53:41 jgg Exp $ /* ###################################################################### Fast scanner for RFC-822 type header information @@ -45,10 +45,7 @@ bool pkgTagFile::Step(pkgTagSection &Tag) return false; if (Tag.Scan(Start,End - Start) == false) - { - cout << string(Start,End-Start) << endl; return _error->Error("Unable to parse package file"); - } } Start += Tag.size(); iOffset += Tag.size(); @@ -87,10 +84,7 @@ bool pkgTagFile::Fill() else { if (Fd.Read(End,Size - (End - Buffer)) == false) - { - cout << "boink" << endl; return false; - } Left -= Size - (End - Buffer); End = Buffer + Size; |