diff options
author | Michael Vogt <mvo@ubuntu.com> | 2014-05-22 08:55:14 +0200 |
---|---|---|
committer | Michael Vogt <mvo@ubuntu.com> | 2014-05-22 08:55:14 +0200 |
commit | a01695e82cfbfa6e296c66879c1e41802d3ea413 (patch) | |
tree | 35e7c3453f4ff3031b8c557ee7080e700179d5c3 | |
parent | 8194f97685b4af2bbf0cdbdc88fe5332ad147353 (diff) |
WIP make connect use GetSrvRecords
-rw-r--r-- | apt-pkg/contrib/srvrec.cc | 14 | ||||
-rw-r--r-- | apt-pkg/contrib/srvrec.h | 6 | ||||
-rw-r--r-- | methods/connect.cc | 13 | ||||
-rw-r--r-- | methods/makefile | 8 |
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) |