Просмотр исходного кода

WIP make connect use GetSrvRecords

Michael Vogt лет назад: 12
Родитель
Сommit
a01695e82c
4 измененных файлов с 37 добавлено и 4 удалено
  1. 14 0
      apt-pkg/contrib/srvrec.cc
  2. 6 0
      apt-pkg/contrib/srvrec.h
  3. 13 0
      methods/connect.cc
  4. 4 4
      methods/makefile

+ 14 - 0
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];

+ 6 - 0
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

+ 13 - 0
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

+ 4 - 4
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)