summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <mvo@ubuntu.com>2014-05-23 16:46:32 +0200
committerMichael Vogt <mvo@ubuntu.com>2014-05-23 16:46:32 +0200
commitcc4800145b408de0b4afef88f4489a541024e75a (patch)
tree7fe4f1633e7cb74d0aeb3335e9dd04110d560811
parenta01695e82cfbfa6e296c66879c1e41802d3ea413 (diff)
when using srv records, use the next server if one fails to connect
-rw-r--r--apt-pkg/makefile2
-rw-r--r--methods/connect.cc57
2 files changed, 41 insertions, 18 deletions
diff --git a/apt-pkg/makefile b/apt-pkg/makefile
index 5603b51ed..45dcddfe3 100644
--- a/apt-pkg/makefile
+++ b/apt-pkg/makefile
@@ -15,7 +15,7 @@ include ../buildlib/libversion.mak
LIBRARY=apt-pkg
MAJOR=$(LIBAPTPKG_MAJOR)
MINOR=$(LIBAPTPKG_RELEASE)
-SLIBS=$(PTHREADLIB) $(INTLLIBS) -lutil -ldl
+SLIBS=$(PTHREADLIB) $(INTLLIBS) -lutil -ldl -lresolv
ifeq ($(HAVE_ZLIB),yes)
SLIBS+= -lz
endif
diff --git a/methods/connect.cc b/methods/connect.cc
index a90bc8084..8de4ad747 100644
--- a/methods/connect.cc
+++ b/methods/connect.cc
@@ -134,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)
@@ -155,15 +152,6 @@ bool Connect(std::string Host,int Port,const char *Service,int DefPort,int &Fd,
sensible */
if (LastHost != Host || LastPort != Port)
{
- // FIXME: NOT READY FOR MERGING IN THIS FORM
- // we need to first check SRV, then round-robin DNS
- // this code will only ever use the first srv record
-
- // FIXME: ensure we cycle over the SrvRecords first before
- // we do round-robin IP
- if(GetSrvRecords(Host, Port, SrvRecords) && SrvRecords.size() > 0)
- Host = SrvRecords[0].target;
-
Owner->Status(_("Connecting to %s"),Host.c_str());
// Free the old address structure
@@ -271,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;
+}