summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <mvo@ubuntu.com>2014-05-22 08:55:14 +0200
committerMichael Vogt <mvo@ubuntu.com>2014-05-22 08:55:14 +0200
commita01695e82cfbfa6e296c66879c1e41802d3ea413 (patch)
tree35e7c3453f4ff3031b8c557ee7080e700179d5c3
parent8194f97685b4af2bbf0cdbdc88fe5332ad147353 (diff)
WIP make connect use GetSrvRecords
-rw-r--r--apt-pkg/contrib/srvrec.cc14
-rw-r--r--apt-pkg/contrib/srvrec.h6
-rw-r--r--methods/connect.cc13
-rw-r--r--methods/makefile8
4 files changed, 37 insertions, 4 deletions
diff --git a/apt-pkg/contrib/srvrec.cc b/apt-pkg/contrib/srvrec.cc
index 352a56970..c473192fc 100644
--- a/apt-pkg/contrib/srvrec.cc
+++ b/apt-pkg/contrib/srvrec.cc
@@ -8,15 +8,29 @@
/*}}}*/
#include <config.h>
+#include <netdb.h>
+
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
#include <algorithm>
+#include <apt-pkg/strutl.h>
#include <apt-pkg/error.h>
#include "srvrec.h"
+bool GetSrvRecords(std::string host, int port, std::vector<SrvRec> &Result)
+{
+ std::string target;
+ struct servent *s_ent = getservbyport(htons(port), "tcp");
+ if (s_ent == NULL)
+ return false;
+
+ strprintf(target, "_%s._tcp.%s", s_ent->s_name, host.c_str());
+ return GetSrvRecords(target, Result);
+}
+
bool GetSrvRecords(std::string name, std::vector<SrvRec> &Result)
{
unsigned char answer[PACKETSZ];
diff --git a/apt-pkg/contrib/srvrec.h b/apt-pkg/contrib/srvrec.h
index 78d238c46..fd71e697f 100644
--- a/apt-pkg/contrib/srvrec.h
+++ b/apt-pkg/contrib/srvrec.h
@@ -26,6 +26,12 @@ class SrvRec
}
};
+/** \brief Get SRV records from host/port (builds the query string internally)
+ */
bool GetSrvRecords(std::string name, std::vector<SrvRec> &Result);
+/** \brief Get SRV records for query string like: _http._tcp.example.com
+ */
+bool GetSrvRecords(std::string host, int port, std::vector<SrvRec> &Result);
+
#endif
diff --git a/methods/connect.cc b/methods/connect.cc
index e2cbf4f5c..a90bc8084 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;
@@ -151,6 +155,15 @@ 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
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)