summaryrefslogtreecommitdiff
path: root/methods
diff options
context:
space:
mode:
Diffstat (limited to 'methods')
-rw-r--r--methods/connect.cc52
-rw-r--r--methods/makefile8
2 files changed, 48 insertions, 12 deletions
diff --git a/methods/connect.cc b/methods/connect.cc
index e2cbf4f5c..8de4ad747 100644
--- a/methods/connect.cc
+++ b/methods/connect.cc
@@ -18,6 +18,7 @@
#include <apt-pkg/strutl.h>
#include <apt-pkg/acquire-method.h>
#include <apt-pkg/configuration.h>
+#include <apt-pkg/srvrec.h>
#include <stdio.h>
#include <errno.h>
@@ -43,6 +44,9 @@ static int LastPort = 0;
static struct addrinfo *LastHostAddr = 0;
static struct addrinfo *LastUsed = 0;
+static std::vector<SrvRec> SrvRecords;
+static int LastSrvRecord = 0;
+
// Set of IP/hostnames that we timed out before or couldn't resolve
static std::set<std::string> bad_addr;
@@ -130,15 +134,12 @@ static bool DoConnect(struct addrinfo *Addr,std::string Host,
return true;
}
/*}}}*/
-// Connect - Connect to a server /*{{{*/
-// ---------------------------------------------------------------------
-/* Performs a connection to the server */
-bool Connect(std::string Host,int Port,const char *Service,int DefPort,int &Fd,
- unsigned long TimeOut,pkgAcqMethod *Owner)
-{
- if (_error->PendingError() == true)
- return false;
+// Connect to a given Hostname
+bool ConnectAfterSrvRecords(std::string Host,int Port,const char *Service,
+ int DefPort,int &Fd,
+ unsigned long TimeOut,pkgAcqMethod *Owner)
+{
// Convert the port name/number
char ServStr[300];
if (Port != 0)
@@ -258,3 +259,38 @@ bool Connect(std::string Host,int Port,const char *Service,int DefPort,int &Fd,
return _error->Error(_("Unable to connect to %s:%s:"),Host.c_str(),ServStr);
}
/*}}}*/
+// Connect - Connect to a server /*{{{*/
+// ---------------------------------------------------------------------
+/* Performs a connection to the server */
+bool Connect(std::string Host,int Port,const char *Service,
+ int DefPort,int &Fd,
+ unsigned long TimeOut,pkgAcqMethod *Owner)
+{
+#if 0
+ if (_error->PendingError() == true)
+ return false;
+#endif
+
+ if(LastHost != Host || LastPort != Port)
+ {
+ SrvRecords.clear();
+ bool res = GetSrvRecords(Host, DefPort, SrvRecords);
+ }
+ if(SrvRecords.size() == 0)
+ return ConnectAfterSrvRecords(Host, Port, Service, DefPort, Fd,
+ TimeOut, Owner);
+
+ bool connected = false;
+ while(SrvRecords.size() > 0)
+ {
+ Host = SrvRecords[0].target;
+ connected = ConnectAfterSrvRecords(Host, Port, Service, DefPort, Fd,
+ TimeOut, Owner);
+ if(connected == true)
+ return true;
+
+ // we couldn't connect to this one, use the next
+ SrvRecords.erase(SrvRecords.begin());
+ }
+ return false;
+}
diff --git a/methods/makefile b/methods/makefile
index 6b7781294..868c52a40 100644
--- a/methods/makefile
+++ b/methods/makefile
@@ -46,21 +46,21 @@ include $(PROGRAM_H)
# The http method
PROGRAM=http
-SLIBS = -lapt-pkg $(SOCKETLIBS) $(INTLLIBS)
+SLIBS = -lapt-pkg $(SOCKETLIBS) $(INTLLIBS) -lresolv
LIB_MAKES = apt-pkg/makefile
SOURCE = http.cc http_main.cc rfc2553emu.cc connect.cc server.cc
include $(PROGRAM_H)
# The https method
PROGRAM=https
-SLIBS = -lapt-pkg -lcurl $(INTLLIBS)
+SLIBS = -lapt-pkg -lcurl $(INTLLIBS) -lresolv
LIB_MAKES = apt-pkg/makefile
SOURCE = https.cc server.cc
include $(PROGRAM_H)
# The ftp method
PROGRAM=ftp
-SLIBS = -lapt-pkg $(SOCKETLIBS) $(INTLLIBS)
+SLIBS = -lapt-pkg $(SOCKETLIBS) $(INTLLIBS) -lresolv
LIB_MAKES = apt-pkg/makefile
SOURCE = ftp.cc rfc2553emu.cc connect.cc
include $(PROGRAM_H)
@@ -81,7 +81,7 @@ include $(PROGRAM_H)
# The mirror method
PROGRAM=mirror
-SLIBS = -lapt-pkg $(SOCKETLIBS)
+SLIBS = -lapt-pkg $(SOCKETLIBS) -lresolv
LIB_MAKES = apt-pkg/makefile
SOURCE = mirror.cc http.cc rfc2553emu.cc connect.cc server.cc
include $(PROGRAM_H)