소스 검색

* apt-pkg/deb/dpkgpm.cc:
- add missing include
* methods/mirror.{cc,h}:
- add SelectNextMirror() and InitMirrors() functions
- read all mirrors into the AllMirrors vector

Michael Vogt 16 년 전
부모
커밋
96db74ce38
3개의 변경된 파일27개의 추가작업 그리고 8개의 파일을 삭제
  1. 1 0
      apt-pkg/deb/dpkgpm.cc
  2. 23 7
      methods/mirror.cc
  3. 3 1
      methods/mirror.h

+ 1 - 0
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>

+ 23 - 7
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

+ 3 - 1
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