]> git.saurik.com Git - apt.git/commitdiff
WIP make connect use GetSrvRecords
authorMichael Vogt <mvo@ubuntu.com>
Thu, 22 May 2014 06:55:14 +0000 (08:55 +0200)
committerMichael Vogt <mvo@ubuntu.com>
Thu, 22 May 2014 06:55:14 +0000 (08:55 +0200)
apt-pkg/contrib/srvrec.cc
apt-pkg/contrib/srvrec.h
methods/connect.cc
methods/makefile

index 352a569704c23a5d41eeb5be8e3fc4b5d68f21d8..c473192fc8a8a7dfd42fc920337b2139993378d9 100644 (file)
@@ -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];
index 78d238c46784443e277e221fde25aaaf4e99e1b4..fd71e697f1eff67605d217176a463c55d9686aa9 100644 (file)
@@ -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
index e2cbf4f5ce2977c65e210adbc7499cc00db52696..a90bc8084102d61c841aa31134d0007451e82d6d 100644 (file)
@@ -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
index 6b77812943cbe47a0d807eb9ce070829a7026e6d..868c52a402d3cb85cdf361afcef21c1663eaf248 100644 (file)
@@ -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)