summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/deb/dpkgpm.cc1
-rw-r--r--methods/mirror.cc30
-rw-r--r--methods/mirror.h4
3 files changed, 27 insertions, 8 deletions
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc
index 18c731788..7e5171eda 100644
--- a/apt-pkg/deb/dpkgpm.cc
+++ b/apt-pkg/deb/dpkgpm.cc
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <fcntl.h>
#include <sys/select.h>
+#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
diff --git a/methods/mirror.cc b/methods/mirror.cc
index b3a956b95..0a0d07e6b 100644
--- a/methods/mirror.cc
+++ b/methods/mirror.cc
@@ -162,7 +162,21 @@ bool MirrorMethod::DownloadMirrorFile(string mirror_uri_str)
return res;
}
-bool MirrorMethod::SelectMirror()
+bool MirrorMethod::SelectNextMirror()
+{
+ if (AllMirrors.size() < 1)
+ return false;
+
+ Mirror = AllMirrors[0];
+ AllMirrors.erase(AllMirrors.begin());
+ if(Debug)
+ cerr << "using mirror: " << Mirror << endl;
+
+ UsedMirror = Mirror;
+ return true;
+}
+
+bool MirrorMethod::InitMirrors()
{
// if we do not have a MirrorFile, fallback
if(!FileExists(MirrorFile))
@@ -179,11 +193,13 @@ bool MirrorMethod::SelectMirror()
// get into sync issues (got indexfiles from mirror A,
// but packages from mirror B - one might be out of date etc)
ifstream in(MirrorFile.c_str());
- getline(in, Mirror);
- if(Debug)
- cerr << "Using mirror: " << Mirror << endl;
-
- UsedMirror = Mirror;
+ string s;
+ while (!in.eof())
+ {
+ getline(in, s);
+ AllMirrors.push_back(s);
+ }
+ SelectNextMirror();
return true;
}
@@ -275,7 +291,7 @@ bool MirrorMethod::Fetch(FetchItem *Itm)
}
if(Mirror.empty()) {
- if(!SelectMirror()) {
+ if(!InitMirrors()) {
// no valid mirror selected, something went wrong downloading
// from the master mirror site most likely and there is
// no old mirror file availalbe
diff --git a/methods/mirror.h b/methods/mirror.h
index ed817806b..1b506dc87 100644
--- a/methods/mirror.h
+++ b/methods/mirror.h
@@ -26,6 +26,7 @@ class MirrorMethod : public HttpMethod
// we simply transform between BaseUri and Mirror
string BaseUri; // the original mirror://... url
string Mirror; // the selected mirror uri (http://...)
+ vector<string> AllMirrors; // all available mirrors
string MirrorFile; // the file that contains the list of mirrors
bool DownloadedMirrorFile; // already downloaded this session
@@ -34,7 +35,8 @@ class MirrorMethod : public HttpMethod
protected:
bool DownloadMirrorFile(string uri);
string GetMirrorFileName(string uri);
- bool SelectMirror();
+ bool InitMirrors();
+ bool SelectNextMirror();
bool Clean(string dir);
// we need to overwrite those to transform the url back